批次效应概念及其对差异分析的影响

批次效应这个词,你肯定不陌生。说白了,就是不同批次处理样本时,因实验条件、试剂批号、操作人员、测序时间等非生物学因素引起的系统性差异。我刚开始做转录组分析时,总觉得这玩意离自己很远——直到有一次亲手栽了跟头。

批次效应到底是什么?

让我用一个比喻来解释。假设你在两家奶茶店各点了一杯“经典珍珠奶茶”,配方一样,但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,或者某些管家基因在批次间异常波动。这些信号都在告诉你——批次效应已经大到不可忽略了。

经验之谈: 我习惯在做任何差异分析前,先画一张PCA并按批次着色。如果看到批次分开而分组混在一起,就说明校正批次是第一步。千万别跳过这一步,否则后续所有p值都是假的。

批次效应如何“搞砸”差异分析?

差异分析的核心假设是:两组间表达量的差异由生物学变量驱动。但批次效应会引入两类典型错误:

  • 假阳性增加: 如果批次与分组完全混杂(比如所有处理组在批次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%+

这里不是展示完整代码,而是让你意识到:批次效应不处理,你的差异分析就像在暴风雨中打靶——子弹根本打不准靶心。

我曾经踩过的坑: 有个癌症项目,三批样本分别来自三个医院,每组正好对应不同临床分期。我当时简单做了TMM均一化,没处理批次,跑了edgeR,出来一百多个显著基因。验证时一个都重复不出来。后来才发现,那三个医院用的RNA提取试剂盒不一样——批次直接藏在分组里。教训是:设计实验时就要把批次当作协变量记录好,不要事后补。

识别批次效应:先“看”后“测”

识别批次效应可以分为两步:可视化探查和统计检验。

可视化探查

  • PCA/MDS图: 用样本点颜色标识批次,看批次是否聚集。用形状标识分组,看分组是否混合。
  • 层次聚类热图: 样本聚类树是否有批次分群?
  • 基因表达箱线图: 随机选10个高表达基因,按批次画箱线图,看中位线是否对齐。

统计检验

  • ANOVA-like检验: 对每个基因检验“批次”的效应是否显著(比如用limma的duplicateCorrelation或常规方差分析)。但要注意多重检验膨胀。
  • 批次效应量化指标: 比如采用RUVseq的RLE(相对log表达)图,或者用sva包中的Leek's检验。

我个人倾向于先看PCA,再做一个批次间差异基因数量统计。如果批次间差异基因(按FDR<0.01)超过10%,那就要认真考虑校正了。

小技巧: 在RNA-seq数据中,也可以用负对照基因(如ERCC spike-in)来评估批次效应。如果你的spike-in本身在不同批次有明显表达量差异,那批次效应肯定存在,且会影响所有基因。

为什么说limma-voom能帮我们解决这个问题?

这里得先交代一下思路。处理批次效应有很多方法——ComBat、RUVseq、SVA、PCA-based等等。但在差异分析的场景下,我们最需要的是一个既能识别批次,又能把批次作为一个协变量塞进线性模型中的方法。limma-voom恰好就是干这个的。

它的基本逻辑是:把批次当作一个成分类别变量,加入设计矩阵的公式中,然后通过线性模型把批次效应估计出来并“扣掉”。不是删除样本,而是数学上移除批次贡献的那部分方差。

当然,具体如何用limma-voom实现批次校正,我们后面章节会手把手教。但你现在至少明白:批次效应不是不可战胜的,关键是要把它当成一个已知的、可建模的变量来对待。

核心观点: 批次效应是差异分析中最大的隐形杀手。但只要你提前记录批次信息,并且用正确的统计框架(比如limma-voom+批次协变量),完全可以让真正的生物学信号浮出水面。
批次效应影响差异分析的概念图 试剂批次差异 操作人员差异 测序平台差异 时间环境差异 系统性批次效应 (非生物学变异) 假阳性增加 (批次差异误当生物学差异) 假阴性增加 (真实信号被噪声掩盖) 差异分析结果不可靠 识别方法 PCA/MDS 聚类热图 箱线图 补救策略 limma-voom ComBat RUVseq

上面的图已经把核心逻辑走了一遍:批次效应来源很多,最终扰乱差异分析,导致结果不可靠。而我们后续要讲的方法,就是图中的“补救策略”——通过建模将批次效应从表达量中剥离,让真实生物学信号脱颖而出。