为什么在达到最佳样本量之前停止 A/B 测试是错误的?

机器算法验证 假设检验 统计学意义 偏见 测试 最佳停止
2022-03-09 20:34:00

我负责在我的公司展示 A/B 测试(在网站变体上运行)的结果。我们运行测试一个月,然后定期检查 p 值,直到达到显着性(或者如果长时间运行测试后未达到显着性则放弃),我现在发现这是一种错误的做法

我现在想停止这种做法,但要做到这一点,我想了解为什么这是错误的。了解效应量、样本量 (N)、α 显着性标准 (α) 和统计功效,或选择或隐含的β (β) 在数学上是相关的。但是,当我们在达到所需样本量之前停止测试时,究竟会发生什么变化?

我在这里阅读了一些帖子(即thisthisthis),它们告诉我我的估计会有偏差,并且我的类型 1 错误率急剧增加。但这是怎么发生的?我正在寻找一个数学解释,可以清楚地显示样本量对结果的影响。我想这与我上面提到的因素之间的关系有关,但我无法找出确切的公式并自己计算出来。

例如,过早停止测试会增加类型 1 错误率。好的。但为什么?增加 1 类错误率会发生什么?我在这里缺少直觉。

请帮忙。

2个回答

如果原假设为真,那么人们通常期望 p 值非常高。这不是真的。如果原假设为真,则 p 是均匀分布的随机变量。意思是,有时会随机低于 0.05。如果您查看许多不同的子样本,有时 p 值会低于 0.05。

为了更容易掌握,这里有一个小的模拟R

这将投掷一枚硬币 10,000 次,我们知道,这是一枚公平的硬币:

set.seed(1)
n=10000
toss <- sample(1:2, n, TRUE)

从第 5 次投掷开始,这将在每次投掷后执行公平性二项式检验并保存 p 值:

p.values <- numeric(n)
for (i in 5:n){
     p.values[i] <- binom.test(table(toss[1:i]))$p.value
}

这将一个接一个地绘制 p 值:

plot(p.values, type="l")
abline(h=0.05)

在此处输入图像描述

如您所见,p 值有几次跌至 0.05 以下,只是为了恢复,最终远高于 p=0.05。如果我们在 p 是“显着”的任何时候停止试验,我们就会得出错误的结论。有人可能会争辩说“我们有大约 4000 多个试验 iid 的样本,并且 p 低于 0.05。我们当然可以停止进一步采样”。您检查 p 值的频率越高,您就越有可能在随机下降时进行检查。在这种情况下,我们在H0并且知道,那H0是真的。

(为了完全开放,我已经为数字生成器尝试了不止一个种子,直到它像这个例子一样清晰,但这对于教育目的是公平的。如果你已经R安装并运行,你可以轻松地玩数字.)

A/B 测试简单地重复测试具有固定类型 1 错误的相同数据(α) 水平存在根本缺陷。这至少有两个原因。首先,重复测试是相关的,但测试是独立进行的。二、固定α不考虑导致类型 1 错误膨胀的多次传导测试。

要查看第一个,假设在每次新观察时您都会进行新测试。显然,任何两个后续 p 值都是相关的,因为n1两次测试之间的情况没有变化。因此,我们在@Bernhard 的图中看到了一个趋势,证明了 p 值的这种相关性。

要查看第二个,我们注意到即使测试是独立的,p 值低于α随着测试次数的增加t

P(A)=1(1α)t,
在哪里A是错误拒绝原假设的事件。所以至少有一个阳性测试结果的概率是相反的1当您反复进行 a/b 测试时。如果你只是在第一个阳性结果后停止,你只会证明这个公式的正确性。换句话说,即使原假设为真,您最终也会拒绝它。因此,a/b 测试是在没有效果的情况下找到效果的最终方法。

由于在这种情况下,相关性和多重检验同时成立,检验的 p 值t+1取决于 p 值t. 所以如果你最终达到p<α,您很可能会在该地区停留一段时间。您还可以在 @Bernhard 的 2500 到 3500 和 4000 到 5000 区域的图中看到这一点。

多次测试本身是合法的,但是针对固定的测试α不是。有许多程序同时处理多重测试程序和相关测试。一类测试校正称为全族错误率控制。他们所做的是确保

P(A)α.

可以说最著名的调整(由于其简单性)是 Bonferroni。我们在这里设置

αadj=α/t,
很容易证明P(A)α如果独立测试的数量很大。如果测试是相关的,它可能是保守的,P(A)<α. 所以你可以做的最简单的调整就是划分你的 alpha 水平0.05通过您已经进行的测试次数。

如果我们将 Bonferroni 应用到 @Bernhard 的模拟中,然后放大到(0,0.1)y轴上的间隔,我们找到下面的图。为了清楚起见,我假设我们不会在每次抛硬币(试验)后进行测试,而只是每百分之一。黑色虚线是标准α=0.05切断,红色虚线是 Bonferroni 调整。

在此处输入图像描述

正如我们所看到的,调整非常有效,并证明了我们必须改变 p 值以控制全族错误率是多么激进。具体来说,我们现在不再发现任何重要的测试,因为它应该是因为@Berhard 的零假设是正确的。

完成此操作后,我们注意到由于相关测试,Bonferroni 在这种情况下非常保守。有更好的测试在这种情况下会更有用。P(A)α,如置换检验此外,关于测试还有很多要说的,而不仅仅是参考 Bonferroni(例如查找错误发现率和相关的贝叶斯技术)。然而,这用最少的数学回答了你的问题。


这是代码:

set.seed(1)
n=10000
toss <- sample(1:2, n, TRUE)

p.values <- numeric(n)
for (i in 5:n){
  p.values[i] <- binom.test(table(toss[1:i]))$p.value
}
p.values = p.values[-(1:6)]
plot(p.values[seq(1, length(p.values), 100)], type="l", ylim=c(0,0.1),ylab='p-values')
abline(h=0.05, lty="dashed")
abline(v=0)
abline(h=0)
curve(0.05/x,add=TRUE, col="red", lty="dashed")