Math-01.显著性检验-20.多重比较校正

同一实验中对 $m$ 个假设 分别做显著性检验时,即使每个检验都用 $\alpha=0.05$,至少出现 1 次假阳性 的整体概率会随 $m$ 增大而上升。多重比较校正(multiple comparison correction)控制族系错误率(family-wise error rate,FWER)或错误发现率(false discovery rate,FDR),是 ANOVA 事后比较、全基因组扫描、多基因 DE 分析的必备步骤。

段末注释FWER 为「$m$ 个检验中至少 1 个 I 类错误」的概率;FDR 为被拒绝假设中假阳性所占期望比例。

系列01 总论 | 前置:04 F检验


1. 为什么需要校正(D1)

图 1 多重检验与假阳性膨胀

设 $m$ 个独立检验,每次 I 类错误率 $\alpha$,且 $H_0$ 全为真:

$$
P(\text{至少 1 次假阳性}) = 1 - (1-\alpha)^m
$$

$m$ $\alpha=0.05$ 时族系假阳性概率
1 5%
10 40%
20 64%
100 99.4%

典型场景:ANOVA 显著后的两两 t 检验、RNA-seq 数千基因、酶库多个位点同时筛选。


2. 控制目标:FWER vs FDR(D2)

指标 含义 严格程度 典型方法
FWER $P(\ge 1$ 假阳性$)$ 最严 Bonferroni、Holm、Tukey
FDR 期望假阳性 / 拒绝数 较松,适合探索 Benjamini–Hochberg(BH
per-comparison 单次检验 $\alpha$ 不控制族系 无校正(易膨胀)

选型直觉

  • 确认性实验、少量比较 → FWER(Bonferroni / Holm)
  • 高通量筛选、可接受少量假阳性 → FDR(BH)

3. 常用校正方法(D3–D4)

图 2 Bonferroni 与 BH 流程

3.1 Bonferroni(FWER)

将单次显著性水平改为:

$$
\alpha’ = \frac{\alpha}{m}
$$

或等价地,调整 p 值:$p_i^{\mathrm{adj}} = \min(m \cdot p_i,, 1)$。
保守:假设检验独立时控制 FWER;$m$ 大时功效低。

3.2 Holm–Bonferroni(逐步下降,FWER)

  1. 将 $p_{(1)} \le p_{(2)} \le \cdots \le p_{(m)}$ 排序
  2. 找最小 $k$ 使 $p_{(k)} > \alpha / (m-k+1)$
  3. 拒绝 $p_{(1)},\ldots,p_{(k-1)}$

比 Bonferroni 功效更高,仍控制 FWER。

3.3 Benjamini–Hochberg(FDR)

  1. 排序 $p_{(1)} \le \cdots \le p_{(m)}$
  2. 找最大 $k$ 使 $p_{(k)} \le \dfrac{k}{m}\alpha$
  3. 拒绝前 $k$ 个假设

独立或正相关 p 值下控制 FDR $\le \alpha$。

3.4 ANOVA 事后:Tukey HSD

04 F 检验 ANOVA 显著后,Tukey 诚实显著差异(Honestly Significant Difference,HSD)在所有两两比较上控制 FWER,优于未校正的逐对 t。


4. 方法对比(D5–D6)

方法 控制 功效 适用
无校正 最高 仅 1 次预设比较
Bonferroni FWER $m$ 小、确认性
Holm FWER 通用 FWER
BH FDR 较高 RNA-seq、组学
Tukey HSD FWER(两两) 专为 ANOVA 多组均值事后

依赖结构:检验高度相关时 Bonferroni 更保守;BH 在正相关下仍有效。


5. 适用场景(D7)

图 3 适用场景

场景 推荐
ANOVA 后 3+ 组两两比较 Tukey HSD
预设 $m$ 个假设($m<20$) Holm 或 Bonferroni
RNA-seq / 蛋白组 DE BH FDR(如 q=0.05)
全库酶突变多位点筛选 BH 或 Bonferroni(视确认性)
单次 primary endpoint 需族系校正

6. 局限与误用(D8)

图 4 局限与误用

误用 后果
扫 $m$ 个基因不校正 大量假阳性
ANOVA 显著后逐对 t 不校正 假阳性膨胀
$m$ 极大仍用 Bonferroni 几乎无拒绝(功效过低)
把 FDR 当 FWER 仍会有一定比例假阳性
数据窥探后只报显著 p-hacking
忽略检验间相关 方法选择不当

报告规范:说明比较次数 $m$、校正方法、调整后 p 或 q 值。


7. 解读(D9–D10)

输出 含义
$p_{\mathrm{adj}}$(Bonferroni/Holm) 调整后仍 $< \alpha$ → 在 FWER 意义下显著
q 值(FDR) 该假设 FDR 的上界;$q<0.05$ 常用作阈值
拒绝数 BH 下期望假阳性 $\le \alpha \times \text{拒绝数}$

8. 示例代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
import numpy as np
from scipy import stats
from statsmodels.stats.multitest import multipletests
from statsmodels.stats.multicomp import pairwise_tukeyhsd

# ── 模拟 m 个独立 t 检验 p 值(H0 全真)──
rng = np.random.default_rng(42)
m = 50
pvals = rng.uniform(0, 1, m) # 均匀 p => 无真效应

reject_bonf, p_bonf, _, _ = multipletests(pvals, alpha=0.05, method='bonferroni')
reject_holm, p_holm, _, _ = multipletests(pvals, alpha=0.05, method='holm')
reject_bh, p_bh, _, _ = multipletests(pvals, alpha=0.05, method='fdr_bh')

print(f"m={m}, H0 all true:")
print(f" raw significant: {(pvals < 0.05).sum()}")
print(f" Bonferroni reject: {reject_bonf.sum()}")
print(f" Holm reject: {reject_holm.sum()}")
print(f" BH-FDR reject: {reject_bh.sum()}")

# ── 含 5 个真效应 ──
pvals2 = np.concatenate([rng.uniform(0, 0.001, 5), rng.uniform(0, 1, 45)])
reject_bh2, qvals, _, _ = multipletests(pvals2, alpha=0.05, method='fdr_bh')
print(f"\n5 true effects: BH reject {reject_bh2.sum()}, first 5 rejected: {reject_bh2[:5]}")

# ── ANOVA + Tukey HSD ──
g1 = rng.normal(1.0, 0.2, 12)
g2 = rng.normal(1.15, 0.2, 12)
g3 = rng.normal(0.95, 0.2, 12)
data = np.concatenate([g1, g2, g3])
groups = np.repeat(['A', 'B', 'C'], [12, 12, 12])
f, p_anova = stats.f_oneway(g1, g2, g3)
print(f"\nANOVA p={p_anova:.4f}")
tukey = pairwise_tukeyhsd(data, groups, alpha=0.05)
print(tukey.summary())

9. 小结

  • $m>1$ 次检验 必须考虑族系错误;FWER(Bonferroni/Holm/Tukey)vs FDR(BH)按场景选型。
  • ANOVA 事后用 Tukey;组学筛选用 BH
  • 报告校正方法与调整后 p/q,避免 p-hacking。

系列导航04 F检验 | 01 总论 | 00 规划


参考文献

  1. Benjamini Y., Hochberg Y. Controlling the False Discovery Rate. JRSS-B 1995.
  2. statsmodels multipletests
-------------本文结束感谢您的阅读-------------