3. 经典批次校正方法概览:ComBat、MNN、CCA、Harmony、scVI、BBNN的适用场景与对比
做单细胞批次校正这些年,我见过不少人一上来就怼着数据跑 Harmony,结果效果还不如不做。说白了,选方法之前得先搞清楚每家的脾气。这六个方法——ComBat、MNN、CCA、Harmony、scVI、BBNN——各有各的路数,没有万能钥匙。这一节我就把它们的适用场景、原理差异、以及我在项目中踩过的坑,摊开来给你讲清楚。
ComBat:最稳的线性选手
ComBat 最早是处理基因表达芯片批次效应的,后来被引到单细胞里。它的核心假设是:批次效应只在均值和方差上做文章,而且基因之间独立。所以你想想看,如果你的数据里批次差异比较温和、细胞类型没被严重扭曲,ComBat 是个非常保守的选择。我曾经在一个 10x 和 Drop-seq 的整合项目里试过,ComBat 跑完,UMAP 上批次边界几乎消失了,但某些稀有细胞亚群也被拉平了——嗯,这点得警惕。
MNN:专治非线性的「匹配邻居法」
MNN(Mutual Nearest Neighbors)完全不假设分布形态。它的做法是在两个批次之间找互为最近邻的细胞对,然后拿这些对来估算校正向量。我个人的习惯是,当批次之间有明显的生物学差异(比如不同组织来源),而且你有充足计算资源时,首推 MNN。它不像 ComBat 那样「硬拉」,校正后能保留更多细胞状态的连续性。
但注意,MNN 对批次内细胞类型比例敏感。我曾经碰过一个样品:一个批次里 T 细胞占 80%,另一个里只占 20%,MNN 校正后反而把 T 细胞的转录谱搞偏了,就是因为匹配邻居太少,校正向量被污染了。
CCA:Seurat 老用户的默认选项
CCA(Canonical Correlation Analysis)本质是找两组数据之间的公共相关结构。Seurat 的整合流程就是基于 CCA + MNN 的变体。用它做批次校正,最大的好处是流程成熟、社区文档多。
我记得有一次帮同事整合两个骨髓样本,CCA 跑出来的共享相关性图谱特别漂亮,但后来发现一个批次里的巨核细胞在另一个批次里根本不存在,CCA 硬生生把它们拉了回来,导致巨核细胞被「插值」成了单核细胞——这事让我意识到:CCA 假设批次间共享细胞状态是必须的,否则别用。
适用范围:适合批次之间细胞类型组成基本一致的情况。如果某个细胞类型完全缺失在另一个批次里,最好单独留出来不参与整合。
Harmony:快,适合大规模数据
Harmony 使用软聚类 + 迭代优化,把细胞投影到低维空间,然后根据细胞在批次间的聚类混合程度来回调整。说白了,它是个迭代式的「拉」过程。
我个人特别喜欢 Harmony 的地方在于:跑得快,百万级细胞也能几分钟搞定。但代价是什么?代价是校正后的空间里,局部结构可能会被过度平滑。我在一个含有 50 万细胞的人肺图谱项目里用过 Harmony,校正后 batch 确实不见了,但原本很清晰的肺泡 II 型细胞 cluster 边界也变得模糊——这和 Harmony 的「全局对齐」本质有关。
scVI:深度学习时代的万能工具箱
scVI 是个变分自编码器(VAE),它把批次标签当作条件变量塞进模型,直接学出一个批次无关的潜在空间。为什么它能这么灵活?因为神经网络可以拟合任意复杂的非线性映射。
我最早接触 scVI 时,被它的结果震惊了——既保留了细胞状态的结构,又很好去掉了批次效应。但后来在实际项目里我遇到过麻烦:训练不稳定。有一次跑 10 个 epoch 和 100 个 epoch 出来的 UMAP 完全不一样。后来翻文档才发现,默认学习率对大批次数据太激进,需要调。所以别拿 scVI 当黑盒,至少得跑个学习率扫描。
适用场景:>10万细胞、批次效应复杂、有 GPU 环境。不适用于设备只有 CPU 的小项目,训练时间太长。
BBNN:老江湖的贝叶斯非参数方法
BBNN(Batch Balanced Nearest Neighbors)不是主流方法,但它有个特点:它不假设批次效应是全局的,而是每个细胞独立做校正。它构建一个批次平衡的 kNN 图,然后用图上的局部信息调整表达值。
我记得在一个多组织(肺、肝、肾)整合的项目里,传统方法都失败了,因为三个组织的细胞状态差异太大了。唯一能跑通的就是 BBNN,因为它每个细胞只在自己最相似的跨批次邻居上做调整,不会强拉到全局。缺点也很明显:慢,而且对邻居数量 k 非常敏感。我一般设 k=50 左右,然后手动检查几个标志基因的情况。
方法对比一览
我把六种方法的关键参数整理成了一张表,方便你快速选型:
| 方法 | 核心假设 | 速度 | GPU支持 | 推荐场景 | 我的经验评分 |
|---|---|---|---|---|---|
| ComBat | 线性、基因独立 | 快 | 否 | 小规模、温和批次 | 3/5 |
| MNN | 非线性、局部匹配 | 中等 | 部分 | 批次组成相似 | 4/5 |
| CCA | 共享结构 | 快 | 否 | 细胞类型一致 | 3/5 |
| Harmony | 软聚类迭代 | 极快 | 否 | 大规模探索 | 4/5 |
| scVI | VAE非线性 | 中等(GPU快) | 是 | 复杂批次、大样本 | 5/5(有GPU) |
| BBNN | 细胞独立局部校正 | 慢 | 否 | 极端异质性 | 2/5 |
怎么选?我画了张决策图
以下这个流程图是我平时做决策的套路,从数据规模和批次效应强弱开始判断:
我个人习惯把这个决策图打印出来贴在显示器边上。实际项目里很少有人一步到位,通常是先跑个 Harmony 看看全局,再用 scVI 精调。但只要记住了这张图的核心分叉点——「数据规模」和「批次效应的复杂程度」——就不会跑偏。