Skip to content

2.11 假设检验与多重比较 ​

区间估计回答参数落在什么范围。实际工作中还有另一类问题需要直接回答:新方案与旧方案的差异是否超出随机波动、数据是否与某个理论取值相容、两种分类标准是否相互独立。这类问题的答案是判断而非数值,对应的工具是假设检验(hypothesis testing)。

假设检验的逻辑与区间估计不同。它先设立一个待检验的基准假设,再评估观测数据在基准成立时出现的可能性,据此决定是否拒绝基准。这一逻辑在第 2.11.1 节到第 2.11.3 节建立,随后讨论 p 值的正确用法与三种通用的渐近检验;第 2.11.5 节与第 2.11.6 节列出常用的参数检验与非参数检验,第 2.11.7 节处理同时检验多个假设时的错误率控制,这是实际项目中出错最多的地方;最后两节讨论样本量与功效的设计问题,以及贝叶斯框架与决策论视角下的检验。区间估计与检验互为对偶(2.10 节的反转检验法),两节的工具可以互相转化。

2.11.1 假设检验的基本框架 ​

原假设与备择假设 ​

检验从一个待检验的陈述开始,称为原假设(null hypothesis),记作 H0。与原假设相对的是备择假设(alternative hypothesis),记作 H1。两者构成对参数空间的一个划分。

若假设把参数完全确定,如 H0:μ=50,称为简单假设(simple hypothesis);若假设只限定参数落在某个集合内,如 H1:μ>50,称为复合假设(composite hypothesis)。备择假设通常取复合形式,按方向分为单侧(μ>μ0 或 μ<μ0)与双侧(μ≠μ0)。

两类错误与显著性水平 ​

检验的结论是一个判断,判断可能出错。两种错误各有名称:

真实情况拒绝 H0不拒绝 H0
H0 为真第一类错误(α)正确
H0 为假正确第二类错误(β)

第一类错误的概率上界称为显著性水平(significance level),记作 α,通常取 0.05 或 0.01。第二类错误的概率记作 β,1−β 称为检验功效(power),表示在原假设为假时正确拒绝的概率。

两类错误的概率不能同时任意小。固定样本量时压低 α 会使拒绝域收窄,β 随之上升。唯一的办法是增加样本量。这一权衡是样本量计算的出发点,第 2.11.8 节给出定量关系。

拒绝域与检验统计量 ​

检验的操作方式是在样本空间上划出一个拒绝域(rejection region)W:观测落入 W 时拒绝 H0,否则不拒绝。拒绝域由检验统计量(test statistic)T(X) 与临界值(critical value)c 确定,例如 W={T>c}。

构造检验就是选择统计量与临界值。好的选择方式是让统计量在 H1 下取值偏大或偏小,使两类错误都小。多数检验统计量的形式来自似然比、标准化偏差或距离度量,下面的小节按这三条线索展开。

不拒绝不等于接受 ​

需要强调一条表述规范。检验的结论是拒绝或不拒绝 H0,在未拒绝时只能说数据没有提供足够证据支持 H1,不能说 H0 被证明为真。原因是功效不足时,即使 H1 为真也可能观测不到显著差异,未拒绝可能只是样本量不够。报告结果时同时给出效应量的估计与置信区间,可以避免把未拒绝读成等价结论。

2.11.2 p 值与常见误用 ​

定义 ​

p 值(p-value)是在原假设成立的前提下的概率,取值定义为观测到当前统计量或更极端取值的概率:

p=PH0(T(X) 比 T(xobs) 更极端)

p 值越小,说明观测与 H0 的偏离越难用随机波动解释。在水平 α 下的检验规则等价于比较 p≤α,两种写法给出的结论一致,但 p 值携带的信息比二值结论更多。

三条常见误用 ​

误用一:把 p 值当作 H0 为真的概率。 p 值是 P(数据∣H0),不是 P(H0∣数据)。两者的差别与 2.1 节的条件概率方向问题相同。正确的表述是:若 H0 为真,观测到这样极端结果的概率是 p。要得到 H0 为真的概率,需要贝叶斯框架与先验信息。

