第 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大样本,复杂批次-生物关系,多组学计算资源高,可解释性差,调参成本大

三类方法的关系图

下面这张图把整个分类体系和典型方法串了起来。你可以把它当作选型时的脑图:

批次校正方法分类 校正方法 线性方法 非线性方法 深度学习方法 ComBat Harmony MNN Scanorama scVI scANVI 选择线性?非线性?深度学习? 先观察批次效应形态,再根据数据量和资源做决定

怎么选?我的一点实战心得

  • 先跑个 PCA + UMAP:只看前两主成分,如果两个批次在 PC1 上明显分离,线性方法大概率能解决。如果互锁在一起,果断用 MNN 或 scVI。
  • 小数据用线性,大数据用深度学习:几百到几千个细胞,ComBat 几秒钟出结果,没必要启动 GPU 集群。
  • 注意批次内的亚群差异:如果批次之间相同亚群的细胞数量差异很大,非线性方法的 MNN 对可能偏少。我遇到过这种情况,后来通过 先聚类后采样 增加 MNN 对才解决问题。
  • 深度学习不是银弹:scVI 训练时要注意 潜在维度(n_latent)——设小了欠拟合,设大了过拟合。我个人习惯从 10 开始调,看重构误差和批次混合度。

好了,三类方法的大框架就是这些。你下次拿到新数据集心里就有谱了,至少知道该往哪个方向找工具。实际整合时,我往往会跑两种不同类的方法对比,挑一个在保留生物信号和去除批次效应上平衡最好的。