当我使用R的p.adjust函数计算错误发现率时,似乎得到不一致的结果。根据documentation中引用的论文
调整后的p值应按以下方式计算:
adjusted_p_at_index_i= p_at_index_i*(total_number_of_tests/i).
现在,当我运行
p.adjust(c(0.0001, 0.0004, 0.0019),"fdr")
时,我得到了预期的结果c(0.0003, 0.0006, 0.0019)
但是当我运行
p.adjust(c(0.517479039, 0.003657195, 0.006080152),"fdr")
时我得到了c(0.517479039, 0.009120228, 0.009120228)
而不是结果,我计算:
c(0.517479039, 0.010971585, 0.009120228)
R对可以解释这两个结果的数据做了什么?
最佳答案
原因是FDR计算可确保FDR不会随着p值的减小而增加。这是因为如果该较高的阈值会使您获得较低的FDR,则始终可以选择为拒绝规则设置较高的阈值。
在您的情况下,第二个假设的p值为0.0006
,FDR为0.010971585
,但是第三个假设的p值较大,FDR较小。如果您可以通过将p值阈值设置为0.009120228
来实现0.0019
的FDR,则永远没有理由仅设置较低的阈值以获得更高的FDR。
您可以通过键入p.adjust
在代码中看到此内容:
...
}, BH = {
i <- lp:1L
o <- order(p, decreasing = TRUE)
ro <- order(o)
pmin(1, cummin(n/i * p[o]))[ro]
cummin
函数采用向量的累积最小值,并按p
的顺序向后移动。您可以在链接到的Benjamini-Hochberg paper中看到这一点,包括在第293页的过程定义中,该过程指出(强调我的意思):