误用二:把 p 值当作效应大小。 p 值同时受效应量与样本量影响。样本量足够大时,微不足道的差异也能给出极小的 p 值。判断差异是否有实际意义要看效应量本身与其置信区间,不能看 p 值的大小。

误用三:把 p>0.05 当作证明等价。 与上一条对称,未达显著也可能因为样本量不足。要声称差异可以忽略,需要用等价检验或非劣效检验(第 2.11.8 节),而不是依据不显著的检验结果。

python
import numpy as np
from scipy import stats

# 同样的效应量,样本量不同时 p 值的差别
rng = np.random.default_rng(8)
effect = 0.1        # 真实的标准化差异

for n in [30, 300, 3000]:
    group_a = rng.normal(0, 1, size=n)
    group_b = rng.normal(effect, 1, size=n)
    t_stat, p_val = stats.ttest_ind(group_a, group_b)
    diff = group_b.mean() - group_a.mean()
    # Cohen's d 的估计
    pooled = np.sqrt(((n - 1) * group_a.var(ddof=1) + (n - 1) * group_b.var(ddof=1)) / (2 * n - 2))
    print(f"n = {n:5d}:均值差 = {diff:+.3f},标准化效应 = {diff / pooled:+.3f},p = {p_val:.4f}")
# 效应量稳定在 0.1 附近,p 值随样本量迅速减小

2.11.3 Neyman-Pearson 引理与最优检验 ​

引理 ​

Neyman-Pearson 引理(Neyman-Pearson lemma)给出简单对简单检验的最优形式。设 H0:θ=θ0 与 H1:θ=θ1,在显著性水平 α 下,功效最大的检验由似然比决定:

当 L(θ1)L(θ0)>k 时拒绝 H0

其中 k 由水平条件 Pθ0(拒绝)=α 确定。

证明思路是把拒绝域的不等式写成概率形式。对任意满足水平约束的检验,其功效与似然比检验之差的表达式可以整理为似然比与某个非负权重乘积的积分,由似然比检验的构造可知该积分非负,故似然比检验的功效最大。这一结论把最优检验的构造归结为似然比,所有基于似然比的检验都有这条引理作为背景。

单调似然比与一致最优势检验 ​

引理处理两个简单假设,实际问题的备择通常是复合的。单调似然比(monotone likelihood ratio)条件为推广提供了基础:若似然比 L(θ′)/L(θ) 关于某个统计量 T(x) 单调,则对单侧备择存在一致最优势检验(uniformly most powerful test,UMP),且其形式仍是 T(x)>c。

正态均值、指数分布的速率参数、二项分布的成功概率都满足单调似然比条件,因此这些参数的单侧检验存在 UMP。双侧备择与二维以上参数一般不存在 UMP,此时改用无偏检验或不变检验作为次优准则:无偏要求检验在任何备择参数下的功效不低于水平 α,不变要求检验在数据做某些保持问题结构的变换后结论不变。

2.11.4 三大渐近检验 ​

极大似然框架下有三类通用检验,它们的构造方式不同,渐近性质一致。

似然比检验(likelihood ratio test,LRT)。比较参数在约束下与无约束下的最大似然:

Λ=supθ∈Θ0L(θ)supθ∈ΘL(θ),−2log⁡Λ→dχ2(q)

其中 q 是约束条件的个数。检验统计量对大样本服从卡方分布,不受参数化方式的影响。似然比检验的缺点是需要分别求解约束与无约束的优化。

Wald 检验。在无约束估计处评估偏差并标准化:

W=(θ^−θ0)T[I(θ^)](θ^−θ0)→dχ2(q)

其中 I 是 Fisher 信息矩阵。Wald 检验只需要一次无约束估计,计算最省,但在参数化改变时结论会变化,且在似然面强不对称时表现较差。

得分检验(score test,也称拉格朗日乘子检验)。在原假设处评估得分函数:

