7

当我使用 R 的 p.adjust 函数计算错误发现率时,我似乎得到了不一致的结果。根据文档中引用的论文 ,调整后的 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 对可以解释这两个结果的数据做了什么?

4

1 回答 1

7

原因是 FDR 计算确保 FDR 永远不会随着 p 值的减小而增加。这是因为您始终可以选择为拒绝规则设置更高的阈值,如果更高的阈值会让您获得更低的 FDR。

在您的情况下,您的第二个假设的 p 值为 ,0.0006FDR 为0.010971585,但第三个假设的 p 值较大,FDR 较小。0.009120228如果您可以通过将 p 值阈值设置为 来实现 FDR 0.0019,那么就没有理由为了获得更高的 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 论文中看到这一点,包括第 293 页的过程定义,其中指出(强调我的):

令 kP(i) <= i / mq* 的最大 i;

然后拒绝所有 H_(i) i = 1, 2, ..., k

于 2015-05-01T18:45:48.877 回答