FDR 控制原理概述
为什么需要 FDR?——从统计检验说起
蛋白质组学实验一做就是几千个蛋白质的定量比较。每个蛋白质都得做一次假设检验。你想想看,如果一次实验测了 5000 个蛋白,哪怕我们设定 5% 的显著水平(p < 0.05),那也有 250 个假阳性会混进来。这还没完,实际数据里肽段匹配、定量误差、批次效应还会放大这个数字。
我最早做差异蛋白筛选时,老老实实用 Bonferroni 校正。结果呢?一个显著蛋白都没留下。不是数据不好,是 Bonferroni 太保守了——它把整个实验的假阳性率控制在 5%,换句话说,哪怕你只犯一次错误,它都不答应。这在基因组学里也许行得通,但在蛋白质组学里,我们更在意“找出来的蛋白里有多少是错的”,而不是“整个实验有没有犯任何错”。
所以,我们需要另一种思路:允许你犯一定比例的错误,只要错误比例可控。这就是 FDR(False Discovery Rate,错误发现率)的核心思想。
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 值的排序信息。流程是这样的:
- 把所有假设的 p 值从小到大排序:p(1) ≤ p(2) ≤ … ≤ p(m)
- 对每个 i,计算临界值:
threshold(i) = (i / m) × q - 找到最大的 k,使得
p(k) ≤ threshold(k) - 拒绝所有 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 的保守上界。
FDR 在蛋白质组学中的特殊挑战
标准的 BH 方法假设所有假设检验是独立的。但蛋白质组学数据不是——同一蛋白的不同肽段高度相关,不同蛋白在通路上也有关联。这种依赖性会降低 BH 方法的准确度,让实际 FDR 略高于标称值。
我曾遇到一个案例:用标准 BH 方法在 q=0.01 下筛出 200 个差异蛋白,但后续 qPCR 验证时只对了不到 70%。后来检查发现,样本中有一个强表达蛋白的肽段几乎占了总谱数的 15%,导致很多弱信号的蛋白 p 值被压缩。这种情况靠 BH 已经救不了,需要更稳健的估计方法,比如 Storey 的 q-value 方法 或者 置换检验 + 基于峰值的 FDR 控制。
FDR 控制流程全景图
下面这张图总结了从原始图谱到最终 FDR 过滤的完整链,帮助你把刚刚讲的内容串起来:
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 卡得太死该调整了。