当我使用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页的过程定义中,该过程指出(强调我的意思):

10-02 01:29