4. Harmony vs 其他整合方法:一场硬碰硬的比较

讲完Harmony的实战操作,咱们得聊聊它跟其他整合方法到底有什么区别。我入行那会儿,单细胞整合还停留在“暴力MNN”的阶段,后来Seurat CCA火了一把,再后来scVI又来凑热闹。说白了,每种方法都有自己的脾气。今天就掰开了讲清楚。

核心问题一览:
  • 什么时候该用Harmony?什么时候该用CCA?
  • MNN那个“配对”逻辑到底优在哪、坑在哪?
  • scVI带来的“神经网络光环”有没有必要?
  • 四者整合后的下游分析(差异表达、聚类等)表现到底谁稳?

4.1 Harmony vs Seurat CCA 整合

这是最常见的一对对比,也是我经常被学员问到的点。先看逻辑本质——CCA找的是“跨批次共享的基因共变异信息”,Harmony做的是“软聚类+迭代纠偏”。嗯,这里面差别大了。

对比维度 Harmony Seurat CCA
核心算法 软聚类 + 迭代校正嵌入 典型相关分析 + 互近邻(MNN)修正
输入数据 主成分(PC)空间 基因表达 / 特征基因
适用场景 大样本、复杂批次、细胞类型差异显著 批次间共享亚群较多
计算资源 中 高(尤其特征选择+CCA计算)
整合后空间 Harmony纠正后的PC嵌入 CCA空间 + 锚点校正
保持生物学差异 较好(软聚类避免过融合) 良好(锚点加权保护稀有细胞)
个人经验: 如果批次之间细胞类型组成差异大(比如一个样本全是T细胞,另一个全是B细胞),CCA容易把不该拉近的细胞强行拉到一起。Harmony的软聚类反而更安全。我做过一个胃癌数据集,三个批次分别富集了不同免疫亚群,CCA整合完有一部分记忆T细胞居然跟中性粒细胞混在一起,Harmony就没这问题。

代码层面的调用区别也很直接:

# Harmony 整合
harmony_embedding <- RunHarmony(
  object = seurat_obj,
  group.by.vars = "batch",
  reduction = "pca",
  dims.use = 1:30,
  max.iter.harmony = 10
)

# Seurat CCA 整合(经典老版本思路)
anchors <- FindIntegrationAnchors(
  object.list = list(obj1, obj2),
  dims = 1:30,
  anchor.features = 2000
)
integrated <- IntegrateData(
  anchorset = anchors,
  dims = 1:30
)

# Seurat v5 整合(新版)
integrated <- IntegrateLayers(
  object = seurat_obj_list,
  method = "CCAIntegration",
  orig.reduction = "pca"
)

看到区别没?Harmony一行就搞定,集成到Seurat流程里简直丝滑。CCA需要两步走——先找锚点,再整合数据。我曾经在生产流程里做过对比,100k细胞的数据,Harmony跑完大概2分钟,CCA跑了快15分钟加内存吃紧。

4.2 Harmony vs MNN 整合

MNN(Mutual Nearest Neighbors)是更早的方法,也是不少老牌流程(如scran、batchelor)的核心。它的逻辑是:找到批次之间互为K近邻的细胞对,用这些“互近邻”来推测校正方向。

MNN的优缺点我直接列:

  • 优点:
    • 不需要同一种降维方法,适用性广
    • 对批次间共享结构敏感,能保留稀有细胞
    • 理论上可处理多批次
  • 缺点:
    • 配对计算开销随细胞数指数增长
    • 如果两个批次没有共享的细胞类型,MNN找不到配对,整合直接崩
    • 参数敏感(k值、度量距离等)
    • 校正后的空间不稳定,多次运行结果有差异

举个例子你就明白了。MNN就像找“双胞胎”——两个批次里长得最像的细胞,用它俩的差异来推其他细胞该往哪里挪。可如果两个批次里根本没有双胞胎呢?

亲身踩坑: 我在一次跨物种整合(小鼠vs人)时用了MNN,结果大部分MNN配对的置信度极低,整合后两个物种的细胞反而更分散了。Harmony靠的是全局结构信息,不需要特定的配对,这种情况下表现稳得多。

