假设你是一支职业篮球队的助理教练,要在 100 名试训生里挑出“蒙眼神射手”:让他们蒙上眼睛,每人投一次篮,投中就算有天赋。你心想,蒙着眼纯靠运气也有 5% 的命中率,这个标准够严了吧?可如果这 100 人其实一个真本领都没有,纯靠运气,也几乎肯定会有几个人蒙中。你若当场宣布他们是“神射手”,就等于把运气当成了实力。做科学研究、跑 A/B 测试也是一样:检验的次数越多,靠运气“蒙中”的结果就越多,那些“看起来很显著”的结论,很多只是撞了大运。这篇内容要讲的,就是如何在大量检验中给“命中”加上正确的门槛——既不让运气球蒙混过关,也不把真正的神射手挡在门外。

岗位关联

掌握多重比较校正,是 AI 从业者做实验、跑模型、看指标时守住“数据可信”底线的关键能力——否则你引以为傲的每个“显著提升”,都可能是运气签下的合同。

目录
  1. 可视化演示
  2. 1. 问题起源:检验越多,运气球越多
  3. 2. 核心概念:先分清两种错误
  4. 3. 错误率指标:用哪把尺子衡量翻车
  5. 4. 邦费罗尼校正:把篮筐抬到天上去
  6. 5. 霍尔姆逐步法:排队闯关的动态门槛
  7. 6. BH 方法:允许少量鱼目混珠
  8. 7. A/B 测试实践:实验平台里的多组对决
  9. 8. 误区与选型:别让校正变成矫枉过正
  10. AI 应用场景
  11. Python 演示
  12. 常见误区
  13. 面试题

可视化演示

展示多重比较Type I错误膨胀曲线、Bonferroni校正阈值调整与BH方法FDR控制过程,支持模式切换查看错误控制策略。

本节配有交互动效(进入视口后自动加载,约 3KB)。

错误膨胀 FWER急升 alpha=0.05 1-(1-α)^m 错误率膨胀

1. 问题起源:检验越多,运气球越多

选秀日,100 个试训生排队蒙眼投篮,每人一次。小王把标准定为 5% 的运气命中率,结果居然有 6 个人投中了。他正想宣布发现了神射手,老教练一盆冷水泼下来:“你让 100 个人碰运气,就算全没天赋,也几乎肯定有人蒙进。你看到的不是天赋,是运气。”

在统计学和 A/B 测试里,“蒙眼投篮”就是一次假设检验:我们假设某个改动“没有效果”(原假设),收集数据算出 p 值,当 p 值小于 0.05 时宣布“有效果”。0.05 的显著性水平意味着:即使改动真的无效,单次检验也有 5% 的概率给出“有效果”的错误结论——这就是假阳性。

单次 5% 看着很小,但当你同时检验 m 个假设时(比如一次实验看 10 个指标、5 个版本两两对比),“至少犯一次假阳性错误”的概率会迅速膨胀。m=10 时约 40%,m=20 时约 64%,m=50 时高达 92%。这正是多重比较问题的本质:错误不会消失,只会在多次检验中累积。

所以小王的困境不是标准不够严,而是机会给得太多。要解决这个问题,要么减少同时检验的假设数量,要么把每一次的门槛抬高——接下来几节讲的 Bonferroni、Holm、BH 方法,都是在做第二件事。

P(至少一次假阳性)=1−(1−0.05)m\displaystyle P(\text{至少一次假阳性}) = 1 - (1 - 0.05)^{m}
这就是“运气累积公式”:每多一次检验,就多一次撞大运的机会。m=20 时,接近三分之二的概率会至少冤枉一次。
  1. 单次清白概率一次蒙眼投篮不中的概率是 95%,对应单次检验不误报的概率。
    1−0.05=0.951 - 0.05 = 0.95
  2. 多次连续清白m 个试训生的投篮互不影响,m 次都不中的概率就是把 0.95 连乘 m 次。
    (1−0.05)m(1 - 0.05)^{m}
  3. 取补事件至少中一次等于“不是全都不中”,所以用 1 减去全部不中的概率。
    1−(1−0.05)m1 - (1 - 0.05)^{m}

