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),记作
若假设把参数完全确定,如
两类错误与显著性水平
检验的结论是一个判断,判断可能出错。两种错误各有名称:
| 真实情况 | 拒绝 | 不拒绝 |
|---|---|---|
| 第一类错误( | 正确 | |
| 正确 | 第二类错误( |
第一类错误的概率上界称为显著性水平(significance level),记作
两类错误的概率不能同时任意小。固定样本量时压低
拒绝域与检验统计量
检验的操作方式是在样本空间上划出一个拒绝域(rejection region)
构造检验就是选择统计量与临界值。好的选择方式是让统计量在
不拒绝不等于接受
需要强调一条表述规范。检验的结论是拒绝或不拒绝
2.11.2 p 值与常见误用
定义
p 值(p-value)是在原假设成立的前提下的概率,取值定义为观测到当前统计量或更极端取值的概率:
p 值越小,说明观测与
三条常见误用
误用一:把 p 值当作
误用二:把 p 值当作效应大小。 p 值同时受效应量与样本量影响。样本量足够大时,微不足道的差异也能给出极小的 p 值。判断差异是否有实际意义要看效应量本身与其置信区间,不能看 p 值的大小。
误用三:把
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)给出简单对简单检验的最优形式。设
其中
证明思路是把拒绝域的不等式写成概率形式。对任意满足水平约束的检验,其功效与似然比检验之差的表达式可以整理为似然比与某个非负权重乘积的积分,由似然比检验的构造可知该积分非负,故似然比检验的功效最大。这一结论把最优检验的构造归结为似然比,所有基于似然比的检验都有这条引理作为背景。
单调似然比与一致最优势检验
引理处理两个简单假设,实际问题的备择通常是复合的。单调似然比(monotone likelihood ratio)条件为推广提供了基础:若似然比
正态均值、指数分布的速率参数、二项分布的成功概率都满足单调似然比条件,因此这些参数的单侧检验存在 UMP。双侧备择与二维以上参数一般不存在 UMP,此时改用无偏检验或不变检验作为次优准则:无偏要求检验在任何备择参数下的功效不低于水平
2.11.4 三大渐近检验
极大似然框架下有三类通用检验,它们的构造方式不同,渐近性质一致。
似然比检验(likelihood ratio test,LRT)。比较参数在约束下与无约束下的最大似然:
其中
Wald 检验。在无约束估计处评估偏差并标准化:
其中
得分检验(score test,也称拉格朗日乘子检验)。在原假设处评估得分函数:
它只需要在
三个检验渐近等价,小样本下数值不同。似然面越接近二次曲面,三者越接近;似然面越不对称,Wald 检验与另外两者的偏差越大。三者与置信区间的对应关系在 2.10 节已说明:反转任一检验即得到对应的置信区间。
2.11.5 常用参数检验
均值检验
单样本 t 检验用于检验总体均值:
配对设计的功效通常高于独立组设计,因为个体差异被差分消除。选择设计时如果条件允许,配对或重复测量能显著降低所需样本量。
方差检验与拟合优度
方差齐性检验用于判断两组或多组的方差是否相同,是方差分析与合并 t 检验的前提。Bartlett 检验对正态性敏感,Levene 检验用绝对偏差的均值替代方差,对偏态与厚尾更稳健,Fligner-Killeen 检验基于秩,稳健性最强。
拟合优度与独立性检验基于卡方统计量。卡方拟合优度检验比较观测频数与理论频数:
正态性检验
Shapiro-Wilk 检验对小样本的正态性检验功效较高,Anderson-Darling 检验对尾部差异敏感,Kolmogorov-Smirnov 检验可以检验与任意给定分布的拟合程度但对正态性检验功效偏低(因为需要估计参数,分布表需要修正)。
正态性检验本身也有样本量问题:样本量很大时,轻微偏离正态也会显著;样本量很小时,功效不足无法发现问题。合理的做法是把它作为辅助判断,主要依据直方图、分位数图与对方法的稳健性考虑。
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 检验,效率损失约为
置换检验与随机化检验
置换检验(permutation test)构造了最直接的检验逻辑:若两组来自同一分布,则组标签是任意的,把观测值在两组间随机重新分配不会改变数据的整体形态。把所有可能的分配方式下统计量的取值收集起来,得到统计量在
全部排列数很大时用随机抽样近似(通常取
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 多重比较与错误率控制
假阳性膨胀
同时对
取
两个错误率指标用于控制整体错误。族错误率(family-wise error rate,FWER)是至少出现一个假阳性的概率,控制最严。错误发现率(false discovery rate,FDR)是所有被拒绝的假设中假阳性所占比例的期望,控制较宽松,在检验数量很大时能保留更多真实发现。
校正方法
Bonferroni 校正把每个检验的水平改为
Holm 校正是逐步改进版本:把 p 值升序排列
Benjamini-Hochberg 校正(BH)控制 FDR:找到最大的
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 样本量、功效与序贯设计
功效分析
功效分析的目的是在设计阶段确定样本量,使检验在给定的效应量下达到目标功效(通常取
以两独立样本均值比较为例,假定方差相同,所需样本量为
其中
最小可检测效应(minimum detectable effect)是反向使用同一公式:在给定样本量与功效下,能够检出的最小效应量。设计阶段无法确定效应量时,计算最小可检测效应并评估其是否具有实际意义,是更有用的做法。
等价检验与非劣效检验
常规检验的原假设是差异为零,拒绝它只说明差异存在。要声称两种方案效果相当,需要把原假设反过来,即等价检验(equivalence test):原假设为差异超出某等价界限
序贯设计与 alpha 消耗
固定样本设计需要在数据收集前确定样本量,如果中途查看数据并据此决定是否继续,会系统性抬高第一类错误率。序贯检验(sequential test)允许在数据累积过程中做多次判断,通过alpha 消耗函数把总显著性水平分配到各次检验上,使整体错误率保持在
2.11.9 贝叶斯假设检验与决策论视角
贝叶斯因子
贝叶斯框架下假设比较通过贝叶斯因子(Bayes factor)进行:
它度量数据在两个假设下的相对预测能力。结合先验几率得到后验几率:
形式上与 2.1 节的优势更新一致。贝叶斯因子与 p 值的差别在于它同时依赖样本量与先验,不使用拒绝域,得到的是证据强度而非二值判断。点零假设(
决策论
把检验放在决策理论(decision theory)框架下,需要引入损失函数(loss function)
贝叶斯风险是先验下风险的平均,最小化贝叶斯风险的决策称为贝叶斯决策,它等于给定先验时的后验期望损失最小化。最小最大(minimax)准则则在最不利的参数取值上最小化风险,不依赖先验,适合保守场景。可容许决策(admissible decision)指不存在另一个决策在所有参数下风险都不更差的决策,它把无用的决策规则排除在外。
0-1 损失下的检验问题是决策论的一个特例:损失为
2.11.10 本节小结
从检验逻辑到错误率控制
本节建立起假设检验的完整逻辑:原假设与备择假设构成对参数空间的划分,检验通过拒绝域给出判断,两类错误的概率不能同时任意小,样本量是唯一的调节手段。p 值是在原假设下观测到极端结果的概率,它既不等于原假设为真的概率,也不等于效应大小,三条误用都源于混淆了条件概率的方向或混淆了统计显著与实际重要。Neyman-Pearson 引理说明似然比检验在简单对简单情形下最优,单调似然比条件把结论推广到单侧复合备择;似然比、Wald 与得分三种渐近检验渐近等价,小样本下表现不同且与相应置信区间对偶。参数检验覆盖均值、方差、比例与分布形态,秩检验与置换检验在分布假设可疑时提供不依赖分布的替代方案。多重比较的校正区分 FWER 与 FDR 两个目标,Holm 与 BH 分别在两类目标下优于最简单的 Bonferroni 方法。设计阶段通过功效分析确定样本量或最小可检测效应,序贯设计用 alpha 消耗函数在多次查看数据时守住总体错误率。贝叶斯因子与决策论提供了不依赖拒绝域的替代视角,把证据强度与犯错的代价纳入判断。
检验回答了参数是否取某个值,但没有描述参数与其他变量之间的关系。回归分析补上这一块:它把响应变量表示为若干解释变量的函数,同时估计系数、评估拟合质量、诊断模型假设是否成立。下一节讨论贝叶斯推断,它是与本节并列的另一条推断路线,用先验与后验替代拒绝域,并给出处理复杂模型的计算方法。
练习题
第 1 题 概念推导
设
参考答案
检验统计量与拒绝域:在
单侧检验的拒绝域为
功效函数:对任意真实均值
提高功效的两条途径:第一,增大样本量
第 2 题 计算推理
某网站测试两种按钮颜色对点击率的影响。A 组
参考答案
两比例检验:样本比例为
检验统计量
双侧 p 值约为
差值置信区间:用不合并方差的 Wald 形式,
区间为
一致性:置信区间包含
第 3 题 代码验证
用模拟验证多重比较校正的效果。构造
参考答案
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} 个")典型输出显示未校正时平均拒绝约
第 4 题 综合应用
某团队同时检验
参考答案
未校正时的判断:
BH 的临界条件:把 p 值升序排列
即第
强相关情形:BH 的 FDR 控制在检验之间独立或正相关时成立。指标之间强相关时(例如同一业务口径下的多个衍生指标),改用 Benjamini-Yekutieli 校正,阈值乘以调和数
即阈值变为
常见错误
错误 1 · 把 p 值当作原假设为真的概率
原因:p 值是在原假设下观测到极端结果的概率,方向是数据对假设的条件概率。把
解决:表述时使用正确方向:若原假设成立,观测到这样极端结果的概率为
错误 2 · 用统计显著性替代实际重要性
原因:p 值同时受效应量与样本量影响,样本量足够大时任何微小差异都可以达到显著。只看 p 值会把没有实际意义的差异当作重要结论,反过来,样本量不足时会把有意义的差异判为不显著。
解决:报告效应量与其置信区间,把统计判断与业务判断分开。设计阶段计算最小可检测效应,确认该效应是否具有实际意义;分析阶段用等价检验或非劣效检验支持等价主张。
错误 3 · 多重比较未做校正
原因:同时检验多个假设时,至少出现一个假阳性的概率随检验数迅速上升,
解决:在检验开始前确定校正方案。探索性筛选用 BH 控制 FDR,验证性研究用 Holm 或 Bonferroni 控制 FWER。报告时给出校正方法与校正前后的 p 值,避免读者按未校正的数值理解结论。
错误 4 · 在固定样本设计中反复查看数据
原因:每查看一次数据并决定是否继续,都会消耗一部分第一类错误预算。固定样本设计只在试验结束时判断一次,中途按显著性结果决定停止会把实际错误率抬到远高于名义
解决:需要中途判断时采用成组序贯设计,预先设定查看次数与各次的临界值,用 alpha 消耗函数分配总体错误率。若已经按固定设计收集数据,中途查看的结果只作参考,最终结论仍按预设的样本量判断。