S=U(θ0)TI(θ0)−1U(θ0)→dχ2(q),U(θ)=∂ℓ(θ)∂θ

它只需要在 H0 下估计参数,适合约束模型容易拟合而完整模型难拟合的情形,在生存分析与复杂模型的变量筛选中常用。

三个检验渐近等价,小样本下数值不同。似然面越接近二次曲面,三者越接近;似然面越不对称,Wald 检验与另外两者的偏差越大。三者与置信区间的对应关系在 2.10 节已说明:反转任一检验即得到对应的置信区间。

2.11.5 常用参数检验 ​

均值检验 ​

单样本 t 检验用于检验总体均值:T=(X¯−μ0)/(S/n)∼t(n−1),前提是数据近似正态或样本量足够大。两独立样本 t 检验比较两组均值,分为方差齐性与方差不齐两种版本,后者用 Welch 校正(默认推荐)。配对 t 检验处理同一批对象在两种条件下的测量,把差异看作单样本问题,可以消除个体间差异带来的方差。

配对设计的功效通常高于独立组设计,因为个体差异被差分消除。选择设计时如果条件允许,配对或重复测量能显著降低所需样本量。

方差检验与拟合优度 ​

方差齐性检验用于判断两组或多组的方差是否相同,是方差分析与合并 t 检验的前提。Bartlett 检验对正态性敏感,Levene 检验用绝对偏差的均值替代方差,对偏态与厚尾更稳健,Fligner-Killeen 检验基于秩,稳健性最强。

拟合优度与独立性检验基于卡方统计量。卡方拟合优度检验比较观测频数与理论频数:

χ2=∑i=1k(Oi−Ei)2Ei∼χ2(k−1−m)

m 是估计的参数个数。卡方独立性检验对列联表检验两个分类变量的独立性,统计量形式相同,自由度改为 (r−1)(c−1)。单元格期望频数过小(经验规则是小于 5)时卡方近似失效,改用 Fisher 精确检验。

正态性检验 ​

Shapiro-Wilk 检验对小样本的正态性检验功效较高,Anderson-Darling 检验对尾部差异敏感,Kolmogorov-Smirnov 检验可以检验与任意给定分布的拟合程度但对正态性检验功效偏低(因为需要估计参数,分布表需要修正)。

正态性检验本身也有样本量问题:样本量很大时,轻微偏离正态也会显著;样本量很小时,功效不足无法发现问题。合理的做法是把它作为辅助判断,主要依据直方图、分位数图与对方法的稳健性考虑。

python
import numpy as np
from scipy import stats

rng = np.random.default_rng(14)
a = rng.normal(10, 2, size=40)
b = rng.normal(10.8, 2, size=40)

print("两独立样本 t 检验(方差齐性假设)")
print(f"  {stats.ttest_ind(a, b, equal_var=True)}")
print("两独立样本 t 检验(Welch 校正)")
print(f"  {stats.ttest_ind(a, b, equal_var=False)}")
print("正态性检验:", stats.shapiro(a))
print("方差齐性检验:", stats.levene(a, b))

# 配对设计:同一批对象在两种条件下的测量
before = rng.normal(20, 3, size=30)
after = before + rng.normal(1.2, 1.0, size=30)   # 处理带来的提升
print("配对 t 检验:", stats.ttest_rel(before, after))
print("独立样本 t 检验(错误地忽略配对):", stats.ttest_ind(before, after))
# 配对检验的 p 值更小,因为个体差异被差分消除

2.11.6 非参数检验与置换检验 ​

基于秩的检验 ​

分布假设可疑或数据为顺序尺度时,秩检验不依赖具体分布形式。符号检验只统计差异的正负个数,用二项分布计算 p 值,信息利用最少但假设最弱。Wilcoxon 符号秩检验在符号检验基础上加入差异大小的秩信息,用于配对或单样本问题。Mann-Whitney U 检验(等价于 Wilcoxon 秩和检验)比较两组数据的分布位置,是两独立样本 t 检验的非参数对应。Kruskal-Wallis 检验把 Mann-Whitney 推广到多组,Friedman 检验处理区组设计(同一对象在多个条件下的重复测量),两者分别对应单因素方差分析与重复测量方差分析。