2. 核心概念:先分清两种错误

老教练递给小王一张“错误清单”:招人这件事,可能把没天赋的混子招进队,也可能把真射手放走。小王以前只盯着第一种,从没想过第二种风险。统计里的假设检验同样有两类错误,做多重比较校正之前,先要分清它们。

第一类错误叫 Type I 错误(假阳性):本来没有效果,检验却宣布了有效果。它的概率由显著性水平 α 控制,通常设为 0.05。第二类错误叫 Type II 错误(假阴性):本来有效果,检验却没发现。它的概率记为 β,而 1-β 称为统计功效,衡量检验“发现真效应的能力”。

还要修正一个常见误解:p 值不是“结论为真的概率”,而是在原假设为真的前提下,看到当前数据或更极端数据的概率。p=0.03 不代表“有 97% 的可能有效应”,只代表“如果没效应,只有 3% 的概率观察到这么极端的结果”。p 值也不代表效应大小——一个 p=0.049 的小效应可能比 p=0.0001 的大效应更值得警惕。

小王把清单贴在训练馆门口:每一次校正,都是在这两类错误之间做取舍。把门槛抬得太高,混子进不来,真射手也被挡在外面;抬得太低,球队里全是运气球。后面介绍的每种方法,本质上都是在这条权衡轴上选一个位置。

P(拒绝 H0∣H0 为真)=α\displaystyle P(\text{拒绝 } H_{0} \mid H_{0} \text{ 为真}) = \alpha
这个式子是说:Type I 错误是“在无罪前提下判了有罪”的概率,大小由你定的显著性水平 α 上锁。
  1. 条件概率符号竖线右边是前提“原假设为真”,左边是行为“拒绝了原假设”。
    P(拒绝 H0∣H0 为真)P(\text{拒绝 } H_{0} \mid H_{0} \text{ 为真})
  2. 误判行为原假设为真时本不该拒绝,拒绝了就是“冤枉好人”。
    拒绝 H0 且 H0 为真\text{拒绝 } H_{0} \text{ 且 } H_{0} \text{ 为真}
  3. 等于 α这个冤枉好人的概率恰好被你用显著性水平 α 控制在预设上限。
    =α= \alpha

3. 错误率指标:用哪把尺子衡量翻车

选拔结束复盘,老教练问小王:“你觉得怎样才算没翻车?”小王答:“一个混子都不能有。”老教练摇头:“那得把门槛抬到天上,真射手也进不了几个。也可以换个标准:允许几个混子,但保证混子比例不超过 5%。这两种标准,适用场景完全不同。”

统计学家把这两种标准形式化为两个指标。FWER(族错误率)是“m 次检验中至少出现一次假阳性”的概率,对应“零容忍”标准;FDR(错误发现率)是“所有被宣布显著的结果里,假阳性所占比例的期望值”,对应“容忍少量混子”标准。

选择原则很简单:关键决策用 FWER——比如决定新版本是否上线,一次误判代价巨大,一个混子都不能有;大规模初筛用 FDR——比如基因筛查、海量埋点指标扫描,FWER 在大 m 下会苛刻到什么都筛不出来,而 FDR 能保留更多候选供后续验证。

小王恍然大悟:选尺子就是选管理风格。管冠军球队用零容忍的 FWER,管海选训练营用控比例的 FDR。后面两节讲的校正方法,正是这两把尺子的具体实现。

