帮助了解如何正确应用错误发现率调整

机器算法验证 r 假设检验 p 值 错误发现率
2022-03-21 09:55:13

我试图了解在比较多个假设检验时如何正确应用错误发现率。虽然我在这里使用 R 代码,但我的怀疑是关于程序,而不是编程。

我在 R 中建立了一个玩具模型,该模型由 10000 个假设(例如基因表达)组成,由两个 5 个样本群体组成:

set.seed(620)
x = matrix(rnorm(10000*5),nrow=10000)
y = matrix(rnorm(10000*5),nrow=10000)

有了这些数据集xy我知道所有的零假设都是正确的。

我现在评估 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。

有什么我没有正确理解的吗?为什么我得到的结果与我理论上预期的结果如此不同?

1个回答

请注意,Benjamini-Hochberg 将错误发现率控制为小于或等于指定级别,您的所有场景都已满足该级别。

就您所遵循的程序而言,那里没有错误。然而,值得指出的是,对于真实的基因表达数据,使用Storey、John D. 和 Robert Tibshirani 等特定方法可能会获得更好的结果。“全基因组研究的统计意义。” 美国国家科学院院刊 100,没有。16 (2003): 9440-9445。这种特殊方法利用了这样一个事实,即在此类研究中,重要基因的数量几乎不可能为零。