我试图了解在比较多个假设检验时如何正确应用错误发现率。虽然我在这里使用 R 代码,但我的怀疑是关于程序,而不是编程。
我在 R 中建立了一个玩具模型,该模型由 10000 个假设(例如基因表达)组成,由两个 5 个样本群体组成:
set.seed(620)
x = matrix(rnorm(10000*5),nrow=10000)
y = matrix(rnorm(10000*5),nrow=10000)
有了这些数据集x
,y
我知道所有的零假设都是正确的。
我现在评估 p 值:
p = sapply(1:10000, function(i) t.test(x[i,],y[i,])$p.val)
正如预期的那样,低于 0.05(或任何其他数字)的 p 值的数量为 453,即预期的假阳性率约为 5%。
接下来我使用错误发现率调整调整 p 值并估计 q 值:
q = p.adjust(p, method = "fdr")
现在,如果我理解正确,选择 aq 值为 0.05 的假设应该得到 5% 的错误发现(误报数除以发现数)。
q < 0.05 的假设数为 0。我认为这可能是因为,由于所有原假设都是正确的,所以无论我如何选择 q,错误的发现将始终是 100% 的发现(这也是我如何向自己解释大多数 q 值接近 1)。
接下来,我将 y 的最后一百行替换为均值为 3 的正态分布采样的数字,并估计 p 和 q 值:
y[9901:10000,] = rnorm(500, mean=3)
p = sapply(1:10000, function(i) t.test(x[i,],y[i,])$p.val)
q = p.adjust(p, method = "fdr")
在这些修改之后,p 值 < 0.05 的数量增加到 544,并且检测到应该拒绝的 100 个假设中的 98 个。
然而,q 值 < 0.05 的假设数量非常少:只有 9 个。它们都是应该被拒绝的假设,所以在我看来,错误发现率一直保持在 0 而不是 0.05。
例如,如果我接受 q-value = 0.5 的假设,我最终会接受 95 个假设。在这 95 个中,67 个是真实的发现,28 个是错误的发现。因此,FDR 是 28/95 = 0.3,而不是我预期的 0.5。
有什么我没有正确理解的吗?为什么我得到的结果与我理论上预期的结果如此不同?