FWER=P(V≥1),FDR=E[VR]\displaystyle FWER = P(V \ge 1), \qquad FDR = E\left[\frac{V}{R}\right]
其中 V 是假阳性个数,R 是被宣布显著的总个数。FWER 管“有没有混子”,FDR 管“混子占多少”。
  1. V 的定义在所有检验中,那些“本来无效应却被宣布有效应”的假阳性个数。
    V=假阳性个数V = \text{假阳性个数}
  2. R 的定义所有被宣布显著的检验总数,包含真阳性和假阳性两个部分。
    R=拒绝原假设的总个数R = \text{拒绝原假设的总个数}
  3. FWER 的语义V ≥ 1 就是至少出现一个假阳性,其概率被严格压住。
    P(V≥1)P(V \ge 1)
  4. FDR 的语义对 V/R 取期望,即检查“显著结果中被冤枉的比例”平均有多大。
    E[VR]E\left[\frac{V}{R}\right]

4. 邦费罗尼校正:把篮筐抬到天上去

老教练给出第一套方案:“既然 100 人同时投,就得把门槛按人头摊薄:每个人要投中,得达到 0.05% 的命中水平,运气球就蒙不进去了。”小王一试,果然那几个碰运气投中的全被拦下——这就是 Bonferroni(邦费罗尼)的思路:把标准严格到让运气无路可走。

Bonferroni 校正是最简单也最保守的多重比较方法。假设共有 m 个检验、显著性水平 α,它要求每个检验的 p 值必须小于 α/m 才宣布显著;等价地,把每个 p 值乘以 m 再与 α 比较。这个方法的优点是简单、稳健:无论检验之间是否独立,它都严格保证 FWER 不超过 α。

代价是保守。当检验次数很大时,α/m 会变得极小,许多真实的微小效应也会被挡在门外——就像为了拦运气球,把篮筐抬得太高,真正的射手也投不进了。所以 Bonferroni 适合检验次数少、对误报零容忍的场景,而不适合海量筛查。

小王试验后感慨:“这方法好用,就是有点'宁杀错,不放过'。”老教练点点头,又教了他一个更聪明的玩法——排队闯关。

αBonf=αm,padj=min⁡(m×p,  1)\displaystyle \alpha_{\text{Bonf}} = \frac{\alpha}{m}, \qquad p_{\text{adj}} = \min\left(m \times p, \; 1\right)
左边是“新的投篮命中线”,右边是“把运气占比乘回去”的等价算法。
  1. 总预算分摊把总的犯错预算 α 平均分给 m 次检验,每次只允许花 α/m。
    αm\frac{\alpha}{m}
  2. 从严审查某次检验的 p 值必须小于 α/m 才能宣布显著,门槛抬高了 m 倍。
    p<αmp < \frac{\alpha}{m}
  3. 等价变换把 p 值乘以 m 再和 α 比,数学上完全等价,方便报告调整后 p 值。
    padj=m×pp_{\text{adj}} = m \times p
  4. 封顶保护概率不能超过 1,所以调整后 p 值要封顶在 1。
    min⁡(m×p,1)\min(m \times p, 1)

5. 霍尔姆逐步法:排队闯关的动态门槛

老教练的新方案:“让试训生按成绩从好到差排队。第一个人用最宽松的线——0.05 除以 100;他要是没过,后面的人全部免试。他要是过了,第二个人的线收紧一点——0.05 除以 99。依次类推,直到有人没过就全部停止。”小王眼睛一亮:这种动态收线比一刀切聪明多了。

这就是 Holm 逐步下降法(Holm-Bonferroni)。先把 m 个 p 值从小到大排序:p(1) ≤ p(2) ≤ … ≤ p(m)。从最小的那个开始,依次把 p(i) 与 α/(m-i+1) 比较,一旦某个 p(i) 超线,它和它后面的全部判为不显著。排在前面、p 值最小的检验享受最宽松的分母,天然有“优先审查”待遇。

Holm 和 Bonferroni 一样控制 FWER ≤ α,但在存在真实效应时功效更高:因为最小的 p 值用的门槛和 Bonferroni 相同,而后续门槛依次放宽,不会像 Bonferroni 那样让所有检验卡在同一根最严的线上。它等于在同等错误率承诺下,多放进来几个真射手。

