当我使用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对可以解释这两种结果的数据做了什么?
答案 0 :(得分:5)
原因是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页的过程定义,其中说明了(强调我的):
让k 成为最大的i P(i)&lt; = i / m q *;
然后拒绝所有H_(i)i = 1,2,...,k