你是一家大型体检中心的主任。过去体检只有“血压”这一项检查,误报率5%——每100个健康人里,大约5个人会收到“血压异常”的通知,大家觉得可以接受。后来体检中心推出“200项全面体检套餐”,每一单项的检查规则不变,结果彻底乱套了:一个完全健康的人,至少一项指标被误报的概率竟然高达99.97%!几乎人人都会收到“疑似异常”的短信。体检中心电话被打爆,全是愤怒的健康人。 问题出在哪?单项检查都很合理,但“检验次数变多”这件事本身,让错误悄悄累积起来。统计学家把这种“同时做一堆检验”的场景叫作多重检验,并发展出两类对策:一类像军事化管理的主任,把误报预算切碎分给每一项,宁缺毋滥,这就是Bonferroni校正;另一类像精明务实的大夫,接受少量误报,但保证整张报告单里误报的占比不超过5%,这就是错误发现率(FDR)控制。 这篇文章,我们就用体检中心的日常,把这两套策略的原理、算法和选择方法讲透。

岗位关联

多重检验校正是数据从业者的“防误报闸门”——掌握它,你才能在基因筛选、A/B测试、高维特征选择等批量决策中,既不被假阳性淹没,也不漏掉真信号。这是证明你的结论可信的专业壁垒。

目录
  1. 可视化演示
  2. 多重检验问题
  3. 家族错误率FWER
  4. Bonferroni校正
  5. 错误发现率FDR
  6. BH控制流程
  7. q值解释应用
  8. 策略选择场景
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

展示系统处理流水线、实时性能指标曲线及多方案对比分析,包含数据流转、吞吐延迟监控与方案评估。

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

系统可视化 处理流程:输入→处理→模型→输出 性能监控:实时指标 P=L×T

多重检验问题

体检中心的崩溃从一张“200项套餐”开始。单项血压检查的误报线是5%,大家都懂:每100个健康人来测,总有5个会被“误伤”。可当一个人一天之内做200项检查,每一项都按5%误报,情况就完全不同了。体检中心的医生们最初很委屈:我们每一项检查都按规范来啊,怎么患者全在投诉?

这是因为:当检验次数变多,错误会在“整体”层面累积。假设检验里,每次检验都有一个默认立场,统计学家叫原假设——对体检来说,原假设就是“这个人没病”。p值回答的问题是:假设“没病”为真,我们却看到当前这么离谱的指标的概率。p值小于5%我们就报警(拒绝原假设),但这个报警有5%的可能冤枉好人。一次检验被冤枉5%,两百次检验里“至少被冤枉一次”的概率,就不能再按5%算了。

回到体检中心,主任终于明白:单项检查没毛病,是“检查太多”让误报变成必然。问题锁定在“整体”层面,接下来要设计一套针对整个套餐的质量控制规则。

P(至少一个假阳性)≈m×0.05P(\text{至少一个假阳性}) \approx m \times 0.05
这个近似公式是说:检验次数m越大,误报风险线性飙升。做10次检验,“至少冤枉一次”的概率已经接近一半。
  1. 假阳性事件每做一次检验,都有5%概率把健康人误报成异常,这是“一次假阳性”。
    P(单次假阳性)=α=0.05P(\text{单次假阳性}) = \alpha = 0.05
  2. 线性放大直觉如果粗略相加,m次检验的误报风险约等于单次误报率乘以次数,这是理解“为什么检验多会出事”的捷径。
    P(至少一个假阳性)≈m×αP(\text{至少一个假阳性}) \approx m \times \alpha
  3. 近似的前提这个近似只在α很小且m不太大时准确,但它足以揭示本质:检验次数是误报的放大器。
    m=200⇒200×0.05=10m = 200 \Rightarrow 200 \times 0.05 = 10

家族错误率FWER

主任给体检中心定了新规矩:整份套餐作为“一家人”,不管多少项检查,整个家族至少犯一次“冤枉健康人”错误的概率必须控制在5%以内。统计学家把这条规矩称为家族错误率(Family-Wise Error Rate, FWER)——它盯着的是“至少一个假阳性”这种整体事故。

这个概念和单次检验的区别,就像“个人违章”与“全公司事故率”:个人违章率可以很低,但全公司几百人每年总归要出几起事故。FWER正是把整个检验批次当作一个整体来问责的指标。m=1时,FWER就等于单次α;m越大,同样的5%单次阈值下,家族错误率会被指数引爆。

