
在深入细节之前,我们先明确目标:消除不同样本(批次)间的技术性噪音(批次效应),同时保留真实的生物学差异。不同的方法在“消除噪音”和“保留信号”之间采取不同的平衡策略。
FindIntegrationAnchors + IntegrateData)就是基于这个思想。# 需要先运行PCA
obj <- RunPCA(obj, npcs = 50)
# 使用 CCA 进行整合
obj <- IntegrateLayers(
object = obj,
method = CCAIntegration,
orig.reduction = "pca", # 基于哪个降维结果进行整合
new.reduction = "integrated.cca", # 新生成的整合降维结果名称
verbose = FALSE
)
核心原理: 这是Seurat v4中引入的一种更快速的替代方案,也集成到了IntegrateLayers中。它不是直接寻找批次间的最大相关,而是将不同批次的PCA空间进行对齐。它假设共享的生物信号驱动了主要的主成分(PC),而批次效应则影响后续的PC。
obj <- IntegrateLayers(
object = obj,
method = RPCAIntegration,
orig.reduction = "pca",
new.reduction = "integrated.rpca",
verbose = FALSE
)
核心原理: Harmony采用了一种完全不同的迭代策略。它首先将所有细胞投影到一个共享的PCA空间中,然后:
orig.ident, donor, chemistry)。theta参数控制。obj <- IntegrateLayers(
object = obj,
method = HarmonyIntegration,
orig.reduction = "pca",
new.reduction = "integrated.harmony",
group.by.vars = "orig.ident", # 关键参数:指定批次变量
# Harmony 特有参数可以在此传递
theta = 2, # 增大此值会进行更强的批次校正
lambda = 1, # 控制对齐后簇的多样性,通常不需要调整
verbose = FALSE
)
核心原理: 这个方法源于batchelor包,核心是“相互最近邻”。它的逻辑是: * 对于批次A中的一个细胞,在批次B中找到它的最近邻。 * 反过来,对于批次B中的这个细胞,也在批次A中找到它的最近邻。 * 如果它们互为最近邻,那么这对细胞就是“相互最近邻(MNN)对”。 * 这代表了跨批次的、相同的细胞类型。算法基于这些MNN对来计算校正向量,对齐整个数据集。
k敏感:k(用于搜索近邻的邻居数量)的选择会影响结果,需要一定的调参。obj <- IntegrateLayers(
object = obj,
method = FastMNNIntegration,
orig.reduction = "pca",
new.reduction = "integrated.mnn",
# FastMNN 特有参数
k = 20, # 用于搜索相互最近邻的邻居数量,重要参数
verbose = FALSE
)
特性/维度 | CCAIntegration | RPCAIntegration | HarmonyIntegration | FastMNNIntegration |
|---|---|---|---|---|
速度 | 慢 | 中等 | 非常快 | 中等偏慢 |
内存占用 | 高 | 中等 | 非常低 | 中等 |
规模适用性 | < 50k 细胞 | < 200k 细胞 | > 100k ~ 百万细胞 | < 100k 细胞 |
保留生物信号 | 强(但批次效应不能太强) | 中等(可能过度校正) | 弱(为了速度会平滑信号) | 强(尤其稀有细胞) |
核心优势 | 精细结构保留 | 速度与效果平衡 | 极致的速度与扩展性 | 保留异质性与稀有群 |
关键弱点 | 慢,对强批次效应敏感 | 可能抹去真实差异 | 可能“过度平滑” | 参数敏感,计算量较大 |
DimPlot按orig.ident着色,直观检查批次效应是否被移除。clustree等包检查不同整合方法对聚类结构的影响。