2. 常见批次校正算法分类

做批次校正这么多年,我最大的感受就是:没有万能药。不同实验设计、不同数据规模、不同生物学问题,适合的算法完全不同。这一章咱们就把主流的批次校正算法掰开揉碎了讲,帮你建立起自己的“算法工具箱”。

我个人习惯把算法分成四类:基于统计、基于贝叶斯、基于深度学习、基于匹配。为什么这么分?因为它们的数学原理和适用场景差异太大了。你想想看,选错了方法,校正完的数据反而会引入假阳性或者抹掉真实生物学差异,这就得不偿失了。

批次校正算法分类图谱 批次校正算法 统计方法 ComBat / RUV / Harmony 贝叶斯方法 ConQuR / BayesComBat 深度学习方法 BERMUDA / scVAE 匹配方法 MNN pair / kNN 各方法适用场景速览 ▸ 统计方法:批量小(3-10个批次)、假设分布已知、计算资源有限 ▸ 贝叶斯方法:批次少、样本量小、需要概率区间估计 ▸ 深度学习方法:批量大(>20个批次)、数据非线性和复杂、计算资源充足 ▸ 匹配方法:数据非参数分布、批次重叠度低、需要保持局部结构 工作流中到底选哪个? 数据规模 → 批次数量 → 分布假设 → 计算资源 → 生物学问题 避坑:模型校正是手段,不是目的。永远优先考虑实验设计的批次平衡。

2.1 基于统计的方法

统计方法是最早被系统研究的一类,也是我入行时最先接触的。说白了,统计方法的思路就是拿数学工具去拟合批次效应,然后用减法把它去掉。

2.1.1 ComBat及其系列

ComBat(Combining Batches)可以说是批次校正界的“元老”。它的核心思路是假设每个基因/特征在批次间有一个位置参数和一个尺度参数,然后用经验贝叶斯去估计这些参数,最后把各批次数据校正到同一个参照水平上。

我在单细胞整合项目里常遇到这种情况——不同批次的细胞聚得乱七八糟,ComBat一上就拉回来了。但要注意,ComBat假设批次效应是可加可乘的线性模型,这对RNA-seq表达量是合理的,但放到甲基化数据上就得小心了。

关键参数

  • mod:协变量矩阵(如疾病状态、处理条件),用于保护真实生物学差异
  • par.prior = TRUE:用参数化先验(速度快但假设更强)
  • mean.only = FALSE:同时也校正方差,数据平滑但可能过度校正

2.1.2 RUV系列

RUV(Remove Unwanted Variation)依赖“负对照基因”或“负对照样本”。什么是负对照?就是你确定不受生物学条件影响的基因(比如管家基因)或者空白样本。我当初用RUV做ChIP-seq校正,效果就不错,关键是要找到合适的对照。

选对照基因的几个原则:

  1. 在所有批次中稳定表达
  2. 与生物学条件无关
  3. 数量不要少于100个(太少估计不准)

2.1.3 Harmony

Harmony是近年热起来的算法,它对单细胞和空间转录组数据尤其友好。Hardy拿到PCA降维后的嵌入坐标做聚类-校正循环迭代,说白了就是把校正和聚类放在一个框架里。

# R中调用Harmony
library(harmony)
pca_matrix <- RunPCA(seurat_obj)@cell.embeddings
harmony_embedding <- HarmonyMatrix(
  data_mat = pca_matrix,
  meta_data = seurat_obj$batch,
  vars_use = "batch",
  do_pca = FALSE,
  max.iter.harmony = 10
)

嗯,Harmony的一个好处是不需要假设数据分布服从正态——它直接用软聚类来做循环优化。这一点在我处理多组学联合分析时帮了大忙。

2.2 基于贝叶斯的方法

贝叶斯方法在批次校正里的核心优势是:能给出不确定性区间。说白了,它不只是一个点估计,还能告诉你“我对这个校正结果有多自信”。

2.2.1 BayesComBat

BayesComBat是ComBat的贝叶斯版本,当初主要面向RNA-seq数据。它把批次效应参数当作随机变量,用MCMC采样得到后验分布。我记得自己在做一个小样本(n=5每批次)的RNA-seq工时,ComBat直接给出一个不太合理的校正结果,但BayesComBat因为引入了先验信息,结果就稳了很多。

为什么BayesComBat在小样本场景更稳?

因为它利用基因间的先验信息来限制极端校正。说白了,如果你只有一个基因在某个批次里表达量异常高,BayesComBat会在先验的约束下把它拉回来一点,而不是完全由观测值主导。

2.2.2 ConQuR

ConQuR(Conditional Quantile Regression)是一个比较新的方法,主要用于微生物组数据的批次校正。它用分位数回归把每个分类单元的分布在批次间对齐。

方法 分布假设 输出 适用数据
BayesComBat 正态/伽马 点估计+置信区间 RNA-seq / 芯片
ConQuR 灵活(基于分位数) 点估计 微生物组 / 稀疏矩阵