主任看到这组数字倒吸一口凉气:不设防的套餐会把体检中心变成“惊吓制造机”。保住“家族荣誉”的唯一办法,是给每次检验都戴上更严格的紧箍咒。

FWER=1−(1−α)m=1−(0.95)m\mathrm{FWER} = 1-(1-\alpha)^m = 1-(0.95)^m
这就是“至少一个假阳性”的精确公式:用1减去“全部检验都乖乖正常”的概率。m=20时,FWER已高达64.2%。
  1. 家族事故定义FWER说的是“这一整批检验里,至少出现一次假阳性”的概率,任何单个误报都算家族事故。
    FWER=P(至少一个假阳性)\mathrm{FWER} = P(\text{至少一个假阳性})
  2. 反面转化“至少一次”的反面是“一次都不发生”,所以用1减去全部正常的概率。
    FWER=1−P(全部不误报)\mathrm{FWER} = 1 - P(\text{全部不误报})
  3. 独立连乘单次检验不误报的概率是1-α,m次都不误报则是它连乘m次。α=0.05时就是0.95的m次方。
    P(全部不误报)=(1−α)m=(0.95)mP(\text{全部不误报}) = (1-\alpha)^m = (0.95)^m
  4. 数值冲击m=5时约0.226,m=10时约0.401,m=20时约0.642——健康人已经过半收到误报。
    FWER(20)=1−0.9520≈64.2%\mathrm{FWER}(20) = 1-0.95^{20} \approx 64.2\%

Bonferroni校正

最直接的思路是“预算分摊”:既然整个套餐的误报预算只有5%,那就把这5%平均分给200项检查,每项检查的报警线从0.05降到0.05/200=0.00025。也就是说,单次检查必须出现极其离谱的异常才允许报警。这就是Bonferroni校正,由意大利数学家Carlo Bonferroni提出,是控制FWER最经典的方法。

它的逻辑非常朴素:每个检验占用一份“误报预算”,m份预算加起来不超过总预算。只要每项检验的阈值严格按α/m执行,即便每一项都最坏情况地误报,m项加总的家族错误率也顶多等于α。它靠一个简单的不等式做保证:多个事件“至少一个发生”的概率,永远不会超过这些事件单独概率之和。

体检中心发现Bonferroni有点“用力过猛”:报警线压到0.00025后,健康人确实不再被吓到,但一些指标只超出正常范围一点点的早期病变患者也被放过了——这叫假阴性,统计上叫统计功效下降。严格到近乎苛刻,代价是“漏掉真病”。

α′=αm,FWER≤m×αm=α\alpha' = \frac{\alpha}{m}, \qquad \mathrm{FWER} \le m \times \frac{\alpha}{m} = \alpha
这个公式说明Bonferroni把α平均切分给m次检验后,无论检验之间怎么纠缠,家族错误率都被牢牢锁在α以内。代价是:阈值变得极严。
  1. 预算切分将总显著性水平α平均分给m次检验,单次阈值变为α/m。
    α′=αm\alpha' = \frac{\alpha}{m}
  2. 并集上界利用Bonferroni不等式——若干事件并集的概率不超过各事件概率之和,这是保证“分摊后总预算不超支”的数学依据。
    P(⋃i=1mAi)≤∑i=1mP(Ai)P\left(\bigcup_{i=1}^{m} A_i\right) \le \sum_{i=1}^{m} P(A_i)
  3. 代入验证把每个检验的误报概率α/m代入不等式右边,恰好凑回总预算α。
    FWER≤∑i=1mαm=α\mathrm{FWER} \le \sum_{i=1}^{m} \frac{\alpha}{m} = \alpha

错误发现率FDR

老主任正在纠结,一位务实的大夫提出新方案:“为什么非要整个套餐零误报?我们真正在意的是——患者收到的所有异常提醒里,误报占多少?如果10条异常里误报不超过半条,患者完全可以接受。”这个思路就是错误发现率(False Discovery Rate, FDR):在所有被我们判定为“阳性”(异常)的结果中,假阳性所占比例的期望。

与FWER对比:FWER像“一锅粥绝不能有一颗老鼠屎”,FDR则允许粥里偶尔有异物,但要求异物占比足够低。放在基因表达研究中:两万多个基因同时做差异检验,如果用Bonferroni,阈值小到5e-7量级,只有极其夸张的差异才能通过;用FDR,则允许几千个基因进入候选列表,其中假阳性占比控制在5%左右。对探索性研究来说,FDR能保住更多真实信号。

