1. 批次效应概述:定义与重要性

大家好,欢迎来到这门课。咱们开门见山,先聊聊批次效应到底是什么玩意,为什么它能让一篇好好的论文瞬间翻车。

我个人习惯把批次效应叫做「数据里的幽灵」。你看不见它,但它确实存在。你跑差异表达、做聚类、画热图,结果漂亮得不行,以为发现了新生物标记——结果一查,组间差异全是不同批次导致的假象。嗯,这事儿我见过太多次了。

1.1 批次效应的定义

说白了,批次效应就是:样本在不同时间、不同试剂、不同操作人员、不同仪器等条件下处理,导致测量结果中混入了与生物学无关的系统性偏差。

举个例子。你手上有 10 个肿瘤样本和 10 个正常对照。肿瘤样本是上星期提取 RNA、这星期建库测序的;正常对照是三个月前就搞定的。最后差异基因跑了 2000 个出来,你觉得这是癌症标志?

不一定。大概率是那三个月里,试剂换了批次、试剂盒版本升级了、甚至实验室空调维修导致温度波动,所有正常样本被齐刷刷地「平移」了一段。你看到的差异,其实是批次差异。

核心定义速记:

  • 非生物学因素引入的系统性噪声
  • 与实验分组无关,但可以伪装成分类
  • 不可完全消除,只能尽量校正或最小化

1.2 批次效应从哪来?—— 一个实用清单

我以前在学生时期觉得批次效应离我很远,直到有一次处理一个 200 例的大项目……

事情是这样的:项目分了 6 个批次做建库,每批次大概 30 多例样本。我以为流程都一样,直接合并跑 DE 分析,结果 PCA 图上 6 个批次完美分成了 6 坨。我当时就懵了——这哪是生物学差异,这是「批次艺术展」。

你想想看,哪些环节最容易埋雷?

阶段 常见批次源 我的个人教训
样本收集 不同采集时间、储存时间、冻融次数 同一个项目,血液样本有的放 -20°C 一个月,有的放 -80°C 半年——活活分出两个群
RNA 提取 试剂批号、提取试剂盒型号、操作人员 换了一个批号的 TRIzol,RIN 值的分布都变了
建库 建库日期、试剂盒版本、PCR 循环数 早期我用 12 个循环,中期改 15 个——结果基因表达量整体漂移
测序 不同 flow cell、不同 lane、不同测序仪 同一个项目混用 HiSeq 和 NovaSeq,GC 含量都不同
数据分析 不同版本比对工具、参数、参考基因组 从 hg19 换到 hg38 没同步处理旧样本,坐标都不对

⚠️ 重要提醒:批次效应不只是「不好」,它是「隐蔽的不好」。很多新手以为做完归一化就没问题了。其实不完全是。归一化处理技术内差异,但它不一定能消除批次间的系统性偏移。

1.3 批次效应为什么重要?—— 三个层面

我刚开始做 RNA-seq 分析时,总觉得「批次效应是统计学家的事,我只管找差异基因」。直到被审稿人怼过一次,才明白它的分量。

  1. 统计推断层面
    批次效应会放大假阳性率。你跑 t 检验,p < 0.05 的基因里可能有一大半只是因为批次差异。说白了,你把噪声当成了信号。
  2. 生物学解释层面
    我曾在项目中遇到过——一个 miRNA 表达谱,用两个批次做的,结果两个批次分别聚类到两个不同的生物学通路。如果没发现批次效应,你可能会写「这批病人存在两个分子亚型」——纯属扯淡。
  3. 可重复性层面
    这才是最要命的。你出了结果,别人重复不出来。为什么?可能是人家的批次分布和你的完全不同。这会让你的结论失去通用性。

1.4 怎么识别批次效应?—— 我常用的三板斧

其实你不需要复杂的统计模型,先用眼睛看。这三招我几乎每个项目都会用:

  • PCA 看图:点图上用颜色标记批次。如果同一批次的点扎堆,不同批次的分开,基本实锤。
  • 层次聚类热图:样本聚类树上一眼就能看出批次结构。如果控样本先按批次聚,再按分组聚——你摊上事了。
  • 箱线图看分布:拿出几个高表达基因,按批次分箱画箱线图。如果中位数、四分位距差异明显,就说明有系统性偏移。

一个小技巧:你可以故意在 PCA 图上隐藏分组标签,只显示批次标签。如果看到清晰的「批次云团」,那就说明批次效应已经「肉眼可见」了。这时候再做校正基本没戏,你得回去查实验记录。

1.5 批次效应的核心逻辑 —— 一张图说清楚

批次效应核心逻辑图 批次效应核心逻辑 非生物学系统偏差 PCA 散点图 层次聚类热图 箱线图 ComBat / limma RUVseq / SVA 线性混合模型 假阳性 ↑ / 可重复性 ↓ 批次效应必须在分析早期识别并处理 识别阶段 校正阶段 评估阶段

1.6 一个小例子:怎样快速检查你的数据有没有批次效应

我用 R 语言做过最简单的一次检查,大概就四五行代码:

# 假设 expr 是表达矩阵,batch_vec 是批次向量
pca_res <- prcomp(t(expr), scale. = TRUE)
pca_df <- data.frame(PC1 = pca_res$x[,1],
                     PC2 = pca_res$x[,2],
                     Batch = batch_vec)

library(ggplot2)
ggplot(pca_df, aes(x = PC1, y = PC2, color = Batch)) +
  geom_point(size = 3, alpha = 0.8) +
  theme_minimal()

如果你看到点图里相同颜色的点聚在一起,不同颜色的点远远分开——那就是批次效应的经典信号。我曾经在一个 TCGA 项目里试过,发现不同测序中心的数据在 PC1 上差了好几个标准差,二话不说立刻加上了批次校正步骤。

一句话总结:批次效应是 RNA-seq 分析中「看不见的陷阱」。它不会自己消失,也不会因为你用了复杂的模型就自动忽略。你得主动找它、确认它、校正它。后面几章我会手把手带你过一遍所有主流方法和它们的坑。