1. 批次效应概述:为什么你的数据会“打架”

做转录组分析的同学,十有八九都遇到过这种情况:明明实验设计没问题,可一跑 PCA,样本没按条件聚在一起,反而按测序批次分成两坨。嗯,这就是典型的批次效应(batch effect)。说白了,它就像实验里的“系统偏差”,跟你的生物学差异无关,纯粹是操作流程、试剂、仪器等非生物因素造成的。

我在刚接触 RNA-seq 时,有一次处理一批小鼠数据,对照组和实验组每个条件都有三次生物学重复,结果 PCA 图上对照组三个点聚在一起,实验组三个点聚在另一侧,看起来完美。我以为分析结束了,结果师兄看了一眼说:“你确认一下是不是所有样本都是一批提的 RNA?”我回去一查,坏事了——对照组的三个样本是第一批次,实验组是第二批次。那个所谓的“差异”,有一半其实是批次效应贡献的。从那以后,我再也不敢忽略这个环节了。

1.1 什么是批次效应

批次效应是指在多个批次的实验过程中,由于不可控的非生物学因素,导致相同生物学条件下的样本出现系统性差异。这些差异会干扰真实信号,甚至让你把技术噪声当成生物学发现。

  • 来源多样:操作人员更换、试剂批号不同、测序仪换了一台、相隔几个月重新跑一次……
  • 影响全局:它不针对某个基因,而是影响整个表达谱。
  • 隐蔽性强:不加校正时,PCA 图上的聚类可能看起来特别“漂亮”,但这个漂亮是假的。

个人经验:我习惯在拿到 count 矩阵后,第一步不是看差异基因,而是先做一次 PCA 或 MDS,用颜色标记批次信息。如果看到明显的批次聚类,后续一定要在模型里加入批次变量。

1.2 批次效应从哪来

批次效应的来源可以列出一长串,我直接给你一个清单,你在实验记录里就能对照着看:

来源类别具体例子
试剂差异RNA 提取试剂盒批号不同、反转录酶批次不同
仪器差异不同测序仪(HiSeq vs NovaSeq)、不同流道(lane)
人员差异不同实验员操作、提取时间跨度大
环境差异实验室温度、湿度波动(少见但存在)
测序批次同一次测序的不同 lane、不同 flow cell、不同运行时间

你想想看,只要不是一次把所有样本全部并行处理完,批次效应就几乎不可避免。所以问题不是你“有”没有批次效应,而是你“知道不知道”它有多大。

1.3 为什么必须校正

如果不校正批次效应,后果很严重:

  • 假阳性飙升:把批次差异误判为生物学差异,得到一堆并不存在的差异基因。
  • 假阴性增多:真实差异被批次噪声淹没,本来该发现的基因检测不出来。
  • 可复现性崩溃:另一批重复实验根本找不到你“发现”的基因。

一个典型场景:某次合作项目中,合作方给了两批数据,第一批 6 个样本,第二批 6 个样本,条件是受试者用药前 vs 用药后。第一眼 PCA 图,所有用药前样本(来自第一批)聚在一起,所有用药后样本(来自第二批)聚在另一边。如果不校正,你很可能会说“药物效果极显著”。但仔细看时间线——第一批样本是老试剂盒提取的,第二批是新试剂盒。去除批次效应后,那 12 个样本的差异几乎全面瞧不见。你看,批次效应就是这么“会骗人”。

注意:批次效应与生物学差异在实验设计上必须可分离。如果批次与生物学条件完全重合(例如第一批全是对照组、第二批全是处理组),没有任何统计方法能区分两者。所以实验设计阶段就要让批次与条件交叉或分块。

1.4 转录组分析中批次效应的典型表现

最常见的表现就是 PCA 或 MDS 图上,样本按批次聚集,而不是按实验条件聚集。下面我用一张图来说明这个“数据打架”的过程:

批次效应示意图:校正前 vs 校正后 校正前:样本按批次聚集 批次A 批次B 条件1 条件2 (混杂) 校正后:样本按条件聚集 条件1 条件2 图:左侧校正前,样本按批次A、B聚集,条件1和2混杂;右侧校正后,批次效应去除, 样本按真实生物学条件聚集。好,现在你一眼就能看出哪边是“真的”。

1.5 什么时候需要考虑批次校正

只要你的实验涉及多个批次,无论批次数量多少,都应该在分析中考虑批次效应。具体场景包括:

  • 多个测序批次:两次或更多次测序运行。
  • 不同处理时间:样本分几周处理,每次提取都算一个批次。
  • 合并公共数据:整合 GEO 等数据库时,不同数据集本身就是最强批次。
  • 多中心合作:不同实验室的样本放在一起分析。

我的习惯:在设计实验时就把批次信息记录在样本表中,分配样本到各批次时尽量保持每个条件在每个批次里的比例相近(block randomized design)。这样后续校正时模型能够有效分离批次效应和生物学效应。

1.6 批次效应与 DESeq2 的关系

DESeq2 内置了批次校正机制。你只需要在构建模型公式时,把批次信息作为协变量加入即可。比如:

dds <- DESeqDataSetFromMatrix(countData = counts,
                              colData = colData,
                              design = ~ batch + condition)
dds <- DESeq(dds)
results(dds, contrast = c("condition", "treated", "control"))

这里的 batch 就是你的批次变量,放在条件之前,DESeq2 会先拟合批次的影响,再检测条件差异。相比 ComBat 等先校正再差异分析的方法,这种方式更保守,但能保证原始计数结构不被过度修改。

方法校正时机典型代表
在模型中加入协变量差异分析时同时校正DESeq2、edgeR、limma+voom
独立预处理校正差异分析前做一步ComBat(sva包)、RUVseq、Harmony

选择建议:如果你的批次效应非常强,而且想让校正后的 PCA 看起来“干净”,可以先用 ComBat 做一次校正,再用 DESeq2 分析。否则,直接使用 DESeq2 的 ~ batch + condition 就够了。我一般优先用内置公式,因为它不会改变数据分布假设,后面下检验结果更可靠。

好了,这一章我们基本把批次效应是什么、为什么重要、以及怎么用 DESeq2 在模型里处理它讲清楚了。后边我会带你实战解决各种常见报错,包括批次信息不完整、批次与条件完全共线性、以及大样本场景下的内存问题。你心里有个底:批次效应不是妖魔鬼怪,它只是实验的“锅”,你得学会怎么背。