体检中心最终采纳了新KPI:不再追求“零误报”,而是保证“报警单里误报占比≤5%”。这个指标友好得多——但怎么在算法层面实现“按占比控制”?主任把目光投向了那堆待处理的p值。

FDR=E[VR]\mathrm{FDR} = E\left[\frac{V}{R}\right]
V是假阳性个数(被冤枉的健康人),R是所有被拒绝的阳性总数(收到的报警单)。FDR管的是“报警单中误报的比例”,而不是“至少一条是误报”。
  1. 分子VV表示被错误拒绝的原假设个数,即被冤枉的“健康人”数量。
    V=#{实际无效却被判为显著}V = \#\{\text{实际无效却被判为显著}\}
  2. 分母RR表示所有被拒绝的检验总数,即体检中心发出的全部“异常报警单”。
    R=#{所有被判为显著的结果}R = \#\{\text{所有被判为显著的结果}\}
  3. 误报占比V/R是这批报警单中误报的比例,当R=0时该比值规定为0。
    VR(当R=0时为0)\frac{V}{R} \text{(当}R=0\text{时为0)}
  4. 期望取均值FDR是对“这个比例”求期望,意味着长期重复这套流程,误报占比的平均水平被控制在阈值内。
    FDR=E[VR]\mathrm{FDR} = E\left[\frac{V}{R}\right]

BH控制流程

发现FDR这个目标后,统计学家Benjamini和Hochberg在1995年给出了一套简洁的控制流程,被称为BH procedure。它的操作像“按可疑程度排队复查”:把所有检验的p值从小到大排成一队,p值最小的排最前(最可疑),然后从队首开始逐个检查,给每个位置画一条逐渐抬高的“警戒线”:排在i位的p值,对应的合格线是(i/m)α。越往后,警戒线越宽松。

BH的聪明之处在于:它不像Bonferroni那样给所有人都画一条同样苛刻的线,而是承认“p值越小越可疑”,只有那些排在队首、且足够低于警戒线的检验才被拒绝。实际操作中,我们从队尾往前找:找到最后一个满足“p值小于等于自己的警戒线”的位置k,然后整队前k个全部判为显著。后面的统统放行。

体检中心按这套流程整理体检报告:最可疑的10项重点复查,可疑程度不够的一律不打扰。相比Bonferroni把所有项目的报警线都压到极低,BH像一位按嫌疑程度分级排查的侦探——误报率不超标,真信号也没被漏掉。

p_{(1)} \le p_{(2)} \le \cdots \le p_{(m)}, \qquadk = \max\left\{ i \,\middle|\, p_{(i)} \le \frac{i}{m}\alpha \right\}
直觉地说:把p值从小到大排队后,逐个比较“这个p值是否低过自己的动态阈值(i/m)α”,最后一个合格者的序号k就是分界点,前k个全部拒绝。这就是FDR控制的落地算法。
  1. 升序排序把m个p值按从小到大排列,下标(i)表示“第i小”,位置越靠前越可疑。
    p(1)≤p(2)≤⋯≤p(m)p_{(1)} \le p_{(2)} \le \cdots \le p_{(m)}
  2. 动态警戒线第i位的检验,其合格标准不是固定α,而是随名次抬高的(i/m)α。
    第 i 位阈值=imα\text{第 }i\text{ 位阈值} = \frac{i}{m}\alpha
  3. 找最大序号从i=1到m逐个检查,找到最后一个“p值不超过警戒线”的位置k。
    k=max⁡{i | p(i)≤imα}k = \max\left\{ i \,\middle|\, p_{(i)} \le \frac{i}{m}\alpha \right\}
  4. 整段拒绝拒绝前k个假设,也就是只保留“最可疑的那一批”,其余全部放行。
    拒绝 H(1),H(2),…,H(k)\text{拒绝 } H_{(1)}, H_{(2)}, \ldots, H_{(k)}

q值解释应用

BH流程给出了“拒绝哪些”,但患者还想要一个更直观的东西:每一项异常结果,能不能给我一个“误报风险评分”?这就是q值。q值是p值经过BH校正后的版本,它的含义是:如果把这个结果当作阳性,那么在所有被判定为阳性的结果中,假阳性占比的最小FDR水平。

