为什么在对 Holm 和 Bonferroni 方法使用 p.adjust 时得到相同的结果?

Why am I getting the same result when using p.adjust for the Holm and Bonferroni methods?

我已经 运行 进行了多次回归分析,我正在尝试查看在进行多重比较调整后是否有任何重要发现成立。我知道 Bonferroni 调整比 Holm 调整更保守,所以我希望输出会有所不同,但事实并非如此。其中一个值略有不同,但没有我预期的那么大,因为这些测试中的一个应该不如另一个保守。我尝试了另一种校正方法,得到了类似的结果。我的语法有问题还是这是正常结果?

p.vect <- c(.003125, .008947)
p.adjust(p.vect, method = "bonferroni", n=80)
[1] 0.25000 0.71576

p.adjust(p.vect, method = "holm", n=80)
[1] 0.250000 0.706813

p.adjust(p.vect, method = "hochberg", n = 80)
[1] 0.250000 0.706813

Holm 和 Hochberg 在 length(p)==2 方面彼此没有区别。

鉴于 lplength(na.omit(p))(在这种情况下等于 2),并且 p 是概率向量,这里是 method=="holm" 的代码:

i <- seq_len(lp)   ## (1,2)
o <- order(p)      ## (1,2)
ro <- order(o)     ## (1,2) 
pmin(1, cummax((n + 1L - i) * p[o]))[ro]  ## c(80,79)*p

method=="hochberg" 的代码:

i <- lp:1L                        ## (2,1) 
o <- order(p, decreasing = TRUE)  ## (2,1)
ro <- order(o)                    ## (2,1) 
pmin(1, cummin((n + 1L - i) * p[o]))[ro]  ## c(80,79)*p[c(2,1)][c(2,1)]

如果您逐步查看详细信息,您可以看到他们如何为您的案例提供相同的答案。 (Holm 在调整概率的排序向量上使用 cummax(),Hochberg 在反向排序向量上使用 cummin(),但在这种情况下这些都没有改变任何东西。)

Bonferroni pmin(1, n*p)。在这种情况下,唯一的区别是第二个元素的因子 80/79(Hochberg 和 Holm 乘以 (n+1-i) = c(80,79),Bonferroni 乘以 n=79。)

您可以通过单独输入 p.adjust 或更漂亮的形式 here

来打印代码