秩检验的原假设表述为两个分布相同(不限于均值相等),比 t 检验的假设弱。代价是在数据确实正态时功效低于 t 检验,效率损失约为 2/π≈0.955 的渐近相对效率,即需要多约 5% 的样本达到同样功效。损失不大,因此在分布不确定时秩检验是稳妥的选择。

置换检验与随机化检验 ​

置换检验(permutation test)构造了最直接的检验逻辑:若两组来自同一分布,则组标签是任意的,把观测值在两组间随机重新分配不会改变数据的整体形态。把所有可能的分配方式下统计量的取值收集起来,得到统计量在 H0 下的精确分布,据此刻画 p 值。

p=PH0(|Tperm|≥|Tobs|)

全部排列数很大时用随机抽样近似(通常取 104 至 105 次)。置换检验不依赖任何分布假设,只依赖随机化或交换性,适用于任意统计量(均值差、中位数差、方差比、相关系数),是分布未知时的通用方案。随机化检验是同一思想在设计阶段的版本:研究对象被随机分配到各组,分配机制本身保证了交换性。

python
import numpy as np
from scipy import stats

rng = np.random.default_rng(19)
a = rng.exponential(scale=1.0, size=25)      # 明显右偏,t 检验假设可疑
b = rng.exponential(scale=1.6, size=25)

# 参数检验
print(f"t 检验 p 值        = {stats.ttest_ind(a, b).pvalue:.4f}")
print(f"Mann-Whitney p 值  = {stats.mannwhitneyu(a, b).pvalue:.4f}")

# 置换检验:直接对统计量分布做重抽样
def permutation_test(x, y, n_perm=20_000):
    obs = x.mean() - y.mean()
    pool = np.concatenate([x, y])
    nx = len(x)
    count = 0
    for _ in range(n_perm):
        rng.shuffle(pool)
        if abs(pool[:nx].mean() - pool[nx:].mean()) >= abs(obs):
            count += 1
    return (count + 1) / (n_perm + 1)

print(f"置换检验 p 值      = {permutation_test(a, b):.4f}")

2.11.7 多重比较与错误率控制 ​

假阳性膨胀 ​

同时对 m 个假设做检验时,即使每个假设的原假设都为真,出现至少一个假阳性的概率也会随 m 上升:

P(至少一个假阳性)=1−(1−α)m

取 α=0.05、m=20 时这一概率约为 0.64。AB 测试中同时比较二十个指标的差异、大规模特征筛选中同时检验上万个变量,都属于这种情形,不加校正的结论几乎没有参考价值。

两个错误率指标用于控制整体错误。族错误率(family-wise error rate,FWER)是至少出现一个假阳性的概率,控制最严。错误发现率(false discovery rate,FDR)是所有被拒绝的假设中假阳性所占比例的期望,控制较宽松,在检验数量很大时能保留更多真实发现。

校正方法 ​

Bonferroni 校正把每个检验的水平改为 α/m,由次可加性直接控制 FWER。方法简单且不需要任何独立性假设,代价是过于保守,尤其在检验数很大时功效损失明显。

Holm 校正是逐步改进版本:把 p 值升序排列 p(1)≤⋯≤p(m),对第 i 个假设使用阈值 α/(m−i+1),第一个不满足阈值的位置之后全部不拒绝。它在不增加假阳性的前提下一致优于 Bonferroni。Hochberg 校正沿用同样的形式但按降序判断,需要假设检验之间独立或正相关,功效进一步改善。

Benjamini-Hochberg 校正(BH)控制 FDR:找到最大的 k 使 p(k)≤kmα,拒绝前 k 个假设。它在独立性或正相关条件下控制 FDR,是筛选类研究的标准方法。Benjamini-Yekutieli 校正(BY)在任意依赖结构下控制 FDR,阈值乘以调和数 ∑i=1m1/i≈ln⁡m,在强依赖情形下使用。

