如果样本量很大,是否仍然需要校正多重比较/测试?

机器算法验证 假设检验 统计学意义 采样 多重比较 大数据
2022-03-27 00:41:27

我今天和一位同事讨论了关于多次测试的更正问题。我们计划进行大量测试(粗略估计可能有数百个),因此我提出了多项测试以及我们应该如何进行测试。具体来说,各种结果是相关的(不是独立的),因此这不符合 Bonferroni、Benjamini-Hochberg 或任何调整方法的假设。他们的建议是我们不必担心,因为每个测试的样本量都足够大(我们正在查看最小值 n=100,但通常 n=1000+)。这是我第一次听说这种方法,因此对此感到有些惊讶。根据我的研究并试图通过自己的思考,也许他们的逻辑是随着 n 变大,

我的问题最终是,我的同事是否正确地建议大样本量足以处理多个测试,如果是,我对它与抽样误差相关的推理是否准确?

3个回答

想想买数百个公平的骰子。但是,您不知道它们是,因此通过多次投掷(1000+)来测试每个的期望值是否为 3.5 点。其中之一必须是“最好的”,如果你不考虑多次测试,几乎可以肯定在统计上是显着的。

回想一下,拒绝真空值的概率(实际上,由于渐近近似和有限样本大小失真等原因,这可能不完全正确)取决于样本大小!

然后,您可能会错误地得出结论(或至少不正确,因为它并不比其他游戏更好,但也不比其他游戏差),这是您应该带入下一个棋盘游戏的游戏。

至于实际意义,这确实提供了一个线索,因为当你经常抛掷时,“获胜”的人很可能以平均得分略高于 3.5 的情况下获胜。

这是一个插图:

set.seed(1)
dice <- 100
throws <- 1000

tests <- apply(replicate(dice, sample(1:6, throws, 
               replace=T)), 2, 
               function(x) t.test(x, alternative="greater", 
 mu=3.5)) 
# right-tailed test, to look for "better" dice (assuming a 
# game where many points are good, nothing hinges on this)

plot(1:dice, sort(unlist(lapply(1:dice, function(i) 
   tests[[i]]$p.value))))
abline(h=0.05, col="blue")     # significance threshold not 
                       # accounting for multiple testing
abline(h=0.05/dice, col="red") # Bonferroni threshold

max(unlist(lapply(1:dice, function(i) tests[[i]]$estimate))) 
# the sample average of the "winner"

在此处输入图像描述

因此,在 Bonferroni 校正后,我们在此模拟运行中看到一些“显着”优于 0.05 水平的骰子,但没有一个骰子。然而,“获胜”的人(代码的最后一行)的平均值为 3.63,实际上,这与真正的期望值 3.5 相差不远。

我们还可以运行一个小蒙特卡洛练习——即多次上述练习,以平均可能来自 的任何“不常见”样本set.seed(1)然后,我们还可以说明改变投掷次数的效果。

# Monte Carlo, with several runs of the experiment:

reps <- 500

mc.func.throws <- function(throws){
  tests <- apply(replicate(dice, sample(1:6, throws, 
                 replace=T)), 2, 
                 function(x) t.test(x, alternative="greater", 
                      mu=3.5)) 
  winning.average <- max(unlist(lapply(1:dice, function(i) 
  tests[[i]]$estimate))) # the sample average of the "winner"
  significant.pvalues <- mean(unlist(lapply(1:dice, 
      function(i) tests[[i]]$p.value)) < 0.05)
  return(list(winning.average, significant.pvalues))
}

diff.throws <- function(throws){
  mc.study <- replicate(reps, mc.func.throws(throws))
  
  average.winning.average <- mean(unlist(mc.study[1,]))
  mean.significant.results <- mean(unlist(mc.study[2,]))
  return(list(average.winning.average, 
 mean.significant.results))
}

throws <- c(10, 50, 100, 500, 1000, 10000)

lapply(throws, diff.throws)

结果:

> unlist(lapply(mc.throws, `[[`, 1))
[1] 4.809200 4.108400 3.927120 3.692292 3.635224 3.542961

> unlist(lapply(mc.throws, `[[`, 2))
[1] 0.04992 0.05134 0.05012 0.04964 0.05006 0.05040

因此,正如预测的那样,统计显着结果的比例与投掷次数无关(所有小于 0.05值比例都接近 0.05),而实际意义——即平均点数的距离“最好的”一到 3.5 - 投掷次数减少。p

理解这一点的一个简单方法是根据效应大小、类型 1 错误、类型 2 错误和功率。

假设您正在查看相关性,并且您有个数据点。N

  • 您的影响大小是相关系数r
  • 您的第 1 类错误率是得出结论有效果的概率,而实际上没有效果我们通常使用,这意味着当 p 值为时,我们会得出结论(拒绝原假设) 。当您进行多项测试时,您通常会针对多重比较进行调整,以将 Type 1 错误率保持在αr0r=0α=.05p<.050.05
  • 您的类型 2 错误率是在确实存在影响时无法得出结论的概率。你的力量正好与此相反,β1β

现在,不同的样本量会发生什么?

这是来自real-statistic.com的关键值表:

关注第三列,其中每行中的值显示,对于每个样本大小(这些行实际上显示自由度,这只是),相关性需要多强才能显着, α=0.05N2rp<.05

  • (df ) 时,是显着的。N=12=10r0.57
  • (df ) 时,是显着的。N=102=100r0.19
  • (df ) 时,是显着的。N=1002=1000r0.06

至关重要的是,类型 1 错误率在每种情况下都是相同的,α=0.05 相反,增加样本量可以检测更小的影响,从而降低类型 2 错误率/提高功率(您不太可能错过一个小但非零的影响)。

最后,针对多重比较进行调整仅意味着在您确定有影响之前需要多大。换句话说,要降低你的类型 1 错误率,你必须增加你的类型 2 错误率。幸运的是,收集大量数据意味着您的第 2 类错误率很低,因此您可以更好地负担得起。r

所以,把它放在一起:

  • 更多数据减少了类型 2 错误,但保持类型 1 错误不变,α=0.05
  • 进行多重比较会增加第一类错误
  • 为了抵消这种情况,您可以通过使您的决定更加保守来调整多重比较。这会降低类型 1 错误率,但会增加类型 2 错误率。

他们的建议是我们不必担心[多重测试],因为每个测试的样本量将足够大(我们正在查看最小值 n=100,但通常 n=1000+)。

在这种情况下,即使理论上是错误的,您的同事在实践中也是正确的。

您的许多测试整齐地分为两类:是正确的(或非常接近)或是非常不合适的。不太感兴趣,而是对接受/拒绝的总体比例不太感兴趣,或者您不太担心偶尔的误报。在这种情况下,调整或不调整 p 值几乎没有什么区别(我仍然不明白为什么不应该这样做......)。H0H0H0

例如,您有一袋硬币,有些是合法的,有些两面相同。如果您将每个硬币翻转一百次左右,无论您是否调整它,您几乎都可以通过查看 pvalue 来发现有问题的硬币。如果假阴性的“成本”远高于假阳性,您可能只使用名​​义 p 值。

(当然,我并不是说您的同事是对的,我只是在想象一个可以给他们一些理由的场景)。