打个比方:一份体检报告上,基因A旁边的q=0.01,意味着“如果把包括基因A在内的这批阳性结果都当真,这堆阳性结果里期望的误报比例约1%”。q值越小,这个结果越可信。它和p值的关系类似“海关检验升级版”:p值回答“单看这一项,正常到反常的概率”,q值回答“把它放进阳性清单后,整张清单的含假量”。

现在,体检中心的每张“异常提醒”上都贴了一张q值标签:q小于0.05的才真正出现在最终报告里。患者看到“q=0.03“就知道:这条异常提醒背后,整套阳性清单的误报比例期望约3%。探索阶段的海量筛选,从此有了科学的”风险价签”。

q(i)=min⁡j≥i(mj p(j)),q(i)∈[0,1]q_{(i)} = \min_{j \ge i} \left( \frac{m}{j}\, p_{(j)} \right), \quad q_{(i)} \in [0,1]
在BH流程中,第i小的p值对应的q值,是“从第i位往后所有位置上(m/j)·p值”的最小值。这个从后往前的取min操作,保证了q值随p值增大而单调不减。
  1. 原始调整量对排在第j位的p值,先放大m/j倍,这就是“如果以第j位为分界点”对应的FDR水平。
    mj×p(j)\frac{m}{j} \times p_{(j)}
  2. 向后取最小为了让q值在排序上保持单调(p值越大q值越大),从j=i开始向队尾扫描,取所有候选值中的最小值。
    q(i)=min⁡j≥i(mjp(j))q_{(i)} = \min_{j \ge i}\left(\frac{m}{j}p_{(j)}\right)
  3. 夹取范围q值本质是FDR水平,不能超过1,也不能为负,计算后统一夹到[0,1]之间。
    q(i)=min⁡(q(i),1)q_{(i)} = \min(q_{(i)}, 1)
  4. 软件里的padj在DESeq2、limma等生信工具输出的"padj"列,就是应用BH流程后的q值,通常直接与0.05比较。
    padj<0.05⇔q<0.05\text{padj} < 0.05 \Leftrightarrow q < 0.05

策略选择场景

主任把这么多方法摆在桌上,终于开始思考一个现实问题:到底什么时候用Bonferroni,什么时候用FDR?答案取决于“犯错的代价”。如果这是给患者下最终诊断——误报一个健康人患癌,代价是巨大的心理伤害和过度治疗——必须用FWER级别的零容忍,Bonferroni当仁不让。但如果这是体检中心做疾病初筛,目的是“尽量别漏掉可疑分子”,后续还有复查确认,那FDR更合适。

在实践中,这个选择有清晰的行业惯例。全基因组关联分析(GWAS)要对上百万个基因位点做检验,用Bonferroni“百万预算分摊”后得到经典阈值5×10⁻⁸,这被视作“全基因组显著”的金标准。而在RNA-seq差异表达基因筛选中,研究者更关心“找到一批候选基因做后续验证”,于是几乎清一色用BH控制的FDR。大型A/B测试平台同时跑几十个实验、每个实验看多个指标,同样用FDR控制误报,避免“实验做得越多、假胜利越多”。

体检中心的《质量控制手册》就此定稿:最终确诊用FWER守门,宁可放过一千不可冤枉一个;初筛探索用FDR把门,宁可多报一些、交由复查去伪存真。多重检验校正从来不是“哪个方法更高级”,而是“哪个方法更匹配你的决策代价”。

αGWAS=0.05106=5×10−8\alpha_{\text{GWAS}} = \frac{0.05}{10^6} = 5 \times 10^{-8}
这是Bonferroni思想在GWAS中的经典应用:一百万次检验,每次分到5×10⁻⁸的显著性预算,成为遗传学界的“雷打不动”阈值。
  1. 检验规模全基因组扫描中约有一百万个独立遗传位点,相当于一次体检做了一百万项检查。
    m=106m = 10^6
  2. 预算分摊用Bonferroni把5%的家族错误率预算分给每一个位点。
    α位点=0.05106\alpha_{\text{位点}} = \frac{0.05}{10^6}
  3. 金标准阈值算出5×10⁻⁸后,任何p值小于这个数的位点才被宣布“全基因组显著”。
    5×10−8=0.000000055 \times 10^{-8} = 0.00000005

AI 应用场景

场景一:RNA-seq差异表达基因筛选

阶段:组学数据统计推断

