FDR 调整的 p 值中的过度代表值

机器算法验证 r p 值 错误发现率 调整
2022-04-14 02:22:13

我有一个需要校正多重比较的 p 值向量;基于阅读Noble (2009),我正在尝试应用基于 Benjamini-Hochberg FDR 的校正。

我的向量(为便于可视化按升序排序)是:

ps <- c(0.019, 0.022, 0.023, 0.023, 0.025, 0.025, 0.027, 0.028, 0.029, 0.030, 0.030, 0.030, 0.031, 0.033, 0.034, 0.035, 0.036, 0.037, 0.037, 0.039, 0.051, 0.060, 0.063 , 0.065, 0.085, 0.110, 0.170, 0.196, 0.241, 0.316, 0.318, 0.325, 0.694)

当我运行 R 命令时

p.adjust(ps, method="BH")

I get the output:
0.06426316 0.06426316 0.06426316 0.06426316 0.06426316 0.06426316 0.06426316 0.06426316 0.06426316 0.06426316 0.06426316 0.06426316 0.06426316 0.06426316 0.06426316 0.06426316 0.06426316 0.06426316 0.06426316 0.06435000 0.08014286 0.08937500 0.08937500 0.08937500 0.11220000 0.13961538 0.20777778 0.23100000 0.27424138 0.33515625 0.33515625 0.33515625 0.69400000

该输出显然具有某些过度代表的值。鉴于它们与小数点后 8 位相同,我认为这不可能是偶然发生的。如果我绘制原始值和调整后的值,它们都遵循相同的地形,但只要原始值具有小斜率,调整后的值就会平稳。

绘图(ps~order(ps))
点(p.adjust(ps,method =“BH”)~order(ps),add = TRUE,col =“red”)

通常,当原始 p 值与次高值的差异 <0.01 时,校正值似乎相同。不过,我不明白为什么;我已经阅读并深入研究了 p.adjust 代码,但想不出什么会导致这种效果。任何见解将不胜感激!

1个回答

这些 q 值没有任何问题。校正 p 值(校正后的 p 值通常称为 q 值)是一个比 Benjamini-Hochberg (BH) 过程更新的概念,其最纯粹的形式仅输出显着性:是或否。要理解为什么你的 q 值看起来像它们的样子,我们需要看看 BH 升压过程是如何工作的。以下步骤改编自 Wasserman 的All of Statistics

  1. 订购您的 p 值p1<p2<<pm.
  2. 定义li=iαm, 在哪里α是您想要的错误发现率。还定义T=max{pi:pi<li},即的最大 p 值。Tpi<li
  3. 成为您的 BH 拒绝阈值。T
  4. 零假设H0ipiT

为了避免必须选择一个 q 值将这个过程颠倒过来并询问将被拒绝的最小是多少?阈值始终是您的 p 值之一,因此作为 FDR函数的接受阈值看起来像一些楼梯: α,αH0iTmα

library(plyr)
ps <- c(0.019, 0.022, 0.023, 0.023, 0.025, 0.025, 0.027, 0.028, 0.029, 0.030, 0.030, 0.030, 0.031, 0.033, 0.034, 0.035, 0.036, 0.037, 0.037, 0.039, 0.051, 0.060, 0.063, 0.065, 0.085, 0.110, 0.170, 0.196, 0.241, 0.316, 0.318, 0.325, 0.694)

# calculate T as function of alpha
BHT <- function(alpha) {
  l <- 1:length(ps)*alpha/length(ps)
  i <- sum(ps < l)
  if (i == 0) return(i)

  ps[i]   # threshold
}

alphas <- seq(0,1,by=.001)
Ts <- aaply(alphas, 1, BHT)
plot(alphas, Ts, type="l")

对于每个阈值,都有一个最小的使其成为新的拒绝阈值。如果我们在上图中为您的不同 p 值添加一些线,您会看到其中许多位于楼梯的同一台阶上:α

plot(alphas, Ts, type="n")
abline(v=ps, col="grey")
lines(alphas, Ts)

这些将在相同的阈值处被拒绝对应于相同的最小α这个是你的 q 值,所以得到重复的 q 值是可以的,而且几乎是不可避免的。α