小王把这个“排队闯关”方法用在试训上:真射手凭实力 p 值小,排在前面用宽松的线轻松过关;运气球 p 值大多排在后面,轮到它们时线已收紧,进不去了。同样保证一个混子都进不来,Holm 放行的真材实料却比 Bonferroni 多。

p(i)≤αm−i+1\displaystyle p_{(i)} \le \frac{\alpha}{m - i + 1}
第 i 小的 p 值要与“剩余未检验次数”平分 α 后的结果比较。排名越靠前,分母越大,门槛越松。
  1. 排序编号把所有 p 值从小到大排序,p(1) 是最小(最亮眼)的那个。
    p(1)≤p(2)≤⋯≤p(m)p_{(1)} \le p_{(2)} \le \dots \le p_{(m)}
  2. 剩余名额分母轮到第 i 名时,还有 m-i+1 个检验没处理,用这个数平分 α。
    αm−i+1\frac{\alpha}{m - i + 1}
  3. 逐级闯关从 i=1 开始逐个比较,一旦某个 p(i) 超过阈值就停止。
    p(i)>αm−i+1⇒停止p_{(i)} > \frac{\alpha}{m-i+1} \Rightarrow \text{停止}
  4. 显著集合只有闯关成功的前 k 个检验被宣布显著。
    p(1),…,p(k) 显著p_{(1)}, \dots, p_{(k)} \text{ 显著}

6. BH 方法:允许少量鱼目混珠

到了海选环节,试训人数从 100 涨到 1000。老教练说:“按 Bonferroni,门槛得抬到 0.005%,真射手也进不了几个。这次换 FDR 思路:允许混子进来,但混子比例不能超过 5%。”小王按这个理念设计了新规则。

Benjamini-Hochberg(BH)程序是控制 FDR 的经典方法。同样先把 p 值升序排序,但这次从最大的 p 值开始往前找:找到最大的 k,使得 p(k) ≤ (k/m)×q,然后宣布这前 k 个检验全部显著。这里的 q 是 FDR 控制水平,通常取 0.05 或 0.1。

与 FWER 方法相比,BH 的通过线宽松得多——它允许大约 q 比例的假阳性混入显著结果,换取对真实效应更高的发现率。因此在检验次数很大、允许后续验证的场景(基因组筛查、特征筛选、广告归因指标扫描)中,BH 是最常用的选择。它要求检验间满足一定独立或弱相依条件,工程应用上一般够用。

海选结果出来,1000 人里筛出 80 个“种子”,小王心里有数:按 q=0.05,这 80 人里可能混着约 4 个运气球,但在可接受范围内。他感叹:“FWER 是精挑细选的贵族路线,FDR 是广撒网再淘金的大数据路线。”

p(k)≤km×q\displaystyle p_{(k)} \le \frac{k}{m} \times q
这里 k 是升序排名,m 是总检验数,q 是 FDR 控制水平。BH 的通过线随排名线性放宽,比 FWER 方法宽容得多。
  1. 排名占比k 是升序排名,m 是总检验数,k/m 表示当前检验在全部检验中的位置比例。
    km\frac{k}{m}
  2. 动态阈值每个排名的通过线是 (k/m)×q,排名越靠后,线越平缓上升。
    km×q\frac{k}{m} \times q
  3. 反向最大 k从最大的 p 往前扫描,找到最后一个满足条件的 k,全部取为显著。
    max⁡{k:p(k)≤kmq}\max\{k : p_{(k)} \le \frac{k}{m} q\}
  4. FDR 保证在上述判定下,显著结果中假阳性的期望占比被控制在 q 以内。
    FDR≤qFDR \le q

7. A/B 测试实践:实验平台里的多组对决