解决的问题:转录组测序一次检测约2万个基因的表达量,若对每个基因单独做t检验并沿用p<0.05,两万个检验下即使没有任何真实差异,也会产生约1000个假阳性基因。传统做法“只报p<0.05”会把后续实验验证经费烧在噪音上。

具体案例:生物信息学分析师用DESeq2对“用药组vs对照组”做差异表达分析。软件内部对每个基因输出baseMean、log2FoldChange,以及经过BH校正的padj。分析师筛选“|log2FoldChange|>1且padj<0.05”的基因进入下游富集分析,最终锁定与药物通路相关的30个候选基因。

场景二:大规模A/B测试平台的多指标监控

阶段:增长实验设计与分析

解决的问题:互联网公司同时运行几十个A/B实验,每个实验又监控转化率、点击率、收入等多个指标。若每个指标单独用p<0.05判断“实验有效”,实验次数×指标数的组合会让假阳性率爆炸式上升,“假胜利”层出不穷。

具体案例:某增长团队用BH-FDR方法对所有实验的全部指标统一校正,将FDR控制在5%以内。上线决策时,只有q值低于0.05的指标才被标记为“显著提升”,实验报告自动标注校正方法和q值,避免产品经理误读未校正p值。

场景三:高维特征筛选与模型解释

阶段:特征工程与特征选择

解决的问题:在风控或推荐场景中,原始特征动辄上千维。对每个特征做与目标的独立性检验时,不校正会导致大量与目标无关的特征被误判为“重要”,污染后续模型训练和SHAP可解释性分析。

具体案例:机器学习工程师对1200个候选特征做Spearman相关检验后,用BH校正得到q值,仅保留q<0.01的200个特征进入模型。相比未校正时直接选top300,校正后特征集合的稳定性明显提升,线上AUC波动显著下降。

Python 演示

python50 行
"""Benjamini-Hochberg FDR 校正与 Bonferroni 对照示例"""import numpy as np  def bh_fdr(p_values, alpha=0.05):    p = np.asarray(p_values, dtype=float)    m = len(p)    order = np.argsort(p)    sorted_p = p[order]    ranks = np.arange(1, m + 1)     # q 值: p * m / rank, 再做保序修正(从后向前累计最小)    q = sorted_p * m / ranks    q = np.minimum.accumulate(q[::-1])[::-1]    q = np.clip(q, 0.0, 1.0)     # 找最大的 k: p_(k) <= (k/m) * alpha    ok = sorted_p <= (ranks / m) * alpha    k = int(np.max(np.where(ok)[0])) + 1 if ok.any() else 0    reject = np.zeros(m, dtype=bool)    reject[order[:k]] = True     q_original = np.empty(m)    q_original[order] = q    return q_original, reject, k  def bonferroni_adjust(p_values):    p = np.asarray(p_values, dtype=float)    m = len(p)    return np.clip(p * m, 0.0, 1.0)  if __name__ == "__main__":    rng = np.random.default_rng(42)    m = 1000    pvals = rng.random(m)          # 990 个纯噪音    pvals[:30] *= 1e-3             # 前 30 个是真实效应     q_bh, rej_bh, k_bh = bh_fdr(pvals)    p_bon = bonferroni_adjust(pvals)    rej_bon = p_bon < 0.05     print("BH 拒绝 %d 个, Bonferroni 拒绝 %d 个" % (rej_bh.sum(), rej_bon.sum()))    print("真实效应中被发现: BH %d 个, Bonferroni %d 个"          % (rej_bh[:30].sum(), rej_bon[:30].sum()))    print("噪音被误报: BH %d 个, Bonferroni %d 个"          % (rej_bh[30:].sum(), rej_bon[30:].sum()))    print("BH q 值前 5 个:", q_bh[:5].round(4))    print("Bonferroni 调整 p 值前 5 个:", p_bon[:5].round(4))
目的:用1000个p值(含30个真实效应)对比BH-FDR与Bonferroni两种校正方法,展示FDR如何发现更多真实信号同时控制误报。
  1. order = np.argsort(p)获取p值从小到大的排序索引,后续要把排序后的q值映射回原始顺序。
  2. q = sorted_p * m / ranksBH q值的核心计算:p值乘以检验总数、除以排名序号,排名越靠前的p值放大越少。
  3. q = np.minimum.accumulate(q[::-1])[::-1]从队尾向队首做累计最小值,确保q值随p值增大而单调不减。
  4. ok = sorted_p <= (ranks / m) * alpha判断每个排序位是否满足“p值低于自己的动态阈值”,等价于BH的逐位比较。
  5. reject[order[:k]] = True找到最大合格位k后,把前k个检验映射回原数组并标记为“拒绝”,这是BH的最终决策。

