批次效应概念及其对差异分析的影响
批次效应这个词,你肯定不陌生。说白了,就是不同批次处理样本时,因实验条件、试剂批号、操作人员、测序时间等非生物学因素引起的系统性差异。我刚开始做转录组分析时,总觉得这玩意离自己很远——直到有一次亲手栽了跟头。
批次效应到底是什么?
让我用一个比喻来解释。假设你在两家奶茶店各点了一杯“经典珍珠奶茶”,配方一样,但A店用全脂牛奶,B店用脱脂牛奶。口感、颜色都有差别。这个差别就是“批次效应”。在RNA-seq实验中,类似的“奶茶配方差异”比比皆是:
- 试剂批号不同——提取RNA的柱子、反转录酶、接头都可能产生批次偏移
- 操作者不同——移液手法、加样顺序都会带来细微差异
- 测序仪不同——HiSeq 4000比NovaSeq 6000的碱基质量分布有系统偏差
- 测序时间——同一台机器不同run,flowcell间的信号响应也不一样
你想想看,如果对照组全部在周一测序,处理组全部在周三测序,那么两组间的差异到底来自生物学因素,还是来自仪器状态?这就是批次效应的核心麻烦——它和生物学因素纠缠在一起,很难分离。
| 批次效应来源 | 典型例子 | 对差异分析的影响 |
|---|---|---|
| 试剂批次 | 不同lot的TRIzol、接头、酶 | 引入恒定偏移,影响均一化 |
| 操作时间 | RNA提取时间、文库制备时间 | 产生非随机噪声 |
| 测序lane/flowcell | 不同lane的GC偏好不同 | 造成基因表达量系统偏差 |
| 人员 | A vs B操作者的加样习惯 | 影响文库复杂度、PCR扩增效率 |
| 环境条件 | 室温、湿度、实验室变更 | 引入不可预测的批次漂移 |
记住,批次效应不是“有没有”的问题,而是“大不大”的问题。即使你严格标准化操作,微小的批次差异仍然存在。我见过不少项目,因没考虑批次,直接跑DESeq2或者edgeR,结果到了验证阶段一个差异基因都重复不出来——都是批次惹的祸。
批次效应在RNA-seq数据中长什么样?
举个具体的例子。某次合作项目中,我用两个批次共12个样本做差异分析。先画了个PCA:
# R语言示例:用promise包快速查看批次
library(PCAtools)
p <- pca(log2(exprs + 1), metadata = colData)
biplot(p, colby = "batch", shape = "condition")
结果第一主成分(PC1)把批次1和批次2完美分开,而处理组和对照组混在一起。这说明什么?样本间最大的变异来源是批次,而不是你关心的生物学分组。这时候不校正批次就去跑差异分析,结果就是一团浆糊。
你可以在箱线图里也看到批次的影子:批次1样本的中位表达量明显高于批次2,或者某些管家基因在批次间异常波动。这些信号都在告诉你——批次效应已经大到不可忽略了。
批次效应如何“搞砸”差异分析?
差异分析的核心假设是:两组间表达量的差异由生物学变量驱动。但批次效应会引入两类典型错误:
- 假阳性增加: 如果批次与分组完全混杂(比如所有处理组在批次1,对照组在批次2),那么任何区别批次的方法都会错误地把批次差异当成生物学差异。一个不存在的差异基因,能给你算出p值小到10^-6。
- 假阴性增加: 如果批次效应在各组内随机出现,它会稀释真实信号。真实差异也许只有2倍,但批次噪声给它盖住了,导致统计检验无法拒绝零假设。
拿实际数据说话。我模拟了一个经典场景:10个真实差异基因,加15%的批次噪声,然后用edgeR跑差异分析(不校正批次)。你能看到啥?
# 模拟数据示例(R代码)
set.seed(42)
true_de <- c(rep(1, 10), rep(0, 19990)) # 10个真阳性
pvals_no_correction <- runif(20000) # 这里实际应该是检验结果,仅示意
# 实际上不校正批次时,假阳性率可能从5%飙到30%+
这里不是展示完整代码,而是让你意识到:批次效应不处理,你的差异分析就像在暴风雨中打靶——子弹根本打不准靶心。
识别批次效应:先“看”后“测”
识别批次效应可以分为两步:可视化探查和统计检验。
可视化探查
- PCA/MDS图: 用样本点颜色标识批次,看批次是否聚集。用形状标识分组,看分组是否混合。
- 层次聚类热图: 样本聚类树是否有批次分群?
- 基因表达箱线图: 随机选10个高表达基因,按批次画箱线图,看中位线是否对齐。
统计检验
- ANOVA-like检验: 对每个基因检验“批次”的效应是否显著(比如用limma的duplicateCorrelation或常规方差分析)。但要注意多重检验膨胀。
- 批次效应量化指标: 比如采用RUVseq的RLE(相对log表达)图,或者用sva包中的Leek's检验。
我个人倾向于先看PCA,再做一个批次间差异基因数量统计。如果批次间差异基因(按FDR<0.01)超过10%,那就要认真考虑校正了。
为什么说limma-voom能帮我们解决这个问题?
这里得先交代一下思路。处理批次效应有很多方法——ComBat、RUVseq、SVA、PCA-based等等。但在差异分析的场景下,我们最需要的是一个既能识别批次,又能把批次作为一个协变量塞进线性模型中的方法。limma-voom恰好就是干这个的。
它的基本逻辑是:把批次当作一个成分类别变量,加入设计矩阵的公式中,然后通过线性模型把批次效应估计出来并“扣掉”。不是删除样本,而是数学上移除批次贡献的那部分方差。
当然,具体如何用limma-voom实现批次校正,我们后面章节会手把手教。但你现在至少明白:批次效应不是不可战胜的,关键是要把它当成一个已知的、可建模的变量来对待。
上面的图已经把核心逻辑走了一遍:批次效应来源很多,最终扰乱差异分析,导致结果不可靠。而我们后续要讲的方法,就是图中的“补救策略”——通过建模将批次效应从表达量中剥离,让真实生物学信号脱颖而出。