球队上线了 App,产品经理想同时试 5 种新训练方案,两两对比找出最好的。小王一算:5 个方案两两对决要测 10 次。他赶紧翻开“错误率控制手册”:10 次检验不能用单次的 0.05 判定,否则几乎有一半概率选出“假的优胜方案”。

在真实 A/B 测试平台中,多重比较几乎无处不在:多个实验组与同一对照组比较;同一实验同时监控转化率、客单价、留存、点击等多个指标;分析师按渠道、地区、人群切片反复查看 p 值。三者叠加,比较次数会爆炸式增长——n 个版本两两比较的次数是 n(n-1)/2,10 个版本就是 45 次。

工程实践上有一套约定:主指标和少数次要指标用 Holm(或 Bonferroni)控制 FWER,保证关键决策不容有失;海量埋点指标初筛用 BH 控制 FDR,保住探索性分析的空间;实验管理平台在后台预设校正规则,自动计算调整后 p 值,防止分析师“挑着看 p 值”。

小王把规则写进实验平台的配置:多组对比自动套 Holm,海量指标自动套 BH,主指标用 FWER 把关。从此产品经理再想“多试几组碰运气”,平台会自动抬高门槛——运气球没那么容易蒙混过关了。

C(n,2)=n(n−1)2\displaystyle C(n, 2) = \frac{n(n-1)}{2}
n 个版本两两对决的次数。5 个版本是 10 次,10 个版本就变成 45 次——这就是为什么不做校正会出大事。
  1. 组合数定义从 n 个版本中任选 2 个进行比较的组合数。
    (n2)\binom{n}{2}
  2. 化简公式组合数等于 n(n-1)/2,分子是“选第一个 × 剩下的 n-1 个可选”。
    n(n−1)2\frac{n(n-1)}{2}
  3. 增长直觉n=5 时是 10,n=10 时是 45,n=20 时是 190,检验次数平方级增长。
    5→10,10→455 \to 10, \quad 10 \to 45

8. 误区与选型:别让校正变成矫枉过正

赛季结束,小王发现同行们常走两个极端:一种人不管什么场景一律 Bonferroni,把刚萌芽的真实效果全过滤掉;另一种人从不做校正,报告里全是“显著提升”,一上线就翻车。老教练总结:“工具没有好坏,只有用错场合。”

校正方法的选择本质是错误成本与发现能力的权衡。检验次数少、单次决策代价高(如是否发版、是否加仓),选 FWER 方法;检验次数大、允许后续验证(如初筛候选特征、扫描风险指标),选 FDR 方法。同时要记住:校正只调整证据门槛,不改变效应量——调整后 p 值显著不代表效应大,不显著也不代表效应为零。

报告规范同样重要:实验报告中应同时给出原始 p 值、所用校正方法、调整后 p 值及置信区间。样本量规划也要提前考虑校正:若预期做 m 次检验,功效分析中的显著性水平应代入 α/m,否则检验功效会低于预期。

小王把这段话写进团队手册:“校正不是诅咒,而是把'我发现了规律'这句话变得可信的安检。选对了标准,你既不会放过真射手,也不会让运气球混进首发名单。”

padj=min⁡(1,  m×p)\displaystyle p_{\text{adj}} = \min\left(1, \; m \times p\right)
Bonferroni 调整后 p 值的最终形式:超过 1 就按 1 算,表示“证据彻底不显著”。
  1. 原始证据放大把原始 p 值乘上检验次数,模拟“运气机会被重复 m 次”后的强度。
    m×pm \times p
  2. 上限截断概率值最大为 1,超过 1 的调整后 p 值没有意义,直接取 1。
    min⁡(1,m×p)\min(1, m \times p)
  3. 报告语义调整后 p 值可以直接与 α 比较,无需再除以 m,方便在论文和平台中汇报。
    padj<α⇔p<αmp_{\text{adj}} < \alpha \Leftrightarrow p < \frac{\alpha}{m}

AI 应用场景

