1. 批次效应概述
说实话,刚开始做RNA-seq分析那会儿,我根本没把批次效应当回事。直到有一次,我帮同事排查一个差异基因列表——上千个差异基因,fold change大得离谱,可生物学解释完全说不通。我一看PCA图,样本是按处理分组的吗?不,是按上机日期分的。这就是批次效应,一个能轻松毁掉整个分析结果的隐形杀手。
批次效应说白了就是:本应只反映生物学差异的数据,却被非生物因素(比如哪天做的实验、用的哪盒试剂、谁操作)掺杂了系统性偏差。它不会主动告诉你它存在,但你得主动去找它。
什么是批次效应
批次效应是指不同实验批次间因技术变量引入的系统性误差。这些误差会叠加在真实的生物学信号上,导致样本间的不必要差异。在RNA-seq中,从样本收集、RNA提取、建库、测序到数据预处理,每一步都可能埋下批次效应的种子。
我记得一个经典比喻:你种了两批西红柿,一批在晴天施肥,一批在雨天施肥。最后西红柿大小不同,你能说都是肥料造成的吗?当然不能——天气混进来了。批次效应就是那个“天气”。
常见来源
批次效应的来源五花八门,但我总结下来,最常遇到的也就这几种:
- 实验日期:不同天做的实验,环境温湿度、仪器校准状态甚至电网波动都可能不同。我见过一个项目,样本分两周上机,结果两组在PC1上完美分离,跟处理条件完全无关。
- 试剂批次:建库试剂盒、反转录酶、接头的批次更替造成的差异。特别是UMI试剂,不同批次间的随机引物效率可能差20%。
- 操作人员:不同人加样手法、移液器校准习惯都不一样。这点在手动建库时尤其明显——我经历过同一个实验室三个人做相同样本,差异基因列表重合度不到50%。
- 测序仪器:不同测序仪、不同flow cell、不同lane之间的系统偏差。有点类似于“相机不同,拍出来颜色饱和度不同”。
- 其他隐性来源:比如提取时间、RNA降解程度、冻融次数等。这些通常需要仔细看实验记录才能发现。
你想想看,如果一个项目的样本采集跨度半年,试剂换了三批,操作人员换了两轮,那你的差异分析结果里到底有多少是生物学效应?
对下游分析的影响
批次效应如果没处理,下游分析基本是废的。我按影响严重程度排个序:
| 下游分析 | 批次效应典型表现 | 后果 |
|---|---|---|
| 主成分分析 | 样本按批次而不是按处理分组聚集 | 视觉误导,错误推断分组解释度 |
| 差异表达分析 | 假阳性基因大量出现(尤其是低表达基因) | 误报差异基因,浪费验证资源 |
| 聚类分析 | 样本先按批次聚成亚群,再按处理亚聚 | 发现虚假亚型或掩盖真实亚型 |
| 生物标志物发现 | 标志物在不同批次间不可重复 | 临床转化失败 |
举个例子:我曾帮一个团队分析乳腺癌RNA-seq数据。先用sva的ComBat校正,结果发现校之前差异基因有500多个,校之后只剩40多个。那500个里有80%是批次效应的“杰作”。如果不做校正,后续qPCR验证全打水漂。
知识图谱:批次效应的来源与传导
下面这张图概括了批次效应的来源链条,以及它如何干扰下游分析。你可以把它当作排查的路线图。
快速自查清单
当你拿到一个RNA-seq表达矩阵时,建议按以下步骤快速排查批次效应:
- 提取样本的批次变量(日期、试剂批号、操作者、测序run ID)。
- 绘制PCA前两个主成分,用颜色和符号区分批次。如果呈现明显分离,标记为高风险。
- 计算每个主成分与批次变量的相关性——可以用ANOVA或Kruskal-Wallis test。
- 如果批次效应明显,继续用ComBat或limma处理;如果轻微,考虑在差异模型中纳入批次协变量。
- 处理后再看一次PCA,验证消除效果。注意不要过度校正(生物学差异被抹掉也是一种灾难)。
# 用R快速检查批次效应的代码段(仅供参考)
library(ggplot2)
pca <- prcomp(t(log2(counts + 1)), scale. = TRUE)
pca_df <- data.frame(PC1 = pca$x[,1], PC2 = pca$x[,2], Batch = batch_info$date)
ggplot(pca_df, aes(PC1, PC2, color = Batch)) + geom_point() + theme_minimal()
嗯,这里要注意:如果你看到PCA图上样本按处理分组出现在PC1方向,但同时又按批次在PC2上分开——这种情况最棘手,需要小心地解耦。我个人通常会先试ComBat,再检验处理组间的差异是否仍然显著。如果校正后生物学差异反而消失,可能是批次效应与处理效应混淆了——设计上的问题,无法纯靠算法解决。
批处理效应处理好了,后续分析才有意义。下一部分我们聊怎么用工具具体消除它——但你现在已经知道它是什么、从哪来了,这就是最好的起点。