批次效应概述:是什么、为什么、怎么来的

大家好,我是做单细胞数据分析的。今天开始讲批次校正,先聊聊最基础的问题——批次效应。

做单细胞测序的同学都遇到过:明明同一批样本,分两次上机测,结果UMAP图上就分成两坨。是生物学差异吗?不一定。很可能就是批次效应。

批次效应(Batch Effect):指在研究过程中,由于实验操作、试剂批次、测序仪器、测序时间等非生物学因素导致的系统性数据差异。

为什么会出现批次效应?

说白了,任何多步骤实验流程,只要不是同一天、同一个人、同一台机器做完,就会引入变量。我遇到过最离谱的案例:同一个样本分两次跑,第一次用旧版试剂盒,第二次用了新版,结果两个文库的基因检测情况完全不同。嗯,这就是批次效应。

常见的来源我列一下:

  1. 样本处理差异:解离方法、冻存时间、细胞活率不同
  2. 试剂批次:不同批次的反转录酶、扩增酶、建库试剂盒
  3. 测序平台:10x Genomics 不同版本,或者 NovaSeq vs NextSeq
  4. 测序深度:有的批次 reads 多,有的少
  5. 操作人员:手速、操作习惯的不同
  6. 时间跨度:前后隔了几个月,实验室环境都变了

我曾经踩过一个坑:做临床样本整合时,发现病例组和对照组正好对应两个批次。如果不校正,差异分析结果全是假的。那是我第一次意识到批次效应是可以直接毁掉一个项目的。

批次效应的影响有多大?

你想想看,单细胞数据本身噪声就大。如果再加上系统性的批次偏移,后果很严重:

  • 混淆生物学差异:你以为找到了疾病相关亚群,其实是批次差异
  • 降低整合效果:不同数据集无法对齐,合并分析变成噩梦
  • 丢失稀有细胞群:小群细胞如果只出现在某个批次,校正后可能被抹掉
  • 错误统计推断:p值会骗人,假阳性率飙升
影响维度 具体表现 严重程度
可视化 UMAP/t-SNE 按批次聚类而非按细胞类型 高
差异表达 检测到大量假阳性基因 极高
细胞注释 同类型细胞被分到不同cluster 高
下游分析 轨迹推断、细胞通讯分析结果扭曲 中高

什么时候必须校正?什么时候不能校正?

这问题很关键,很多人上来就咔咔校正。我个人习惯:先观察,再判断。

  • 必须校正:整合多个数据集、合并不同批次、做meta分析时
  • 谨慎校正:如果批次与生物学条件完全混淆(比如batch1全是病人,batch2全是对照),无法区分,校正可能抹掉真实信号
  • 不要校正:单样本分析、所有数据在同一天同一台机器上产出时

我的经验:先画一张UMAP图按批次上色。如果批次之间明显分离,而生物学因素混杂在其中,那必须校正。但如果两个批次混在一起,就没必要强行校正——过度校正反而引入假象。

批次校正的三种主流思路

现在市面上方法很多,但大体分三类。我按自己的理解给你梳理:

  1. 基于降维对齐(代表:CCA、Harmony)
    先在低维空间找匹配的细胞对,然后拉近它们。速度快,适合大数据。
  2. 基于最近邻匹配(代表:MNN)
    寻找跨批次的相互最近邻细胞对,用这些对来估计校正向量。鲁棒性好。
  3. 基于深度生成模型(代表:scVI、scANVI)
    用VAE把批次当作条件变量,学习数据分布后生成校正后的表达。灵活、可概率化。

这三种方法我们后面会逐个深挖,今天先把框架搭好。

批次校正方法分类概览 批次校正 降维对齐 CCA, Harmony 最近邻匹配 MNN 深度生成模型 scVI, scANVIs 可扩展性强 鲁棒性好 可概率化 选择方法前:先评估批次效应的性质 是否与生物学条件混淆?数据量多大?

一个小技巧:拿到数据后,先跑个简单的PCA/UMAP,按来源批次上色。如果看到明显的颜色分离,那就要校正。如果颜色混在一起,就先不急着动。

评估批次效应大小的常用指标

光靠肉眼不够,定量更靠谱。我常用这几个:

  • kBET (k-Betweenness Entropy Test):检验局部邻域中批次分布是否均匀
  • PCR (Principal Component Regression):用批次做因变量,看主成分能解释多少方差
  • LISI (Local Inverse Simpson Index):衡量局部异质性
  • ASW (Average Silhouette Width):按批次计算的轮廓宽度,越小说明批次效应越轻

这些指标后面讲具体方法时会用到。今天先知道有这些工具就行。

一个简单的案例:看看批次效应长什么样

假设你有两个PBMC数据集,一个来自批次A,一个来自批次B。整合前先看UMAP:

# Python 伪代码示意
import scanpy as sc
adata_a = sc.read('pbmc_batchA.h5ad')
adata_b = sc.read('pbmc_batchB.h5ad')
concat = adata_a.concatenate(adata_b, batch_key='batch')
sc.pp.pca(concat)
sc.pp.neighbors(concat)
sc.tl.umap(concat)
sc.pl.umap(concat, color='batch')

你看结果——如果两个batch的点在UMAP上分别聚成两团,那就有批次效应。如果它们混在一起,bad luck,你遇到的问题可能不是批次,而是生物学差异。

记住:批次效应校正不是万能的。如果批次完全重叠——你的校正算法越努力,结果可能越离谱。先检查、再校正,是我做数据分析的第一条铁律。

小结一下

今天我们从批次效应的来源、影响、何时校正、主流方法分类几个角度走了一遍。核心就一句话:批次效应是单细胞整合中最常见的系统性偏差,校正前先定性定量分析,选对方法。后面我们一章章拆解CCA、MNN、scVI——每种方法的原理、代码实现、优缺点都会讲到。

不急,一步步来。