场景一:多组实验同时上线的版本裁决

阶段:实验评估与决策

解决的问题:算法团队一次上线 5 个候选排序模型,分别与旧模型两两对比。若每个对比都用 p<0.05 判定,10 次检验会产生约 40% 的全局假阳性风险,可能把一个“运气好”的模型推上线。MLOps 实验平台内置 Holm 校正后,只有真正稳健的模型能通过。

具体案例:某推荐系统团队在平台上同时运行 6 个实验,平台自动将两两比较次数记为 C(6,2)=15,主指标使用 Holm 校正(FWER=0.05),辅指标用 BH 控制 FDR。最终 2 个模型通过校正门槛上线,其余 4 个在下一批次中复测后再定。

场景二:特征筛选中的海量统计检验

阶段:特征工程与数据治理

解决的问题:构建模型前对 500 个候选特征逐一做与目标的关联性检验,若不做校正,按 0.05 水平会有约 25 个特征纯粹靠运气显著,污染特征工程。用 BH 控制 FDR 后,进入模型的只有真正有效的特征。

具体案例:信贷风控团队对 800 个特征做卡方检验,使用 BH(q=0.1)筛出 46 个候选特征,再经 LASSO 二次筛选。相比不校正时筛出的约 70 个特征,显著减少了冗余和过拟合风险。

场景三:数据质量监控的告警洪峰治理

阶段:数据可信层监控与运维

解决的问题:数据管道每分钟对 40 个质量指标做异常检测,单指标 5% 误报率会导致每小时产生大量误报告警,监控团队被“狼来了”淹没。应用 Holm 或 FDR 校正后,误报数量显著下降,告警恢复可解释性。

具体案例:某数据中台对 40 个新鲜度、完整性、一致性指标做检测,采用 Holm 校正后将单批次误报期望从约 2 个降到 0.05 个以下,值班团队每天排查的告警从 200 多条降到 15 条。

Python 演示

python61 行
import numpy as np  def bonferroni(pvals, alpha=0.05):    m = len(pvals)    adjusted = [min(p * m, 1.0) for p in pvals]    return adjusted, alpha / m  def holm_bonferroni(pvals, alpha=0.05):    m = len(pvals)    order = np.argsort(pvals)    sorted_p = pvals[order]    adjusted = np.empty(m)    prev = 0.0    for i in range(m):        prev = max(prev, (m - i) * sorted_p[i])        adjusted[i] = prev    result = np.empty(m)    result[order] = adjusted    return result.tolist()  def benjamini_hochberg(pvals, q=0.05):    m = len(pvals)    order = np.argsort(pvals)    sorted_p = pvals[order]    adjusted = np.empty(m)    nxt = 1.0    for i in range(m - 1, -1, -1):        nxt = min(nxt, sorted_p[i] * m / (i + 1))        adjusted[i] = nxt    result = np.empty(m)    result[order] = adjusted    return result.tolist()  def main():    rng = np.random.default_rng(42)    m = 20    pvals = []    for k in range(m):        if k < 5:            pvals.append(rng.exponential(0.008))   # 真实效应, p 值很小        else:            pvals.append(rng.uniform(0, 1))        # 零假设为真, p 值均匀分布    pvals = np.array(pvals)    alpha = 0.05    naive = int(np.sum(pvals < alpha))    print("原始 p 值:", np.round(pvals, 4))    print("未校正显著数:", naive)    bonf_p, bonf_thr = bonferroni(pvals, alpha)    print("Bonferroni 阈值:", round(bonf_thr, 4), "显著数:", int(np.sum(bonf_p < alpha)))    holm_p = holm_bonferroni(pvals, alpha)    print("Holm 调整后显著数:", int(np.sum(holm_p < alpha)))    bh_p = benjamini_hochberg(pvals, alpha)    print("BH 调整后显著数:", int(np.sum(bh_p < alpha)))  if __name__ == "__main__":    main()
目的:模拟 20 个假设检验(5 个真实效应 + 15 个纯噪声),对比未校正、Bonferroni、Holm、BH 四种判定的显著结果数量。
  1. pvals.append(rng.exponential(0.008))真实效应产生很小的 p 值,模拟“真射手”
  2. pvals.append(rng.uniform(0, 1))零假设为真时 p 值均匀分布,模拟“运气球”
  3. naive = int(np.sum(pvals < alpha))未校正时的显著数,通常包含运气球
  4. adjusted = [min(p * m, 1.0) for p in pvals]Bonferroni 调整 p 值并封顶
  5. prev = max(prev, (m - i) * sorted_p[i])Holm 累计最大值,保证调整后 p 值单调不减
  6. nxt = min(nxt, sorted_p[i] * m / (i + 1))BH 反向扫描累计最小值,控制 FDR