python
import numpy as np

def bh_adjust(pvals, alpha=0.05):
    """Benjamini-Hochberg 校正,返回被拒绝的假设数量与校正后的阈值"""
    p = np.sort(np.asarray(pvals))
    m = len(p)
    thresholds = np.arange(1, m + 1) / m * alpha
    passing = np.where(p <= thresholds)[0]
    k = passing.max() + 1 if len(passing) else 0
    return k

rng = np.random.default_rng(27)
m = 100
# 20 个假设真实有效,80 个为真零假设
pvals = np.concatenate([
    rng.beta(0.5, 5.0, size=20),      # 有效假设的 p 值偏小
    rng.uniform(size=80),             # 真零假设的 p 值均匀分布
])

print(f"逐检验取 alpha = 0.05 时的发现数        = {(pvals <= 0.05).sum()}")
print(f"Bonferroni 校正后的发现数               = {(pvals <= 0.05 / m).sum()}")
print(f"BH 校正(FDR 控制)后的发现数           = {bh_adjust(pvals)}")
# 未校正时包含约 4 个假阳性,BH 在保留大部分真发现的同时控制了假阳性比例

2.11.8 样本量、功效与序贯设计 ​

功效分析 ​

功效分析的目的是在设计阶段确定样本量,使检验在给定的效应量下达到目标功效(通常取 0.8 或 0.9)。四个量相互制约:样本量 n、显著性水平 α、效应量 δ、功效 1−β。给定其中三个可以解出第四个。

以两独立样本均值比较为例,假定方差相同,所需样本量为

n≈2(z1−α/2+z1−β)2δ2

其中 δ=(μ1−μ2)/σ 是标准化效应量,n 是每组的样本量。效应量越小,所需样本量按平方增长。这一公式解释了为什么检测微小差异需要大样本:δ=0.2 时需要每组约 400 个样本才能达到 0.8 的功效。

最小可检测效应(minimum detectable effect)是反向使用同一公式:在给定样本量与功效下,能够检出的最小效应量。设计阶段无法确定效应量时,计算最小可检测效应并评估其是否具有实际意义,是更有用的做法。

等价检验与非劣效检验 ​

常规检验的原假设是差异为零,拒绝它只说明差异存在。要声称两种方案效果相当,需要把原假设反过来,即等价检验(equivalence test):原假设为差异超出某等价界限 Δ,备择为差异在界限之内。结论为拒绝原假设时,才支持等价的主张。非劣效检验(non-inferiority test)只关心一侧,检验新方案不比对照差出一定的裕度,常用于新方案在成本或便利性上有优势而效果只需不劣于对照的情形。

序贯设计与 alpha 消耗 ​

固定样本设计需要在数据收集前确定样本量,如果中途查看数据并据此决定是否继续,会系统性抬高第一类错误率。序贯检验(sequential test)允许在数据累积过程中做多次判断,通过alpha 消耗函数把总显著性水平分配到各次检验上,使整体错误率保持在 α。序贯概率比检验(sequential probability ratio test,SPRT)是每次观测后做一次似然比判断的版本,在给定两类错误水平下使平均样本量最小。成组序贯(group sequential)按批查看数据,更适合实际操作,配合消耗函数与提前终止规则使用。

2.11.9 贝叶斯假设检验与决策论视角 ​

贝叶斯因子 ​

贝叶斯框架下假设比较通过贝叶斯因子(Bayes factor)进行:

BF10=P(x∣H1)P(x∣H0)=∫f(x∣θ1)π1(θ1)dθ1∫f(x∣θ0)π0(θ0)dθ0

它度量数据在两个假设下的相对预测能力。结合先验几率得到后验几率:

P(H1∣x)P(H0∣x)⏟后验几率=BF10×P(H1)P(H0)⏟先验几率

