为什么(几乎)我所有的校正(Benjamini-Hochberg)p 值都相等?

机器算法验证 r p 值
2022-04-10 19:25:14

我有以下 p 值:

original_pval <- c(0.8125681, 0.3411442, 0.317672, 0.3464842, 0.2220076, 0.2576271, 
0.1929609, 0.275641, 0.3180882, 0.1962801, 0.219256, 0.1734164)

当我p.adjust在 R 中运行时,除了一个之外,我得到所有数字的相等 p 值:

p.adjust(p = original_pval, "BH")

结果如下:

结果:

0.8125681 0.3779828 0.3779828 0.3779828 0.3779828 0.3779828 0.3779828 0.3779828 0.3779828 0.3779828 0.3779828 0.3779828

如您所见,所有 p 值都相等,除了第一个。为什么会发生这种情况,这是否正常?

如果我尝试手动操作,我会得到不同的结果!(而且我相信我在手动操作时做错了)

original_pval <- sort(original_pval)
corrected <- 0.5 * (1:length(original_pval))/length(original_pval)

0.04166667 0.08333333 0.12500000 0.16666667 0.20833333 0.25000000 0.29166667 0.33333333 0.37500000 0.41666667 0.4580000333 0.50

或者我在手动计算 BH 时可能混淆了一些东西。是我得到公式的地方。

但我的主要问题是使用 Benjamini-Hochberg 后看到许多相等的 p 值是否正常

1个回答

据我了解 p.adjust("BH") 返回可以认为测试显着的最低 alpha(FDR 阈值)。

因此,0.3779828 意味着只有当您接受 0.3779828 或更高的 FDR 时,测试才会显着。在这种情况下,您将有 11/12 的测试被认为是显着的,并且您接受其中 38% 的测试纯属偶然。

类似地,只有当您接受 0.8125681 的错误发现率(非常高)时,您示例中的最高示例才有意义。

ps 我承认我无法用代码重现它,但这是一个开始:

original_pval <- c(0.8125681, 0.3411442, 0.317672, 0.3464842, 0.2220076, 0.2576271, 
0.1929609, 0.275641, 0.3180882, 0.1962801, 0.219256, 0.1734164)

manual_BH = function (pvals ) {
  data.frame(pval = pvals) %>% 
    mutate(BH=p.adjust(pval, "BH")) %>%
    arrange(pval) %>%
    mutate(j = rank(pval), m = n()) %>%
    mutate(BHmanual_base = j/m) %>%
    mutate(BHmanual03 = 0.3 * j / m,
          BHsignif03 = pval <= BHmanual03) %>% 
    mutate(BHmanual04 = 0.4 * j / m,
          BHsignifc04 = pval <= BHmanual04) %>%
    mutate(BHmanual08 = 0.8 * j / m,
          BHsignifc08 = pval <= BHmanual08)
}
manual_BH(original_pval)