常见误区

误区我每次检验都保证 p<0.05,整批实验下来错误率就是 5%,每个显著结果都可以放心写进报告。

正解0.05 只是单次检验的条件错误率,不是全局错误率。做 20 次独立检验,即使全无真实效果,也有约 64% 的概率出现至少一个 p<0.05 的“运气球”。需要把 0.05 看成“单枪命中率”,多开几枪后必然有蒙中的。

为何常见:教材先教单次检验,人脑对“5% 很小”有直觉,但对概率随检验次数指数累积缺乏感知。

误区我做了 Bonferroni 校正,调整后 p 值还是大于 0.05,说明这个指标根本没有真实效应。

正解Bonferroni 把阈值压到 α/m,非常保守,会大幅降低检验功效。p 不显著只能说明“在极其严格的标尺下证据不足”,不能否定真实存在的微小效应。想确认小效应,应当增大样本量或改用功效更高的 Holm 法。

为何常见:把“未拒绝原假设”误读为“接受原假设”,忽视了校正方法与样本量对功效的影响。

误区BH 和 Bonferroni 都是把 p 值门槛调一调,选一个看起来“差不多”的用就行。

正解两者控制的对象完全不同:Bonferroni 控制 FWER(至少一次假阳性的概率),BH 控制 FDR(假阳性在显著结果中的占比期望)。关键决策要用 FWER,海量初筛用 FDR,选错会导致错误的率承诺落空——比如你以为在控制“零误报”,实际允许了 5% 的混子。

为何常见:只看到“数值变小了”的表象,没有理解背后的错误率定义差异。

误区我就跑一个 A/B 测试,一组实验一个指标两个版本,不存在多重比较问题,不用校正。

正解只要同时评估多个假设就有多重比较问题。同一个实验里看转化率、留存、点击、收入等多个指标,或按渠道、地区、人群反复看 p 值,比较次数都会迅速膨胀,同样需要预先指定主指标并做校正。

为何常见:把“多重比较”误认为“多个实验”,忽略了一个实验内多指标、多版本、多切片的隐含比较。

面试题

Q1. 统计假设检验中,Type I 错误是指?

单选题 · easy

  • A.把真实效应误判为无效应
  • B.把无效应当作有效应报告← 正确答案
  • C.由于样本量不足导致的偏差
  • D.实验分组不随机导致的偏差

答案:B。Type I 错误(假阳性)是“本来没有效应却宣布有效应”,就像把一个没天赋的混子招进队。A 是 Type II 错误(假阴性),C、D 属于实验设计问题而非检验错误。

Q2. 在 α=0.05、检验相互独立条件下,做 20 次检验至少出现一次假阳性的概率约为?

单选题 · easy

  • A.约 36%
  • B.约 64%← 正确答案
  • C.约 5%
  • D.约 95%

答案:B。根据运气累积公式,1-(1-0.05)^20 ≈ 1-0.358 ≈ 64%。这说明 20 次检验下,全局假阳性风险远超单次的 5%,这正是必须做多重比较校正的原因。

