对于非常大的数据集,标准工作流程有时可能计算成本高得令人望而却步。在此工作流程中,我们可采用如下两种方法提高效率和运行时间:
- 互惠 PCA (RPCA)
- 基于参考的整合
主要的效率改进是使用了FindIntegrationAnchors()。首先,我们使用互惠 PCA (RPCA) 而不是 CCA 来寻找锚点。在使用互惠的 PCA 确定任意两个数据集之间的锚点时,我们将每个数据集投影到其他 PCA 空间中,并根据相同的邻近要求约束锚点。所有下游整合步骤保持不变,我们能够"更正"(或协调)数据集。
此外,我们使用基于参考的整合。在标准工作流中,我们识别所有数据集之间的锚点。虽然这给数据集在下游整合中同等的权重,但它也可能使计算变得密集。例如,在整合10 个不同的数据集时,我们需要执行 45 次不同的对比。作为替代方案,我们在此介绍了指定一个或多个数据集作为整合分析的"参考",其余数据集被指定为"查询"数据集。在此工作流中,我们不会在成对查询数据集之间识别锚点,从而减少比较次数。例如,在将整合10 个数据集将其中指定的 1 个数据集集成为参考时,我们仅执行 9 次比较。基于参考的整合可应用于log标准化或 SCTransform标准化的数据集。
可选的工作流程包括以下步骤:
- 创建一个seurat对象用来整合
- 针对每个数据集分别执行标准化、基因选择和归一化
- 在列表中的每个对象上运行 PCA
- 整合数据集,并进行联合分析
总的来说,我们观察到标准工作流程和此处演示的工作流程之间惊人的相似结果,但计算时间和内存显著减少。如果数据集存在高度差异(例如,跨模式映射或跨物种映射),则只能使用一小部分基因来进行整合,您可以使用 CCA 得到更好的结果。
例如,我们将使用来自人类细胞图集的"免疫细胞图谱"数据,这些数据可以在这里找到。
library(Seurat)
获取数据后,我们首先执行标准化和变异基因选择。
bm280k.data <- Read10X_h5("../data/ica_bone_marrow_h5.h5")
bm280k <- CreateSeuratObject(counts = bm280k.data, min.cells = 100, min.features = 500)
bm280k.list <- SplitObject(bm280k, split.by = "orig.ident")
bm280k.list <- lapply(X = bm280k.list, FUN = function(x) {
x <- NormalizeData(x, verbose = FALSE)
x <- FindVariableFeatures(x, verbose = FALSE)
})
接下来,选择基因用来后续整合,并在列表中的每个对象上运行 PCA。
features <- SelectIntegrationFeatures(object.list = bm280k.list)
bm280k.list <- lapply(X = bm280k.list, FUN = function(x) {
x <- ScaleData(x, features = features, verbose = FALSE)
x <- RunPCA(x, features = features, verbose = FALSE)
})
由于此数据集包含男性和女性,我们将选择一男一女(BM1 和 BM2)用于基于参考的工作流程。通过检查XIST基因的表达来确定性别。
anchors <- FindIntegrationAnchors(object.list = bm280k.list, reference = c(1, 2), reduction = "rpca",
dims = 1:50)
bm280k.integrated <- IntegrateData(anchorset = anchors, dims = 1:50)
bm280k.integrated <- ScaleData(bm280k.integrated, verbose = FALSE)
bm280k.integrated <- RunPCA(bm280k.integrated, verbose = FALSE)
bm280k.integrated <- RunUMAP(bm280k.integrated, dims = 1:50)
DimPlot(bm280k.integrated, group.by = "orig.ident")