假设检验、效应量与多重比较
样本均值比目标高了 4,这个偏差是抽样波动能解释的,还是足以拒绝“总体均值等于目标”的假设?即使拒绝了,4 是否值得采取行动?假设检验回答前一个问题;效应量和实际决策门槛帮助回答后一个。抽样、标准误和区间覆盖率的基础见统计与概率。
先把问题写成检验
NIST 对统计检验的说明从一对假设出发:原假设 给出要检验的说法,备择假设 指明哪些偏离值得检出。检验还需要一个概括数据的统计量,以及它在 和抽样假设成立时的参考分布。
以总体均值 为例:
在看数据前选定问题、显著性水平 、样本量或停止规则。对于这里的单侧正态均值检验,在原假设边界 计算尾概率,可控制整个单侧原假设下的错误率。
NIST 对 p 值的定义是:在原假设成立时,统计量达到观测值那么极端或更极端的概率。“极端”取决于事先选定的备择方向。通常在 时拒绝 ;否则不拒绝。
美国统计学会的说明强调了 p 值与模型之间的关系:p 值的条件是原假设和统计模型。它不等于“原假设为真的概率”,也不等于这次拒绝出错的概率。若要给假设本身分配概率,需要另一套模型,例如贝叶斯更新中的先验与似然。
完整例子:均值从 500 偏到 504
设有 25 个独立、同分布的正态观测,样本均值为 ;总体标准差 在这个假设例子中已知。检验 对 ,取 。NIST 的单总体均值检验在标准差已知时使用:
在 下,;观测值为 。若 是标准正态累积分布函数,双侧 p 值为
在 成立的上述模型中,重复抽取 25 个观测,约 4.55% 的样本会产生至少这么大的绝对标准化偏差。因此在 5% 水平拒绝 。这项计算使用给定的样本摘要;504 是示例输入,并非实际测量结果。
若事先的问题是“是否升高”,上尾 p 值为 。这次恰好是双侧值的一半,因为观测方向与备择一致,而且参考分布对称。若事先问“是否降低”,这组数据的下尾 p 值约为 0.977250。看见正偏差之后再挑上尾,会改变原来的检验规则;对称连续零分布下,每次挑较小的单侧 p 值并与 0.05 比较,实际双侧错误率是 0.10。
用置信区间看同一结果
对相同模型,使用 NIST 给出的已知总体标准差的均值区间:
500 在区间之外,与双侧 5% 检验的拒绝相符。NIST 对检验与区间的对应说明使用的也是已知总体标准差的模型。这种对应必须匹配模型、标准误、双侧方向和置信水平;单侧检验对应单侧界限。95% 指区间方法在重复抽样中的覆盖率。
若 未知,用样本标准差 替代它需要计入估计误差。对独立同分布的正态观测,在 下, 服从 ,应同时改用 t 分布的 p 值和区间。非正态总体的近似依据见中心极限定理;增加样本量不能修复依赖或抽样偏差。
错误率、功效与实际效应
NIST 的定量统计说明区分统计显著性和实际意义,并定义以下错误与功效:
本例的原始效应估计是 ,按总体标准差标准化后是 。若采取行动需要均值至少升高 5,点估计尚未达到门槛,升高量的区间 也没有把它限定在 5 以上。显著地偏离零和达到实际门槛是两个判断。
功效要针对指定的真实效应计算。沿用已知标准差的模型,若真实升高量为 ,则检验统计量服从 ,其中 。令 ,双侧功效为
时约为 0.516005;事先改用 时约为 0.979327,真实效应仍是 4。功效是研究设计在指定效应下的检出概率,不能读成观测结果为真的概率。不拒绝也不能据此认定等效;要论证等效,需要事先设定可接受的差异范围并使用相应程序,见 NIST 等效检验指南第 5 节。样本量公式解释了区间精度的规划;检测指定效应还需要功效、方向和错误率。
下面的标准库代码复算检验、区间和功效:
import math
from statistics import NormalDist
def normal_sf(z):
# Compute the upper tail directly to avoid cancellation near 1.
return 0.5 * math.erfc(z / math.sqrt(2))
normal = NormalDist()
n, xbar, mu0, sigma, alpha = 25, 504.0, 500.0, 10.0, 0.05
se = sigma / math.sqrt(n)
z = (xbar - mu0) / se
p_upper = normal_sf(z)
p_two = 2 * normal_sf(abs(z))
critical = normal.inv_cdf(1 - alpha / 2)
lo, hi = xbar - critical * se, xbar + critical * se
print(f"SE={se:.3f}, z={z:.3f}")
print(f"p_upper={p_upper:.6f}, p_two={p_two:.6f}")
print(f"95% CI=[{lo:.3f}, {hi:.3f}]")
print(f"shift={xbar - mu0:.3f}, standardized={(xbar - mu0) / sigma:.3f}")
for size in (25, 100):
shift = 4.0 / (sigma / math.sqrt(size))
power = normal_sf(critical + shift) + normal_sf(critical - shift)
print(f"n={size}, power_at_shift_4={power:.6f}")
输出:
SE=2.000, z=2.000
p_upper=0.022750, p_two=0.045500
95% CI=[500.080, 507.920]
shift=4.000, standardized=0.400
n=25, power_at_shift_4=0.516005
n=100, power_at_shift_4=0.979327
多个比较要一起控制什么
若 20 个原假设都为真,各自做第一类错误率恰为 0.05 的独立检验,则至少误拒绝一个的概率为
这个乘法要求检验独立;共用测试任务可能使模型比较相互依赖,因此需要论证独立性。仍然需要定义比较族:哪些模型、指标和子组共同支撑这次结论,而不是事后只留下显著的比较。
Benjamini 与 Hochberg 的原论文提出 FDR,并指出所有原假设都为真时它与 FWER 相等。
其中 是错误拒绝数, 是总拒绝数, 时比例记为零。有真实效应时,FDR 允许某些错误发现来提高检出能力;控制在 5% 不保证这一次的发现中至多 5% 是错的。
Bonferroni 与 BH 的小例子
对事先定义的 个检验,Bonferroni 不等式给出一个直接办法:每个检验用 ,或用调整值 与 比较。只要每个原始 p 值有效,FWER 就不超过 ,无需检验独立;这是对错误事件使用概率和上界的结果。
SciPy 的错误发现控制文档保留了依赖条件:Benjamini–Hochberg(BH)在独立或满足正回归依赖(PRDS)的检验下控制 FDR;Benjamini–Yekutieli(BY)对一般依赖也有保证,但更保守。相关并不自动意味着满足 PRDS。
BH 把 p 值从小到大排序为 ,找满足 的最大 ,拒绝前 个;没有满足者就不拒绝。这个固定样本规则也列于 Johari 等人的论文第 7.2 节。排序后的调整值为
设五个事先确定的比较得到以下示例 p 值。在 FWER 或 FDR 目标均为 0.05 时:
Bonferroni 拒绝 A;BH 拒绝 A、B、C。BH 的排序门槛为 0.01、0.02、0.03、0.04、0.05,最大满足位置是第三个。两种方法控制的目标不同,选择哪一个应取决于能否接受一组发现中存在错误,而不能取决于哪种给出的显著结果更多。
下面用标准库实现上述有限列表的调整,并把 BH 结果放回输入顺序。它要求输入为非空、有效的 p 值列表。
ps = [0.001, 0.012, 0.018, 0.041, 0.200]
m = len(ps)
order = sorted(range(m), key=ps.__getitem__)
bh = [0.0] * m
running = 1.0
for rank in range(m, 0, -1):
index = order[rank - 1]
running = min(running, m * ps[index] / rank)
bh[index] = running
bonferroni = [min(1.0, m * p) for p in ps]
print("Bonferroni:", [round(p, 6) for p in bonferroni])
print("BH:", [round(p, 6) for p in bh])
print("reject at 0.05:", sum(p <= 0.05 for p in bonferroni),
sum(p <= 0.05 for p in bh))
print(f"20 independent true nulls, FWER={1 - 0.95**20:.6f}")
输出:
Bonferroni: [0.005, 0.06, 0.09, 0.205, 1.0]
BH: [0.005, 0.03, 0.03, 0.05125, 0.2]
reject at 0.05: 1 3
20 independent true nulls, FWER=0.641514
调整 p 值不自动调整区间。若要让这一族的区间同时覆盖,可对每个参数构造置信水平为 的区间,Bonferroni 保证同时覆盖率至少为 。BH 控制的是错误发现比例,不能把被拒绝假设各自的普通 95% 区间当作同时覆盖保证。
模型选择和反复查看结果
Cawley 与 Talbot 的研究指出,有限样本上的模型选择指标也会被过拟合,随后用同一批数据报告性能会产生选择偏差。比较量化版本、提示词、上下文设置和多个指标时,选出最好的配置再按“事先只比较了这一对”计算 p 值,会漏掉选择过程。
模型在同一批任务上比较时,不确定性估计需要保留任务配对关系;若任务按项目聚集,也要保留这种分组。统计与概率介绍了相应的抽样单位、任务损失差和配对 bootstrap。
再区分选择与停止。每增加一批任务就重新做普通检验,并在 时停止,最终 p 值失去原来的固定样本错误率保证。Johari 等人对持续监测的研究说明了这种影响,并构造了在其统计假设下允许数据依赖停止的 always-valid p 值。仅仅计算很多次普通 p 值不能获得这种性质。
把这些区别用到本地模型评测时,可以这样安排一次比较:
- 先固定配置、主要指标、实际改进门槛、比较族和错误控制目标。
- 在开发任务上选择配置;用未参与选择的新测试任务评估冻结后的候选。采用嵌套交叉验证时,把整个选择过程放进内层。
- 事先固定测试样本量;需要中途决策时,采用明确的序贯方法并保留其适用条件。
- 一起报告样本单位、效应估计、区间、原始和调整后的 p 值,以及比较与停止规则。
多重比较调整的起点是有效的原始 p 值。对选择过的数据或随结果而定的停止规则,最后给赢家套一次 BH,无法补回缺失的检验设计。