5.2 检验选择、功效与多重比较:分析计划先于结果
统计软件把许多检验缩成一行函数调用。分析单位、比较结构和误差模型仍要自己选,决策规则也应在结果到来前写好。
本课目标
- 根据结果类型、设计和依赖结构选择方法;
- 同时报告原始尺度效应、标准化效应和区间;
- 用功效分析连接样本量与最小有意义效应;
- 控制多重比较、选择性报告和可选停止。
1. 检验方法由研究设计决定
| 场景 | 常见起点 | 关键前提或替代 |
|---|---|---|
| 两独立组连续指标 | Welch t 检验 | 独立单位;长尾时看稳健/置换方法 |
| 同一单位前后测 | 配对 t 检验 | 配对差值为分析对象 |
| 二分类结果 | 比例差/score 检验、logistic 模型 | 保留分子分母;小样本需调整 |
| 多组连续结果 | ANOVA/回归 | 先定义总体比较与后续 contrasts |
| 计数或率 | Poisson/负二项模型 | exposure、过度离散 |
| 重复测量/集群 | cluster-robust、GEE、混合模型 | 聚类数量与层级结构 |
| 生存时间 | Kaplan–Meier/Cox 等 | 非信息性删失;Cox 另需比例风险假设 |
这张表不是自动选择器。随机分配、缺失、协变量调整和测量误差都会影响方法。
2. 配对数据不要拆成独立组
同一队伍在新旧方案下各完成一次任务,应该分析每对差值:
配对利用单位内相关性,通常降低噪声。用独立 t 检验会忽略配对,并可能损失功效。
下面的配对示例使用 NumPy 和 SciPy 1.11 及以上版本,本课代码按顺序运行。它估计平均配对变化,为 -1.6 分钟;前后差异不会自动变成处理效应,时间趋势、学习和顺序效应仍需通过设计区分。
反过来,把并不一一对应的记录强行按时间最近配对,会引入选择偏差。配对规则属于设计,最好在观察结果前固定。
import numpy as np
from scipy import stats
old = np.array([12., 14., 13., 15., 16.])
new = np.array([11., 12., 13., 12., 14.])
if old.shape != new.shape or not np.isfinite(old).all() or not np.isfinite(new).all():
raise ValueError("Pairs must align and have an explicit missing-value policy")
differences = new - old
paired_result = stats.ttest_rel(new, old)
print(differences.mean(), paired_result.confidence_interval())3. 效应量先报告原始尺度
平均时长差:-4.2 分钟
完成率差:+3.1 个百分点
相对风险:1.08原始尺度能直接对应业务成本和最小有意义差异。Cohen's
“0.2/0.5/0.8 是小中大”只是特定背景下的粗略惯例,不应替代领域阈值。对于安全事件,极小相对变化也可能重要;对高波动体验指标,更大变化才值得发布。
4. 最小有意义效应连接决策
收集数据前先区分两个量。最小有意义效应是决策阈值:比它小的效应不足以改变行动。最小可检测效应(MDE)是某个设计在指定功效和显著性水平下能够检测的效应。样本量太小时,有意义的改善也可能检不出;给两者起同一个名字不会让实验更灵敏。
样本量取决于:
- 显著性水平;
- 目标功效
; - 基线率或方差;
- MDE;
- 分配比例;
- 集群、重复测量和流失;
- 多重比较计划。
功效是在指定真实效应和模型下拒绝零假设的概率,不是研究成功的无条件保证。对等量的两个独立组,可用双侧正态近似做下面的样本量规划:
from math import ceil
from scipy.stats import norm
alpha, target_power = 0.05, 0.80
sigma, target_mde = 10.0, 2.0 # minutes
n_per_group = ceil(
2 * (norm.ppf(1 - alpha / 2) + norm.ppf(target_power)) ** 2
* sigma ** 2 / target_mde ** 2
)
print(n_per_group) # 393 independent observations per group这里假设两组共同标准差为 10 分钟,目标是检测 2 分钟差异。393 是每组人数,不是总人数。这是连续均值的近似规划;t 分布设计、比例、流失、聚类或多次查看都需要相应计算。规划参数应来自相关历史数据,而不是期待中的结果。
5. 结果后功效通常不提供新信息
把观测效应代回公式计算“observed power”,通常只是 p 值的变形,不能解释不显著结果。更有用的是:
- 预先功效与样本量设计;
- 报告估计区间覆盖哪些有意义效应;
- 做敏感性分析;
- 若目标是排除大效应,使用区间或等效性设计。
6. 多重比较改变错误率
对 100 个真实零假设,若每项检验的假阳性率恰为 5%,假阳性个数的期望为 5。检验独立时,至少一个假阳性的概率为
常见控制目标:
- FWER:出现任何一个假阳性的概率,如 Bonferroni/Holm;
- FDR:所有拒绝中假发现的期望比例,如 Benjamini–Hochberg。
选择取决于后果。安全阻断可能重视 FWER;大规模探索筛选可能使用 FDR。校正集合必须预先定义,不能只把不喜欢的检验排除在 family 外。
FDR 是
p_values = np.array([0.001, 0.01, 0.03, 0.20])
bonferroni = np.minimum(1.0, len(p_values) * p_values)
bh = stats.false_discovery_control(p_values, method="bh")
print(bonferroni) # [0.004, 0.04, 0.12, 0.8]
print(bh) # [0.004, 0.02, 0.04, 0.2]
print(1 - (1 - 0.05) ** 100) # approximately 0.9941, assuming independence以 5% 为门槛,Bonferroni 拒绝前两项,BH 拒绝前三项。两者控制的错误目标不同,拒绝更多不能证明 BH 在所有场合都更合适。
7. 可选停止会膨胀错误率
每天查看普通 p 值,一显著就停止,并不保持固定样本 t 检验的 5% 错误率。可使用:
- 预定固定样本量与结束时间;
- group sequential 设计与 alpha spending;
- always-valid inference / sequential 方法;
- 明确 futility 与 safety 停止规则。
业务监控可以天天看描述指标,但确认性决策要遵守预定分析规则。
8. 协变量调整应预先指定
随机实验中,基线协变量调整可提高精度;调整后的模型仍需匹配随机化单位与聚类结构。看到结果后尝试许多协变量组合,再挑显著模型,会引入 researcher degrees of freedom。
报告未调整与预设调整结果,并说明缺失协变量处理。随机化保证的是处理分配机制,不保证每个有限样本所有协变量完全平衡。
9. 一份可审计的报告
问题与 estimand
样本来源、排除和时间窗口
分配/抽样单位与依赖结构
主指标与 MDE
预设检验、单/双侧、alpha
点估计、95% CI、原始尺度效应
p 值与多重比较方法
缺失、流失和协议偏离
敏感性与分组分析(标记探索性)
业务决策及仍未确定的范围不要只输出“显著/不显著”。例如区间 [-1.0, 7.2] 个百分点同时容纳轻微损害和有意义收益,正确结论是当前精度不足,而不是“没有效果”。
10. 置换检验也要遵守设计
置换检验通过在零假设下交换标签建立参考分布。只有可交换性成立时才有效:集群随机实验应在集群层置换,配对设计在配对内交换,分层随机应在层内置换。
标签置换检验的是分配机制或可交换性所支持的零假设。仅有均值相等,不会让方差不同的两个总体自动可交换。随机化检验、学生化统计量与受限置换适用于不同设计,零假设和重抽样方式要一起确定。
“非参数”不等于没有假设。置换单位错了,p 值同样会过于乐观。
常见误区
- 数据不正态就一律换 Mann–Whitney:它检验的分布关系不总等同均值或中位数差。
- 标准化效应有统一大小标准:业务意义取决于原始尺度和后果。
- 看结果后计算功效能解释不显著:区间和预先设计更有用。
- 只要逐个 p<0.05 就行:多重比较与可选停止会放大假阳性。
练习
- 为独立、配对和集群三种设计分别确定分析单位。
- 给一个完成率实验定义 MDE,并列出样本量计算所需输入。
- 比较 Holm 与 BH 控制的错误目标。
- 把一份只有 p 值的报告改写为可审计模板。
小结
检验是研究设计的延伸,不是数据列类型的自动函数。效应尺度、MDE、功效、多重比较和停止规则必须在结果之前确定;最终报告要展示不确定范围,而不是只给显著性标签。
下一章用线性回归组织多个变量之间的条件关系。第一步会区分预测与因果解释,避免把一个高