而且MNN整合后的嵌入是逐对校正的,如果把三个批次合并,需要先校正A与B,再校正AB与C,这个过程会丢失一些信息。Harmony是一次性把所有批次嵌入到一个共同的“软聚类空间”里,信息损失最小。

4.3 Harmony vs scVI 整合

scVI是这两年火起来的深度学习方法。它通过VAE(变分自编码器)在生成数据的同时也学习批次校正。听起来很酷对吧?我一开始也觉得这玩意儿是黑科技,但真用下来发现事情没那么简单。

对比维度 Harmony scVI
算法范式 基于聚类/优化的经典方法 基于深度学习的生成模型
运行速度 快(O(n)级,n为细胞数) 慢(需要收敛验证,GPU为佳)
可解释性 高(校正过程透明,参数可控) 低(隐变量、黑盒子)
数据要求 低(普通表达矩阵即可) 高(需要GPU、大内存、数据量10k+)
灵活度 中等(主要支持PC/UMAP空间) 高(可同时做降维、校正、差异表达)
整合后质量 稳定,批次融合均匀 波动(取决于模型训练充分度)

为什么会这样? scVI的底层逻辑是:我帮你把批次成分“解释掉”,把真正的生物学变异保留下来。听起来很完美,但实际操作中,如果数据量不够大(比如只有几千个细胞),VAE学不到可靠的潜空间。而且,训练网络需要调超参,如果epoch设少了,整合效果还不如直接用Harmony。

# scVI 训练代码示例(用scvi-tools包)
import scvi
import scanpy as sc

adata = sc.read_h5ad("your_data.h5ad")
scvi.model.SCVI.setup_anndata(adata, batch_key="batch")
model = scvi.model.SCVI(adata)
model.train(max_epochs=400)

# 提取校正后的嵌入
scvi_latent = model.get_latent_representation()

# scVI 同时也做差异表达
de_results = model.differential_expression(
    adata,
    groupby="cell_type",
    batch_correction=True
)
我的习惯: 只有做特别精细的下游分析(比如差异表达、基因调控网络推断)时,我才考虑用scVI。日常QC、聚类、可视化,Harmony又快又稳,没必要上大炮打蚊子。

4.4 终极对比:一张图看清四者差异

我动手画了张对比图,把这些整合方法按“校正粒度”和“计算开销”两个维度排了个位。你一看就明白了。

单细胞整合方法对比一览 计算开销 校正粒度(由粗糙到精细) 低 高 粗糙 精细 Harmony 软聚类+嵌入迭代 低开销·中粒度 Seurat CCA 典型相关+锚点 中开销·细粒度 MNN 互近邻配对 中高开销·细粒度 scVI 深度生成模型 高开销·极细粒度 总结:日常冲量→Harmony;精细基因分析→CCA/scVI;跨物种或特殊结构→MNN 偏好稳、快、透明 → Harmony;愿意调试DeepLearning追求极致 → scVI

4.5 经验总结:怎么选?

说了这么多,我给出自己的选择树。你照着这个思路来,基本不会踩大坑:

  1. 细胞数10万+,批次多(3+): 直接用Harmony。效率和效果最平衡。
  2. 批次少(2-3),且共享细胞类型明确: Seurat CCA也不错,但跑Harmony不会错。
  3. 跨物种、跨平台、或者数据噪音大: 首选Harmony。MNN容易找不到配对,CCA对特征选择有要求。
  4. 重度下游分析(差异表达、细胞轨迹): 可以用scVI的潜空间,但建议同时跑Harmony做对比验证。
  5. 需要可重复、透明化的生产环境: Harmony胜出。参数少,同一数据跑N次结果一样。

最后再啰嗦一句: 我见过有人把四种方法全跑一遍,然后选“看起来最好看的UMAP”—千万不要这样!应该在选方法前就明确你的生物学问题是什么。你是找稀有细胞?做差异表达?还是构建细胞图谱?不同目标适配不同方法。