3. 经典批次校正方法概览:ComBat、MNN、CCA、Harmony、scVI、BBNN的适用场景与对比

做单细胞批次校正这些年,我见过不少人一上来就怼着数据跑 Harmony,结果效果还不如不做。说白了,选方法之前得先搞清楚每家的脾气。这六个方法——ComBat、MNN、CCA、Harmony、scVI、BBNN——各有各的路数,没有万能钥匙。这一节我就把它们的适用场景、原理差异、以及我在项目中踩过的坑,摊开来给你讲清楚。

ComBat:最稳的线性选手

ComBat 最早是处理基因表达芯片批次效应的,后来被引到单细胞里。它的核心假设是:批次效应只在均值和方差上做文章,而且基因之间独立。所以你想想看,如果你的数据里批次差异比较温和、细胞类型没被严重扭曲,ComBat 是个非常保守的选择。我曾经在一个 10x 和 Drop-seq 的整合项目里试过,ComBat 跑完,UMAP 上批次边界几乎消失了,但某些稀有细胞亚群也被拉平了——嗯,这点得警惕。

提示:ComBat 对内存很友好,几千个细胞的场景秒出结果。但千万别拿它处理>10万细胞的数据,矩阵太大容易爆内存。

MNN:专治非线性的「匹配邻居法」

MNN(Mutual Nearest Neighbors)完全不假设分布形态。它的做法是在两个批次之间找互为最近邻的细胞对,然后拿这些对来估算校正向量。我个人的习惯是,当批次之间有明显的生物学差异(比如不同组织来源),而且你有充足计算资源时,首推 MNN。它不像 ComBat 那样「硬拉」,校正后能保留更多细胞状态的连续性。

但注意,MNN 对批次内细胞类型比例敏感。我曾经碰过一个样品:一个批次里 T 细胞占 80%,另一个里只占 20%,MNN 校正后反而把 T 细胞的转录谱搞偏了,就是因为匹配邻居太少,校正向量被污染了。

避坑:MNN 默认用前 20 个主成分计算邻居,但单细胞数据噪声大时,我建议先做 QC 和 HVG 筛选,把主成分数加到 50 以上,匹配质量会好很多。

CCA:Seurat 老用户的默认选项

CCA(Canonical Correlation Analysis)本质是找两组数据之间的公共相关结构。Seurat 的整合流程就是基于 CCA + MNN 的变体。用它做批次校正,最大的好处是流程成熟、社区文档多。

我记得有一次帮同事整合两个骨髓样本,CCA 跑出来的共享相关性图谱特别漂亮,但后来发现一个批次里的巨核细胞在另一个批次里根本不存在,CCA 硬生生把它们拉了回来,导致巨核细胞被「插值」成了单核细胞——这事让我意识到:CCA 假设批次间共享细胞状态是必须的,否则别用。

适用范围:适合批次之间细胞类型组成基本一致的情况。如果某个细胞类型完全缺失在另一个批次里,最好单独留出来不参与整合。

Harmony:快,适合大规模数据

Harmony 使用软聚类 + 迭代优化,把细胞投影到低维空间,然后根据细胞在批次间的聚类混合程度来回调整。说白了,它是个迭代式的「拉」过程。

我个人特别喜欢 Harmony 的地方在于:跑得快,百万级细胞也能几分钟搞定。但代价是什么?代价是校正后的空间里,局部结构可能会被过度平滑。我在一个含有 50 万细胞的人肺图谱项目里用过 Harmony,校正后 batch 确实不见了,但原本很清晰的肺泡 II 型细胞 cluster 边界也变得模糊——这和 Harmony 的「全局对齐」本质有关。

一句话总结:Harmony 是「速度优先」的工业级方案,适合探索性分析。如果要精确定位稀有亚群,建议用 scVI 或者 MNN 做个双重验证。

scVI:深度学习时代的万能工具箱

scVI 是个变分自编码器(VAE),它把批次标签当作条件变量塞进模型,直接学出一个批次无关的潜在空间。为什么它能这么灵活?因为神经网络可以拟合任意复杂的非线性映射。

我最早接触 scVI 时,被它的结果震惊了——既保留了细胞状态的结构,又很好去掉了批次效应。但后来在实际项目里我遇到过麻烦:训练不稳定。有一次跑 10 个 epoch 和 100 个 epoch 出来的 UMAP 完全不一样。后来翻文档才发现,默认学习率对大批次数据太激进,需要调。所以别拿 scVI 当黑盒,至少得跑个学习率扫描。

适用场景:>10万细胞、批次效应复杂、有 GPU 环境。不适用于设备只有 CPU 的小项目,训练时间太长。

BBNN:老江湖的贝叶斯非参数方法

BBNN(Batch Balanced Nearest Neighbors)不是主流方法,但它有个特点:它不假设批次效应是全局的,而是每个细胞独立做校正。它构建一个批次平衡的 kNN 图,然后用图上的局部信息调整表达值。

我记得在一个多组织(肺、肝、肾)整合的项目里,传统方法都失败了,因为三个组织的细胞状态差异太大了。唯一能跑通的就是 BBNN,因为它每个细胞只在自己最相似的跨批次邻居上做调整,不会强拉到全局。缺点也很明显:慢,而且对邻居数量 k 非常敏感。我一般设 k=50 左右,然后手动检查几个标志基因的情况。

注意:BBNN 的 R 包已经多年没更新,Python 实现也不多。如果不是实在没办法,不建议在生产环境中用。

方法对比一览

我把六种方法的关键参数整理成了一张表,方便你快速选型:

方法核心假设速度GPU支持推荐场景我的经验评分
ComBat线性、基因独立快否小规模、温和批次3/5
MNN非线性、局部匹配中等部分批次组成相似4/5
CCA共享结构快否细胞类型一致3/5
Harmony软聚类迭代极快否大规模探索4/5
scVIVAE非线性中等(GPU快)是复杂批次、大样本5/5(有GPU)
BBNN细胞独立局部校正慢否极端异质性2/5

怎么选?我画了张决策图

以下这个流程图是我平时做决策的套路,从数据规模和批次效应强弱开始判断:

批次校正方法选择决策树 数据规模>1万细胞? 有GPU资源? ✅ 选 scVI ✅ 选 Harmony 批次效应复杂? ✅ 选 MNN 细胞类型组成一致? ✅ 选 CCA ✅ 选 ComBat 特殊情况 • 极端异质性:试 BBNN • 已知批次完全不对齐?先检查数据 • 资源极度有限:ComBat 永远保底 选择后务必检查 Marker基因表达

我个人习惯把这个决策图打印出来贴在显示器边上。实际项目里很少有人一步到位,通常是先跑个 Harmony 看看全局,再用 scVI 精调。但只要记住了这张图的核心分叉点——「数据规模」和「批次效应的复杂程度」——就不会跑偏。

最后一句大实话:方法选得对,校正省一半力气。我曾经为了省事直接跑默认参数,结果最后花了三天手动调图。所以别偷懒,至少用两种方法交叉验证一下。否则你校正出来的细胞簇,到底是生物学信号还是校正伪影,谁也说不清。