形式上与 2.1 节的优势更新一致。贝叶斯因子与 p 值的差别在于它同时依赖样本量与先验,不使用拒绝域,得到的是证据强度而非二值判断。点零假设(H0:θ=θ0)的贝叶斯因子可以用 Savage-Dickey 密度比计算:它等于后验密度与先验密度在 θ0 处的比值,只需要一次后验估计。

决策论 ​

把检验放在决策理论(decision theory)框架下,需要引入损失函数(loss function)L(θ,a),其中 a 是采取的行动。风险函数(risk function)是损失在数据上的期望 R(θ,a)=Eθ[L(θ,a)],它关于参数的图像可以比较不同决策规则的优劣。

贝叶斯风险是先验下风险的平均,最小化贝叶斯风险的决策称为贝叶斯决策,它等于给定先验时的后验期望损失最小化。最小最大(minimax)准则则在最不利的参数取值上最小化风险,不依赖先验,适合保守场景。可容许决策(admissible decision)指不存在另一个决策在所有参数下风险都不更差的决策,它把无用的决策规则排除在外。

0-1 损失下的检验问题是决策论的一个特例:损失为 α 与 β 的加权,最优决策由似然比与损失的比值共同决定。这一视角的实用价值在于把显著性水平的选择与犯错的代价联系起来:代价不对称时,两类错误的水平不应取相同数值。

2.11.10 本节小结 ​

从检验逻辑到错误率控制

本节建立起假设检验的完整逻辑:原假设与备择假设构成对参数空间的划分,检验通过拒绝域给出判断,两类错误的概率不能同时任意小,样本量是唯一的调节手段。p 值是在原假设下观测到极端结果的概率,它既不等于原假设为真的概率,也不等于效应大小,三条误用都源于混淆了条件概率的方向或混淆了统计显著与实际重要。Neyman-Pearson 引理说明似然比检验在简单对简单情形下最优,单调似然比条件把结论推广到单侧复合备择;似然比、Wald 与得分三种渐近检验渐近等价,小样本下表现不同且与相应置信区间对偶。参数检验覆盖均值、方差、比例与分布形态,秩检验与置换检验在分布假设可疑时提供不依赖分布的替代方案。多重比较的校正区分 FWER 与 FDR 两个目标,Holm 与 BH 分别在两类目标下优于最简单的 Bonferroni 方法。设计阶段通过功效分析确定样本量或最小可检测效应,序贯设计用 alpha 消耗函数在多次查看数据时守住总体错误率。贝叶斯因子与决策论提供了不依赖拒绝域的替代视角,把证据强度与犯错的代价纳入判断。

检验回答了参数是否取某个值,但没有描述参数与其他变量之间的关系。回归分析补上这一块:它把响应变量表示为若干解释变量的函数,同时估计系数、评估拟合质量、诊断模型假设是否成立。下一节讨论贝叶斯推断,它是与本节并列的另一条推断路线,用先验与后验替代拒绝域,并给出处理复杂模型的计算方法。

练习题 ​

第 1 题 概念推导 ​

设 X1,…,Xn 独立同分布于 N(μ,σ2),σ2 已知,检验 H0:μ=μ0 对 H1:μ>μ0。写出检验统计量与拒绝域,推导功效函数,并说明在固定 α 下提高功效的两条途径。

参考答案

检验统计量与拒绝域:在 H0 下

Z=X¯−μ0σ/n∼N(0,1)

单侧检验的拒绝域为 Z>z1−α,其中 z1−α 是标准正态的 1−α 分位数。这一检验由 Neyman-Pearson 引理给出,是单侧备择下的一致最优势检验。

功效函数:对任意真实均值 μ,

π(μ)=Pμ(Z>z1−α)=Pμ(X¯−μ0σ/n>z1−α)=1−Φ(z1−α−n(μ−μ0)σ)

μ=μ0 时功效等于 α,与显著性水平一致;μ 增大时功效单调上升,趋近于 1。

