在此示例工作流程中,我们演示了最近在论文中介绍的两种新方法,即单细胞数据的全面集成:
- 将多个不同的scRNA-seq数据集组装成一个集成参考
- 将单元格类型标签从参考数据集转移到新的查询数据集
出于本示例的目的,我们选择了通过四种技术(CelSeq(GSE81076)CelSeq2(GSE85241),Fluidigm C1(GSE86469)和SMART-Seq2(E-MTAB-5061))生成的人胰岛细胞数据集。为方便起见,我们通过SeuratData软件包分发此数据集。
新方法的代码在Seurat v3中实现。您可以使用从CRAN下载并安装install.packages
。
install.packages("Seurat")
除新方法外,Seurat v3包括许多旨在改善Seurat对象和用户交互的改进。为了帮助用户熟悉这些更改,我们为常见任务整理了一份命令备忘单。
数据集预处理
加载数据集。元数据包含四个数据集中每个单元的技术(tech
列)和单元类型注释(celltype
列)。
library(Seurat)
library(SeuratData)
InstallData("panc8")
为了构建参考,我们将识别各个数据集之间的“锚”。首先,我们将合并的对象分成一个列表,每个数据集都作为一个元素。
data("panc8")
pancreas.list <- SplitObject(panc8, split.by = "tech")
pancreas.list <- pancreas.list[c("celseq", "celseq2", "fluidigmc1", "smartseq2")]
在找到定位点之前,我们执行标准预处理(对数归一化),并分别为每个特征确定可变特征。请注意,Seurat v3基于方差稳定化转换("vst")实现了一种改进的可变特征选择方法。
for (i in 1:length(pancreas.list)) {
pancreas.list[[i]] <- NormalizeData(pancreas.list[[i]], verbose = FALSE)
pancreas.list[[i]] <- FindVariableFeatures(pancreas.list[[i]], selection.method = "vst",
nfeatures = 2000, verbose = FALSE)
}
整合3个胰岛细胞数据集
接下来,我们使用FindIntegrationAnchors函数识别锚点,该函数将Seurat对象列表作为输入。在这里,我们将三个对象集成到一个引用中(在本小插图的后面将使用第四个对象)
我们在这里使用所有默认参数来识别锚点,包括数据集的“维度”(30;随时尝试在较大范围内(例如10到50之间)更改此参数)。
reference.list <- pancreas.list[c("celseq", "celseq2", "smartseq2")]
pancreas.anchors <- FindIntegrationAnchors(object.list = reference.list, dims = 1:30)
然后,我们将这些锚点传递给IntegrateData函数,该函数返回Seurat对象。
返回的对象将包含一个new Assay,它为所有单元格保留一个集成的(或“批处理校正”的)表达矩阵,从而可以对它们进行联合分析。
pancreas.integrated <- IntegrateData(anchorset = pancreas.anchors, dims = 1:30)
运行后IntegrateData,该Seurat对象将包含Assay带有集成表达式矩阵的新对象。请注意,原始值(未校正的值)仍存储在“ RNA”分析中的对象中,因此您可以来回切换。
然后,我们可以使用这个新的集成矩阵进行下游分析和可视化。在这里,我们可以缩放集成数据,运行PCA并使用UMAP可视化结果。集成的数据集按单元类型而不是技术进行聚类。
library(ggplot2)
library(cowplot)
library(patchwork)
# switch to integrated assay. The variable features of this assay are automatically
# set during IntegrateData
DefaultAssay(pancreas.integrated) <- "integrated"
# Run the standard workflow for visualization and clustering
pancreas.integrated <- ScaleData(pancreas.integrated, verbose = FALSE)
pancreas.integrated <- RunPCA(pancreas.integrated, npcs = 30, verbose = FALSE)
pancreas.integrated <- RunUMAP(pancreas.integrated, reduction = "pca", dims = 1:30)
p1 <- DimPlot(pancreas.integrated, reduction = "umap", group.by = "tech")
p2 <- DimPlot(pancreas.integrated, reduction = "umap", group.by = "celltype", label = TRUE,
repel = TRUE) + NoLegend()
p1 + p2
使用集成参考进行细胞类型分类
Seurat v3还支持将参考数据(或元数据)投影到查询对象上。尽管许多方法都是保守的(两个过程都从标识锚点开始),但数据传输和集成之间有两个重要区别:
在数据传输中,Seurat不会更正或修改查询表达式数据。
在数据传输中,Seurat有一个选项(默认设置),可以将引用的PCA结构投影到查询上,而不是通过CCA学习联合结构。我们通常建议在scRNA-seq数据集之间投影数据时使用此选项。
找到锚点后,我们使用该TransferData函数根据参考数据(参考单元格类型标签的向量)对查询单元格进行分类。TransferData返回具有预测ID和预测得分的矩阵,我们可以将其添加到查询元数据中。
pancreas.query <- pancreas.list[["fluidigmc1"]]
pancreas.anchors <- FindTransferAnchors(reference = pancreas.integrated, query = pancreas.query,
dims = 1:30)
predictions <- TransferData(anchorset = pancreas.anchors, refdata = pancreas.integrated$celltype,
dims = 1:30)
pancreas.query <- AddMetaData(pancreas.query, metadata = predictions)
因为我们具有来自完整集成分析的原始标签注释,所以我们可以评估预测的单元格类型注释与完整参考的匹配程度。在此示例中,我们发现细胞类型分类有很高的共识,超过97%的细胞被正确标记。
pancreas.query$prediction.match <- pancreas.query$predicted.id == pancreas.query$celltype
table(pancreas.query$prediction.match)
##
## FALSE TRUE
## 18 620
为了进一步验证这一点,我们可以检查一些特定胰岛细胞群体的典型细胞类型标记。请注意,即使其中一些细胞类型仅由一个或两个细胞(例如epsilon细胞)表示,我们仍然能够正确分类它们。
table(pancreas.query$predicted.id)
##
## acinar activated_stellate alpha beta
## 21 17 248 258
## delta ductal endothelial epsilon
## 22 33 13 1
## gamma macrophage mast schwann
## 17 1 2 5
VlnPlot(pancreas.query, c("REG1A", "PPY", "SST", "GHRL", "VWF", "SOX10"), group.by = "predicted.id")
参考