Q3. Bonferroni 校正是如何调整显著水平的?

单选题 · mid

  • A.将 α 除以检验总次数 m← 正确答案
  • B.将 p 值乘以样本量 n
  • C.将 α 乘以检验次数 m
  • D.剔除最大的 m 个 p 值

答案:A。Bonferroni 把显著性水平 α 均分给 m 次检验,要求每次的 p 值小于 α/m 才算显著,等价于把 p 值乘以 m。它严格控制 FWER ≤ α。

Q4. 与 Bonferroni 相比,Holm 逐步法的主要优点是?

单选题 · mid

  • A.控制错误率时检验功效更高← 正确答案
  • B.无需对 p 值进行排序处理
  • C.可以完全消除假阴性错误
  • D.只适用于单尾检验场景

答案:A。Holm 把 p 值排序后逐步放宽门槛,同样控制 FWER,但在有真实效应时能多发现一些真效应,功效高于 Bonferroni。它仍需要排序,也无法消除假阴性。

Q5. FWER(族错误率)的准确定义是?

单选题 · mid

  • A.至少出现一次假阳性的概率← 正确答案
  • B.假阳性占显著结果的比例期望
  • C.重复检验中阳性结果的均值
  • D.所有检验出错概率的简单加总

答案:A。FWER 是“零容忍”类指标,管的是 V≥1 的概率;B 描述的是 FDR(错误发现率),C、D 都不是标准定义。

Q6. 对 100 个指标用 BH 法在 q=0.05 下筛出 20 个显著指标,下列说法正确的有?

多选题 · hard

  • A.这 20 个指标全部为真实效应
  • B.假阳性占比期望约为 5%← 正确答案
  • C.无法逐一确认每个指标真假← 正确答案
  • D.假阳性个数期望约为 20 个

答案:BC。BH 控制 FDR,即显著结果中假阳性占比的期望约为 q=5%,因此 B 对。FDR 是整体比例承诺,不代表每个指标都为真,C 对。A 过于绝对,D 混淆了比例与个数。

Q7. 关于 FWER 与 FDR 的选用,下列说法正确的是?

单选题 · mid

  • A.FWER 适合关键决策场合← 正确答案
  • B.FWER 适合大规模初筛场合
  • C.FDR 比 FWER 更加保守
  • D.FDR 用于控制假阴性错误

答案:A。关键决策(如是否上线放量)不容许任何误报,应当控制 FWER;大规模初筛允许少量误报求发现率,用 FDR。C、D 说法均错误。

Q8. 5 个实验版本两两对比,一共要进行多少次检验?

单选题 · easy

  • A.5 次比较
  • B.10 次比较← 正确答案
  • C.20 次比较
  • D.25 次比较

答案:B。两两比较次数为 C(5,2)=5×4/2=10 次。检验次数随版本数平方级增长,所以多版本实验尤其需要校正。

Q9. 下列哪些情况会引入多重比较问题?

多选题 · mid

  • A.多个实验组与同一对照组比较← 正确答案
  • B.同一实验同时监控多个指标← 正确答案
  • C.按多种维度切片反复看 p 值← 正确答案
  • D.预先指定唯一主指标后检验

答案:ABC。多组对比、多指标监控、多维切片都会使同时检验的假设数量膨胀;D 只做一次预设检验,不引入多重比较。

Q10. 关于 Bonferroni 校正的代价与局限,下列说法正确的有?

多选题 · hard

  • A.控制 FWER 时检验功效下降← 正确答案
  • B.检验次数越多门槛越严苛← 正确答案
  • C.真实的微小效应可能被漏报← 正确答案
  • D.校正后假阳性概率仍然上升

答案:ABC。Bonferroni 把门槛压到 α/m,会损失功效,真实的微小效应容易被漏报,检验次数越多越严苛,A、B、C 都对;校正后 FWER 已被控制,假阳性概率不会继续上升,D 错。