提高功效的两条途径:第一,增大样本量 n。n(μ−μ0)/σ 随 n 的平方根增长,样本量扩大四倍可以把该量翻倍,功效随之提高。第二,提高显著性水平 α。z1−α 随 α 增大而减小,拒绝域变宽使功效上升,代价是第一类错误率上升。两条途径只能选其一或组合使用,如果两类错误的代价都不允许上升,就必须增加样本量。

第 2 题 计算推理 ​

某网站测试两种按钮颜色对点击率的影响。A 组 1000 次展示中有 80 次点击,B 组 1000 次展示中有 100 次点击。用两比例检验判断差异是否显著;再计算两个点击率差值的 95% 置信区间,说明两个结论是否一致。

参考答案

两比例检验:样本比例为 p^A=0.08,p^B=0.10。合并比例

p^=80+1002000=0.09

检验统计量

z=0.10−0.080.09×0.91×(11000+11000)=0.020.0001638≈1.562

双侧 p 值约为 2(1−Φ(1.562))≈0.118,大于 0.05,不拒绝两比例相等的原假设。

差值置信区间:用不合并方差的 Wald 形式,

SE=0.08×0.921000+0.10×0.901000=0.0000736+0.00009≈0.0128

区间为 0.02±1.96×0.0128=[−0.0051, 0.0451]。

一致性:置信区间包含 0,与检验不拒绝原假设的结论一致。两种做法在数学上对偶,但区间给出的信息更多:它说明观测到的差异为 2 个百分点,可能的真实差异范围从略微负值到 4.5 个百分点,决策者可以据此判断这个范围是否包含有实际意义的值。若要求检测出 2 个百分点的差异且达到 0.8 的功效,每组大约需要 3800 次展示。

第 3 题 代码验证 ​

用模拟验证多重比较校正的效果。构造 100 个假设,其中有 20 个真实有效(对应较小的 p 值),其余 80 个为真零假设。比较未校正、Bonferroni 校正与 Benjamini-Hochberg 校正三种做法下被拒绝的假设总数与其中假阳性的个数;重复 200 次,报告假阳性率的平均值。

参考答案
python
import numpy as np

def bh_reject(pvals, alpha=0.05):
    """返回 BH 校正下被拒绝的假设下标"""
    order = np.argsort(pvals)
    p_sorted = pvals[order]
    m = len(pvals)
    thresholds = np.arange(1, m + 1) / m * alpha
    passing = np.where(p_sorted <= thresholds)[0]
    if len(passing) == 0:
        return np.array([], dtype=int)
    k = passing.max() + 1
    return order[:k]

rng = np.random.default_rng(37)
m, m_alt, n_rep = 100, 20, 200
alpha = 0.05

records = {"未校正": [0, 0], "Bonferroni": [0, 0], "BH": [0, 0]}
fp_rates = {"未校正": [], "Bonferroni": [], "BH": []}

for _ in range(n_rep):
    pvals = np.concatenate([
        rng.beta(0.5, 5.0, size=m_alt),          # 真实有效
        rng.uniform(size=m - m_alt),             # 真零假设
    ])
    truth_alt = np.concatenate([np.ones(m_alt, bool), np.zeros(m - m_alt, bool)])

    results = {
        "未校正": np.where(pvals <= alpha)[0],
        "Bonferroni": np.where(pvals <= alpha / m)[0],
        "BH": bh_reject(pvals, alpha),
    }
    for name, rej in results.items():
        records[name][0] += len(rej)
        records[name][1] += int((~truth_alt[rej]).sum())
        fp_rates[name].append(int((~truth_alt[rej]).sum()))

for name in records:
    total_rej, total_fp = records[name]
    mean_fp = np.mean(fp_rates[name])
    print(f"{name:12s}:平均拒绝 {total_rej / n_rep:5.2f} 个,其中假阳性平均 {mean_fp:5.2f} 个")

典型输出显示未校正时平均拒绝约 24 个假设,其中假阳性约 4 个,每次实验出现至少一个假阳性的概率接近 1−(1−0.05)80≈0.98;Bonferroni 把假阳性压到接近零,但真实发现也从约 20 个降到十几个;BH 在保留大部分真实发现的同时把假阳性比例控制在 0.05 附近,这是它在筛选场景中被广泛采用的原因。