常见误区

误区我知道Bonferroni是把显著性水平除以m,那FDR的q值是不是就是把每个p值乘以m?都是“乘个m”,应该差不多吧?我写代码时直接把所有p值乘m当q值用了。

正解p×m是Bonferroni调整后的p值,它控制FWER;BH的q值公式是p×m/rank,再对排序做保序修正。打个比方:Bonferroni是“给每个患者都发同一份严格到苛刻的检查单”,BH是“按可疑程度排队后,按名次给每个人不同的合格线”。两者方向完全不同,混用会把FDR算成错误的结果。

为何常见:两个方法都出现“乘以m”字样,初学者只记住了数字变换,忽略了分子分母里的排序名次这个关键差异。

误区一个基因的q=0.05,那我可以说“这个基因有5%的概率是假阳性”吗?每个被标记显著的单个结果,都应该有5%的出错概率吧。

正解不行。FDR是“所有阳性结果的集合里,假阳性所占比例的期望”,它描述的是群体属性、不是单个结果的后验概率。就像体检中心说“异常报告里约5%是误报”,指的是整摞报告单的含假量,而不是“手头这张单子有5%概率是误报”——单张报告要么真要么假,不存在5%的真假混合状态。

为何常见:人们习惯把集合层面的比例直觉套到个体上,混淆了“比例的期望”与“个体的概率”。

误区既然多重检验这么容易误报,那我全部用最严格的Bonferroni校正准没错。严格一点,宁可漏掉一些也不能报错。

正解严格不等于安全。Bonferroni把阈值压到α/m后,统计功效大幅下降,大量真实的弱效应会被漏掉。在探索性场景里,这等同于花钱做了体检却放过早期病变。FDR的提出正是为了平衡“误报”与“漏报”。正确的选择逻辑是看决策代价:确认性决策用FWER,初筛探索用FDR,而不是一刀切选“最严格”。

为何常见:单指标思维——只盯着“第一类错误越低越好”,忽略了假阴性和统计功效同样是决策成本。

误区我论文里只要写“经过Bonferroni校正后p<0.05”,读者知道显著就行了,原始p值不用放出来吧。

正解规范统计报告要求同时给出原始p值、校正方法、总检验次数和软件参数。因为不同校正方法对同一批p值可能给出不同结论,只报“校正后显著”等于隐藏了分析过程的选择性。体检报告如果不写清“本报告报警线0.00025、采用Bonferroni”,复查医生无法判断这个阈值是否合理、是否有选择性地多报或少报。

为何常见:只记住公式但缺乏统计报告规范意识,把“校正”当作可以省略原始信息的黑箱。

误区我做的是电商A/B测试,一次就看三五个指标、两三个实验组,总数不多,不用做什么多重检验校正吧?

正解只要检验次数大于1,家族错误率就开始累积。即使只做5次比较,FWER也达到22.6%——五分之一的概率出现至少一个假阳性。A/B测试中“多个指标×多个实验×多次时间切片观察”的组合轻易就超过几十次比较,不校正同样会制造大量“假胜利”。多重检验问题与数据规模无关,只与你做了多少次检验有关。

为何常见:把“需要校正”误认为是“超大规模数据才有的问题”,忽略了小次数下FWER同样会显著扩张的数学事实。

面试题

Q1. 某体检中心做20次独立检验,每次误报率为5%,则至少出现一次假阳性的概率约为多少?

单选题 · easy

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

答案:D。用精确公式1-(0.95)²⁰计算,结果为约64.2%。这正是多重检验的核心危害:单次检验的5%误报率,在20次检验下被放大成约2/3的“至少一次误报”概率。选项A是单次水平,B和C是干扰近似值。

Q2. 家族错误率(FWER)最准确的定义是?

单选题 · easy

  • A.所有检验中错误拒绝的比例期望
  • B.至少一个假阳性出现的概率← 正确答案
  • C.单次检验的假阴性概率相加
  • D.全部检验的假阳性数量总和

答案:B。FWER指“整批检验中至少出现一次假阳性”的概率,它把整个检验批次当作一个家族来问责。A描述的是FDR(阳性中的比例),C是假阴性的范畴,D只看数量不看概率,都偏离了FWER的定义。

