第 2 章 批次校正方法分类:线性、非线性与深度学习
做单细胞整合这几年,我碰到的第一个困惑就是:批次校正方法到底怎么选? 打开工具列表——ComBat、MNN、scVI、Harmony、Scanorama……眼花缭乱。其实你只要抓住它们的底层逻辑,就能把几十种方法分成三大类:线性、非线性、深度学习。下面我按这个脉络,结合自己的项目经验,把每类的原理、适用场景和坑点跟你捋一遍。
我的建议: 选方法前先画图看看批次效应的形态。如果效应是全局偏移(看PCA第一主成分就能分开),优先试线性方法;如果批次之间还混着生物差异(比如不同亚群分布不一样),非线性方法更稳;数据量超过 10 万细胞、想学复杂非线性关系,再上深度学习方法。
线性方法 —— 简单就是美
线性方法假设批次效应是加性的、全局的。说白了,就是每个基因在每个批次里的表达量整体上有个固定的偏移量,校正时直接把这部分偏移减掉。我用得最多的线性方法是 ComBat,R 里三行代码就能搞定:
library(sva)
adjusted_matrix <- ComBat(dat = raw_counts, batch = batch_vector)
还有 limma::removeBatchEffect,原理类似,适合已经归一化后的表达矩阵。我记得第一次用 ComBat 处理两个骨髓样本批次时,校正后 UMAP 几乎完美重叠,心里还嘀咕“这么简单?”——但后来换到免疫分型数据,同一个方法就翻车了。原因是什么?线性方法只抓全局均值偏移,抓不住基因之间、细胞亚群之间的异质性批次效应。
避坑指南: 我曾经在 tumor 数据上直接套 ComBat,结果把真实的肿瘤亚群差异也给抹平了。后来改用 MNN 才保住亚群结构。所以,线性方法只适合批次效应简单、不跟生物变异纠缠的场景。
线性方法还有个变体叫 Harmony,别看它长得像非线性——核心是在软聚类嵌入上做线性校正。它速度快,对齐效果也不错,我个人习惯把它放在“轻量级校正”的优先级里。
非线性方法 —— 对齐局部结构
非线性方法不用“全局一刀切”的假设,而是通过匹配细胞之间的局部邻域来消除批次效应。MNN(Mutual Nearest Neighbors) 是这类的代表。它先找两个批次间互为最近邻的细胞对(叫 MNN 对),然后基于这些对估计批次偏移向量。因为 MNN 对要求两个批次中都存在表型相似的细胞,所以它天然保留生物差异。
我在处理人外周血 + 骨髓的整合时,MNN 的效果明显比 ComBat 好——它不会把 CD8+ T 细胞和 NK 细胞混到一起。但 MNN 也有限制:如果两个批次之间没有足够的 MNN 对(比如测了不同组织),它就会失效。另一种非线性方法是 Scanorama,用奇异值分解 + 局部拼接做匹配,适合大规模数据。
注意: 非线性方法通常对参数敏感。比如 MNN 的 k 值(邻居数)设太小,MNN 对不足;设太大又会引入假阳性。我习惯先用默认参数跑一次,再根据 UMAP 上批次分离程度调整。
深度学习方法 —— 学习一个隐空间
深度学习方法的代表是 scVI。它用变分自编码器(VAE)把原始基因表达映射到一个低维隐空间,同时在隐空间里把批次效应作为辅助变量显式建模。scVI 不仅校正批次,还能做数据去噪、插补和差异分析。原理上它也是非线性的,但因为用了神经网络的拟合能力,可以学到非常复杂的批次-生物结构关系。
scVI 的代码也很简洁:
import scvi
scvi.model.SCVI.setup_anndata(adata, batch_key="batch")
model = scvi.model.SCVI(adata)
model.train()
latent = model.get_latent_representation()
但你想想看,深度学习不是万能药。我记得有一次跑 scVI 处理 50 万细胞的数据,训练时间从 20 分钟变成 6 小时——显存还爆了。如果你只有几千细胞,线性方法几秒钟就搞定的事,没必要上深度学习。此外,scVI 的可解释性不如线性方法,调参也需要耐心(学习率、层数、潜在维度)。
我的习惯: 数据量大于 20 万细胞时,如果硬件允许,我会用 scVI 作为主力校正方法。小于 5 万细胞,我倾向于 MNN 或 ComBat。
三类方法对比一览
下面的表格把核心差异总结一下,方便你快速做技术选型:
| 类别 | 核心假设 | 代表方法 | 适用场景 | 主要限制 |
|---|---|---|---|---|
| 线性 | 批次效应全局加性 | ComBat, limma, Harmony | 简单批次效应,小样本,快速原型 | 无法处理异质性批次效应 |
| 非线性 | 局部邻域相似性 | MNN, Scanorama | 批次间有重叠的亚群,保留生物差异 | 参数敏感,缺乏 MNN 对时失效 |
| 深度学习 | 隐空间非线性建模 | scVI, scANVI | 大样本,复杂批次-生物关系,多组学 | 计算资源高,可解释性差,调参成本大 |
三类方法的关系图
下面这张图把整个分类体系和典型方法串了起来。你可以把它当作选型时的脑图:
怎么选?我的一点实战心得
- 先跑个 PCA + UMAP:只看前两主成分,如果两个批次在 PC1 上明显分离,线性方法大概率能解决。如果互锁在一起,果断用 MNN 或 scVI。
- 小数据用线性,大数据用深度学习:几百到几千个细胞,ComBat 几秒钟出结果,没必要启动 GPU 集群。
- 注意批次内的亚群差异:如果批次之间相同亚群的细胞数量差异很大,非线性方法的 MNN 对可能偏少。我遇到过这种情况,后来通过 先聚类后采样 增加 MNN 对才解决问题。
- 深度学习不是银弹:scVI 训练时要注意 潜在维度(n_latent)——设小了欠拟合,设大了过拟合。我个人习惯从 10 开始调,看重构误差和批次混合度。
好了,三类方法的大框架就是这些。你下次拿到新数据集心里就有谱了,至少知道该往哪个方向找工具。实际整合时,我往往会跑两种不同类的方法对比,挑一个在保留生物信号和去除批次效应上平衡最好的。