FDR 控制原理概述

为什么需要 FDR?——从统计检验说起

蛋白质组学实验一做就是几千个蛋白质的定量比较。每个蛋白质都得做一次假设检验。你想想看,如果一次实验测了 5000 个蛋白,哪怕我们设定 5% 的显著水平(p < 0.05),那也有 250 个假阳性会混进来。这还没完,实际数据里肽段匹配、定量误差、批次效应还会放大这个数字。

我最早做差异蛋白筛选时,老老实实用 Bonferroni 校正。结果呢?一个显著蛋白都没留下。不是数据不好,是 Bonferroni 太保守了——它把整个实验的假阳性率控制在 5%,换句话说,哪怕你只犯一次错误,它都不答应。这在基因组学里也许行得通,但在蛋白质组学里,我们更在意“找出来的蛋白里有多少是错的”,而不是“整个实验有没有犯任何错”。

所以,我们需要另一种思路:允许你犯一定比例的错误,只要错误比例可控。这就是 FDR(False Discovery Rate,错误发现率)的核心思想。

核心区别一句话: FWER 控制“至少出现一个假阳性的概率”≤α;FDR 控制“被拒绝的假设中假阳性所占的比例”≤q。

FWER 与 FDR ——两种错误控制策略

先看一个具体的对比。假设我们做了 1000 个检验,真实情况是 800 个阴性、200 个阳性。用不同的校正方法,结果差别非常大:

维度 FWER(Bonferroni) FDR(BH 方法)
目标 整个实验不出现任何假阳性 假阳性在阳性结果中占比≤q
阈值 α / m(m 为检验总数) 动态阈值(基于排序后的 p 值)
适用范围 小规模、高代价的发现 大规模、高通量筛选
假阳性数 严格 ≤1(α=0.05,m=1000 时) 允许几个到几十个(取决于 q 值)
统计功效 极低(尤其 m 大时) 较高
MaxQuant 默认 不采用 ✅ 默认 FDR=1%

我个人习惯在预实验中先用 FWER 估算一下“最差情况”,但在正式分析时,几乎只用 FDR。为什么?蛋白质组学是 discovery-driven 的,你不可能指望每个候选蛋白都万无一失,但你需要对后续验证的成本有个预期——FDR 给你这个预期。

Benjamini-Hochberg 方法 —— 核心算法

BH 方法(Benjamini-Hochberg)是目前最通用的 FDR 控制算法。它不要求数据服从什么分布,只用 p 值的排序信息。流程是这样的:

  1. 把所有假设的 p 值从小到大排序:p(1) ≤ p(2) ≤ … ≤ p(m)
  2. 对每个 i,计算临界值:threshold(i) = (i / m) × q
  3. 找到最大的 k,使得 p(k) ≤ threshold(k)
  4. 拒绝所有 i ≤ k 的假设

简单说,就是画一条斜线:排名越靠前(i 越小),临界值越严格;越靠后,临界值越宽松。这个方法很聪明——它自动调整了多重检验的惩罚强度。

举个例子。假设我们测试 10 个蛋白,目标 FDR q=0.05:

Rank (i)    p-value    threshold (i/10 * 0.05)
1           0.001      0.005        → 拒绝
2           0.008      0.010        → 拒绝
3           0.020      0.015        → 不拒绝(p > threshold)
4           0.030      0.020        → 不拒绝
5           0.080      0.025        → 不拒绝
...
10          0.900      0.050        → 不拒绝

这里排第 3 的 p=0.02 已经超过了阈值 0.015,所以只拒绝前两个。对应的 FDR 估计值是:0.05 × 2 / 2 = 0.05,正好等于设定的 q。实际上 BH 方法给出的是 FDR 的保守上界。

实操经验: 在 MaxQuant 里,你不需要手动算这些。它内部对肽段、蛋白质、位点层面都做了 BH 校正。但你得理解:明明 p=0.02 显著,为什么没有被接受?因为有排名更靠后的 p 值“撑不住”这个阳性率。

FDR 在蛋白质组学中的特殊挑战

标准的 BH 方法假设所有假设检验是独立的。但蛋白质组学数据不是——同一蛋白的不同肽段高度相关,不同蛋白在通路上也有关联。这种依赖性会降低 BH 方法的准确度,让实际 FDR 略高于标称值。

我曾遇到一个案例:用标准 BH 方法在 q=0.01 下筛出 200 个差异蛋白,但后续 qPCR 验证时只对了不到 70%。后来检查发现,样本中有一个强表达蛋白的肽段几乎占了总谱数的 15%,导致很多弱信号的蛋白 p 值被压缩。这种情况靠 BH 已经救不了,需要更稳健的估计方法,比如 Storey 的 q-value 方法 或者 置换检验 + 基于峰值的 FDR 控制。

避坑提醒: 我见过有人把 MaxQuant 输出的 “Score” 直接当 p 值用,然后自己做 BH 校正。这是错误的!MaxQuant 的 Score 是经过特定转化和归一化的,不能当作标准 p 值。正确的做法是使用 MaxQuant 自带的 FDR 过滤(在 evidence.txt 和 proteinGroups.txt 里都有 "FDR" 列),或者用 peptides.txt 里的 "PEP"(Posterior Error Probability)列做二次过滤。

FDR 控制流程全景图

下面这张图总结了从原始图谱到最终 FDR 过滤的完整链,帮助你把刚刚讲的内容串起来:

蛋白质组学 FDR 控制全景图 原始谱图 肽段鉴定 & PEP BH-FDR 过滤 蛋白质推断 & FDR 置换检验评估 FDR q-value 与 local FDR 差异蛋白列表 💡 注意:MaxQuant 对肽段和蛋白质使用不同的 FDR 过滤器(PSM FDR vs. Protein FDR)。 通常设置 1% FDR,但如果你发现验证率过低,可以放宽到 5% 并配合后续过滤。
我自己怎么做: 在 MaxQuant 的 mqpar.xml 里,我会先把 peptideFDR 和 proteinFDR 都设为 0.01。然后跑一次完整的鉴定。拿到结果后,用 evidence.txt 里的 "PEP" 列画一个分布图——如果 PEP 在 0.01~0.05 之间还有大量点堆叠,说明原始 FDR 可能被低估了,我会把阈值提到 0.5% 并检查下游生物学重复的一致性。

总结一下:FDR 控制不是一道死命令,而是一个决策框架。你今天了解 BH 方法的原理,就能读懂 MaxQuant 日志里那句 “Applied Benjamini-Hochberg FDR correction with threshold = 0.01” 到底在干什么。下次遇到差异蛋白少得可怜时,你也能判断——是数据本身没信号,还是 FDR 卡得太死该调整了。