做微生物组校正时,我踩过一个坑:数据里零值太多了(某个细菌在90%样本里是0),ComBat对这种分布完全束手无策。ConQuR的分位数方法却能处理,因为它对零膨胀有天然的鲁棒性。

2.3 基于深度学习的方法

深度学习近年在批次校正中的应用越来越大。尤其是在单细胞转录组、空间转录组这类高维非线性的数据上,传统方法有时候力不从心,深度学习就顶上去了。

2.3.1 BERMUDA

BERMUDA使用自动编码器(Autoencoder)来学习批次无关的低维表示。它把每个批次的数据通过编码器映射到一个共享的隐空间,再在隐空间里做批次对齐。

# 概念性伪代码(非真实包)
from bermuda import BERMUDA
model = BERMUDA(
  input_dim=18977,       # 基因数
  latent_dim=128,        # 隐空间维度
  n_batches=4,
  lambda_recon=1.0,      # 重建损失权重
  lambda_align=0.5       # 对齐损失权重
)
model.fit(train_data, batch_labels)

说实话,我第一次看到BERMUDA能自动把6个批次的数据对齐到同一个隐空间时,挺惊讶的。它甚至不需要额外的批次标签以外的信息。但也别高兴太早,深度学习要吃数据,批次太少它的效果可能还不如ComBat。

2.3.2 scVAE系列

scVAE本质上就是变分自动编码器(VAE)加上批次标签作为条件变量。它的思路很实在——把批次效应当作一个“干扰变量”,在隐变量生成过程中剔除掉。

深度学习方法的注意事项

  • 计算资源:GPU是必需的,尤其是数据量过万样本时
  • 可重复性:DNN每次训练有随机性,需要固定随机种子
  • 可解释性:校正后的特征往往不是原始的计数/表达量,而是隐空间坐标

我见过有人用VAE给400个样本的微生物组数据做校正,结果因为隐空间太灵活,把真实信号也给抹掉了。这就是典型的过度校正。所以我的建议是:如果你批次数少(<10)、数据量小(<1000样本),先试试传统方法。深度学习不是银弹。

2.4 基于匹配的方法

匹配方法的思路和前面三类完全不同。它不拟合分布,而是直接找跨批次的“最近邻”来做对齐。

2.4.1 MNN pair匹配

MNN(Mutual Nearest Neighbors)的思想很简单:如果批次A的某个细胞a和批次B的某个细胞b互为最近邻,那它们就是来自同一生物学状态的配对“锚点”。通过这些锚点推断出全局的批次校正向量。

我遇到过一种情况——两个批次的细胞类型分布差异很大(比如批次A全是T细胞,批次B全是B细胞),这时候MNN根本找不到足够多的跨批次配对,校正效果就很差。嗯,从这也能看出匹配方法的一个前提:批次间要有足够的“重叠”,不然找不到匹配对。

2.4.2 kNN匹配(seurat v3/v5的CCA+MNN)

实际上Seurat的经典整合方法就是CCA降维 + MNN匹配 + 平滑校正三件套。它先用CCA做协同投影(让两个批次在同一个低维空间里可比),然后在CCA空间里做MNN匹配。

# Seurat整合函数
library(Seurat)
merged_obj <- merge(all_batches, project="integrated")
integrated_obj <- IntegrateData(
  seurat_obj = merged_obj,
  normalization.method = "LogNormalize",
  k.anchor = 5,
  dims = 1:30
)

我在跑Seurat整合的时候,曾经忘记检查CCA的维度是否足够保留真实信号。结果整合完了发现一个已知的疾病亚群消失了。后来我把dims从1:20改成1:40,信号就回来了。原因是那个亚群只在CCA的第25、26维上有贡献,如果维度切太窄就丢掉了。

匹配方法的三条规则

  1. 批次间必须有足够的细胞类型重叠
  2. 匹配的数量(k参数)不要太大——太大引入噪声
  3. 校正后一定要检查“过度校正”的标志:本来有差异的细胞亚群被拉平了

2.5 各方法的对比总表

分类 代表算法 核心策略 优势 劣势 适用场景
统计 ComBat / RUV / Harmony 线性模型拟合+减法 快、可解释、成熟 对非线性效应捕捉弱 RNA-seq / 芯片 / 单细胞
贝叶斯 BayesComBat / ConQuR 先验约束+MCMC 小样本稳定、概率输出 计算慢、先验偏差风险 小样本 / 稀疏数据
深度学习 BERMUDA / scVAE 隐空间对齐+生成 非线性强、特征自动化 需GPU、可解释性弱 大量样本 / 高维稀疏
匹配 MNN / kNN 最近邻锚点+平滑 无分布假设、局部保持 依赖批次重叠度 单细胞 / 空间组学

讲到这儿,你应该对这四大类算法有了基本的认识。别着急选工具,做批次校正的第一步是先搞清楚你的数据本身——哪些特征是生物学信号,哪些是批次效应。这个判断能力,比会调参数重要得多。

一句话总结:统计方法快而稳,贝叶斯方法小样本强,深度学习能吃复杂数据,匹配方法不挑分布。没有最好的算法,只有最合适的场景。