第 4 题 综合应用 ​

某团队同时检验 50 个指标,发现其中 6 个的 p 值小于 0.05,最小值为 0.004。请判断这一结果能否作为发现存在的证据;给出在 α=0.05 下用 BH 方法检验的临界条件;并说明如果这些指标之间存在强相关,应该改用哪种校正。

参考答案

未校正时的判断:50 次检验中期望的假阳性个数为 50×0.05=2.5 个,观测到 6 个显著结果并不罕见。当全部原假设为真时,出现至少一个显著结果的概率为 1−0.9550≈0.92,因此不能仅凭 p 值小于 0.05 的个数判断发现存在。

BH 的临界条件:把 p 值升序排列 p(1)≤⋯≤p(50),阈值为

p(k)≤k50×0.05=0.001k

即第 1 个 p 值需小于 0.001,第 2 个需小于 0.002,第 10 个需小于 0.010,以此类推。最小 p 值为 0.004,需要至少排在 k=4 位才满足条件,即至少有 4 个 p 值同时小于各自的阈值。若这 6 个 p 值的排序位置满足条件,则拒绝对应的假设,否则一个也不拒绝。注意 BH 的判断依赖整组 p 值的分布,不是逐个比较。

强相关情形:BH 的 FDR 控制在检验之间独立或正相关时成立。指标之间强相关时(例如同一业务口径下的多个衍生指标),改用 Benjamini-Yekutieli 校正,阈值乘以调和数

∑i=1501i≈4.50

即阈值变为 0.05k/(50×4.5)≈0.00022k,条件严格得多。另一种做法是先用主成分或聚类把高度相关的指标合并为代表指标,降低有效检验次数,再在缩减后的集合上做 BH 校正。

常见错误 ​

错误 1 · 把 p 值当作原假设为真的概率

原因:p 值是在原假设下观测到极端结果的概率,方向是数据对假设的条件概率。把 p=0.03 读成原假设为真的概率是 3%,等于把 P(数据∣H0) 当成了 P(H0∣数据),两者的差别与条件概率的方向问题相同。

解决:表述时使用正确方向:若原假设成立,观测到这样极端结果的概率为 p。需要关于原假设的后验概率时转入贝叶斯框架,用先验与贝叶斯因子计算。

错误 2 · 用统计显著性替代实际重要性

原因:p 值同时受效应量与样本量影响,样本量足够大时任何微小差异都可以达到显著。只看 p 值会把没有实际意义的差异当作重要结论,反过来,样本量不足时会把有意义的差异判为不显著。

解决:报告效应量与其置信区间,把统计判断与业务判断分开。设计阶段计算最小可检测效应,确认该效应是否具有实际意义;分析阶段用等价检验或非劣效检验支持等价主张。

错误 3 · 多重比较未做校正

原因:同时检验多个假设时,至少出现一个假阳性的概率随检验数迅速上升,20 个检验下约为 0.64,50 个检验下约为 0.92。未校正的显著性结果大量来自随机波动,后续的验证研究往往无法复现。

解决:在检验开始前确定校正方案。探索性筛选用 BH 控制 FDR,验证性研究用 Holm 或 Bonferroni 控制 FWER。报告时给出校正方法与校正前后的 p 值,避免读者按未校正的数值理解结论。

错误 4 · 在固定样本设计中反复查看数据

原因:每查看一次数据并决定是否继续,都会消耗一部分第一类错误预算。固定样本设计只在试验结束时判断一次,中途按显著性结果决定停止会把实际错误率抬到远高于名义 α 的水平,这一现象在模拟中很容易复现。

解决:需要中途判断时采用成组序贯设计,预先设定查看次数与各次的临界值,用 alpha 消耗函数分配总体错误率。若已经按固定设计收集数据,中途查看的结果只作参考,最终结论仍按预设的样本量判断。