Q3. Bonferroni校正将显著性阈值设置为?

单选题 · easy

  • A.设为 α/m,随检验次数变小← 正确答案
  • B.设为 α×m,随检验次数变大
  • C.固定为 0.05 不做任何调整
  • D.设为 1-α/m,接近一

答案:A。Bonferroni把总α平均分给m次检验,单次阈值α'=α/m。检验次数越多阈值越严,这是“预算分摊”思想。选项B方向反了,C是未校正,D在数值上接近1毫无意义。

Q4. Bonferroni校正的主要缺点是?

单选题 · mid

  • A.计算过程极为复杂难实现
  • B.校正过严易漏掉真实效应← 正确答案
  • C.只适用于正态分布的数据
  • D.无法控制第一类错误概率

答案:B。Bonferroni把阈值压到α/m后,真实的弱效应很难达到如此严格的显著线,导致假阴性增加、统计功效下降。计算本身很简单(B选项排除),适用范围也不限于正态分布(C),而且它确实能控制FWER(D)。

Q5. 错误发现率(FDR)的定义是?

单选题 · mid

  • A.所有检验中假阳性的总数
  • B.被拒绝假设中假阳性比例期望← 正确答案
  • C.真实效应被漏掉的概率总和
  • D.与单次检验的α数值相等

答案:B。FDR = E[V/R],其中V是假阳性个数,R是所有被拒绝(阳性)的总数,它衡量的是“拒绝清单中假阳性的占比期望”。A只统计数量不取比例,C描述的是假阴性,D混淆了单次α与整体错误率。

Q6. 执行Benjamini-Hochberg流程的第一步是?

单选题 · easy

  • A.把所有p值从大到小排序
  • B.把所有p值从小到大排序← 正确答案
  • C.直接取最小的p值与α比较
  • D.对每个p值乘以检验次数

答案:B。BH的第一步是把p值从小到大升序排列,位置越靠前代表越可疑。从大到小排序(A)会颠倒整个判定逻辑,C跳过了关键的排序和动态阈值比较,D是Bonferroni的做法不是BH流程。

Q7. m=100个p值做BH校正,某个p值排序第1位且p=0.001,它的q值约为?

单选题 · hard

  • A.q 约等于 0.001
  • B.q 约等于 0.005
  • C.q 约等于 0.100← 正确答案
  • D.q 约等于 1.000

答案:C。q = p×(m/rank) = 0.001×(100/1) = 0.1。注意这个例子说明p值极小也可能q偏大——因为BH用p×m/rank放大了p值,排名靠前但p不够极端时,q仍可能超过0.05。A是未校正的p值,B是干扰值,D是把分母搞反的结果。

Q8. 哪些场景更适合用FDR而不用Bonferroni?

多选题 · mid

  • A.全基因组关联扫描找候选位点← 正确答案
  • B.三期临床药物疗效确证试验
  • C.转录组测序筛选差异表达基因← 正确答案
  • D.广告投放多指标探索性评估← 正确答案

答案:ACD。FDR适合海量候选、后续可验证的探索性场景:GWAS候选位点扫描、RNA-seq差异基因筛选、广告多指标初筛都属于“先广撒网再确认”。三期临床(B)是确认性研究,误报代价极高,应该用FWER/Bonferroni。

Q9. 关于BH procedure,下列说法正确的有?

多选题 · hard

  • A.要求先把p值升序排列← 正确答案
  • B.阈值随排序名次逐渐抬高← 正确答案
  • C.对所有p值统一用α/m判断
  • D.校正后q值有可能大于一

答案:AB。BH把p值升序排列后,第i位的阈值是(i/m)α,随名次递增而抬高,所以A、B正确。C是Bonferroni的做法,BH用的是动态阶梯阈值。D错误——q值计算后会被夹取到[0,1]区间,不可能大于1。

Q10. 一个基因的q=0.03,以下哪些理解是正确的?

多选题 · hard

  • A.该基因有3%概率是假阳性
  • B.显著结果中假阳性占比期望约3%← 正确答案
  • C.该基因原始p值恰好等于0.03
  • D.该基因效应大小为3个单位

答案:B。q=0.03的含义是:若把这个基因纳入显著列表,那么所有显著结果的集合中,假阳性比例的期望约为3%。它描述的是“整组阳性结果”的风险,不是单个基因的概率(A错),也不是原始p值(C)或效应量(D)。