Seurat软件学习1-多个模型得数据进行整合:https://cloud.tencent.com/developer/article/2130078
Seurat软件学习2-scrna数据整合分析:https://cloud.tencent.com/developer/article/2131431
单细胞参考图谱介绍
在这个小节中,我们首先建立一个集成参考,然后演示如何利用这个参考来注释新的查询数据集。生成一个集成的参考与集成介绍说明中详细描述的工作流程相同。一旦生成,该参考可以通过细胞类型标签转移和将查询细胞投射到参考UMAPs等任务来分析其他查询数据集。值得注意的是,这不需要对基础的原始查询数据进行校正,因此,如果有高质量的参考数据,这将是一个有效的策略。
数据集预处理
出于本示例的目的,我们选择了通过四种技术产生的人类胰岛细胞数据集,即 CelSeq (GSE81076) CelSeq2 (GSE85241)、Fluidigm C1 (GSE86469) 和 SMART-Seq2 (E-MTAB-5061)。为方便起见,我们通过 SeuratData 包分发此数据集。元数据包含四个数据集中每个单元的技术(技术列)和单元类型注释(单元类型列)。
代码语言:javascript复制library(Seurat)
library(SeuratData)
InstallData("panc8")
为了构建一个参考,我们将确定各个数据集之间的 "锚"。首先,我们将合并后的对象分成一个列表,每个数据集都是一个元素(这只是必要的,因为数据被捆绑在一起,便于分割)。
代码语言:javascript复制data("panc8")
pancreas.list <- SplitObject(panc8, split.by = "tech")
pancreas.list <- pancreas.list[c("celseq", "celseq2", "fluidigmc1", "smartseq2")]
在寻找锚点之前,我们进行标准的预处理(对数正态化),并为每个人单独确定变量特征。请注意,Seurat实现了一种基于方差稳定变换("vst")的改进方法来选择变量特征。
代码语言:javascript复制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之间)。
代码语言:javascript复制reference.list <- pancreas.list[c("celseq", "celseq2", "smartseq2")]
pancreas.anchors <- FindIntegrationAnchors(object.list = reference.list, dims = 1:30)
然后我们将这些锚传递给IntegrateData()函数,该函数返回一个Seurat对象。
返回的对象将包含一个新的Assay,它持有所有细胞的综合(或 "批量校正")表达矩阵,使它们能够被联合分析。
代码语言:javascript复制pancreas.integrated <- IntegrateData(anchorset = pancreas.anchors, dims = 1:30)
运行IntegrateData()后,Seurat对象将包含一个新的具有整合表达矩阵的Assay。请注意,原始的(未校正的)数值仍然保存在 "RNA "测定的对象中,所以你可以来回切换。
然后我们可以使用这个新的整合矩阵进行下游分析和可视化。在这里,我们对整合后的数据进行缩放,运行PCA,并使用UMAP对结果进行可视化。整合后的数据集按细胞类型分组,而不是按技术分组。
代码语言:javascript复制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, verbose = FALSE)
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 还支持将参考数据(或元数据)投影到查询对象上。虽然许多方法是保守的(两个过程都从识别锚点开始),但数据传输和集成之间有两个重要区别:
1.在数据传输中,Seurat 不会更正或修改查询表达式数据。
2.在数据传输中,Seurat 有一个选项(默认设置)将参考的 PCA 结构投影到查询上,而不是使用 CCA 学习联合结构。我们通常建议在 scRNA-seq 数据集之间投影数据时使用此选项。
找到锚点后,我们使用 TransferData() 函数根据参考数据(参考细胞类型标签的向量)对查询细胞进行分类。 TransferData() 返回一个包含预测 ID 和预测分数的矩阵,我们可以将其添加到查询元数据中。
代码语言:javascript复制pancreas.query <- pancreas.list[["fluidigmc1"]]
pancreas.anchors <- FindTransferAnchors(reference = pancreas.integrated, query = pancreas.query,
dims = 1:30, reference.reduction = "pca")
predictions <- TransferData(anchorset = pancreas.anchors, refdata = pancreas.integrated$celltype,
dims = 1:30)
pancreas.query <- AddMetaData(pancreas.query, metadata = predictions)
因为我们有来自完整集成分析的原始标签注释,所以我们可以评估我们预测的细胞类型注释与完整参考的匹配程度。在这个例子中,我们发现细胞类型分类的一致性很高,超过 96% 的细胞被正确标记。
代码语言:javascript复制pancreas.query$prediction.match <- pancreas.query$predicted.id == pancreas.query$celltype
table(pancreas.query$prediction.match)
##
## FALSE TRUE
## 21 617
为了进一步验证这一点,我们可以检查特定胰岛细胞群的一些典型细胞类型标记。请注意,即使其中一些细胞类型仅由一两个细胞(例如 epsilon 细胞)表示,我们仍然能够正确分类它们。
代码语言:javascript复制table(pancreas.query$predicted.id)
##
## acinar activated_stellate alpha beta
## 22 17 253 256
## delta ductal endothelial gamma
## 22 30 12 18
## macrophage mast schwann
## 1 2 5
VlnPlot(pancreas.query, c("REG1A", "PPY", "SST", "GHRL", "VWF", "SOX10"), group.by = "predicted.id")
UMAP 投影
在 Seurat v4 中,我们还启用了将查询投影到参考 UMAP 结构上。这可以通过计算参考 UMAP 模型然后调用 MapQuery() 而不是 TransferData() 来实现。
代码语言:javascript复制pancreas.integrated <- RunUMAP(pancreas.integrated, dims = 1:30, reduction = "pca", return.model = TRUE)
pancreas.query <- MapQuery(anchorset = pancreas.anchors, reference = pancreas.integrated, query = pancreas.query,
refdata = list(celltype = "celltype"), reference.reduction = "pca", reduction.model = "umap")
MapQuery 在做什么?
MapQuery() 是三个函数的包装器:TransferData()、IntegrateEmbeddings() 和 ProjectUMAP()。 TransferData() 用于传输细胞类型标签并估算 ADT 值; IntegrateEmbeddings() 用于通过校正查询的投影低维嵌入来整合参考与查询;最后 ProjectUMAP() 用于将查询数据投影到引用的 UMAP 结构上。使用中间函数执行此操作的等效代码如下:
代码语言:javascript复制pancreas.query <- TransferData(anchorset = pancreas.anchors, reference = pancreas.integrated, query = pancreas.query,
refdata = list(celltype = "celltype"))
pancreas.query <- IntegrateEmbeddings(anchorset = pancreas.anchors, reference = pancreas.integrated,
query = pancreas.query, new.reduction.name = "ref.pca")
pancreas.query <- ProjectUMAP(query = pancreas.query, query.reduction = "ref.pca", reference = pancreas.integrated,
reference.reduction = "pca", reduction.model = "umap")
我们现在可以在参考旁边可视化结果。
代码语言:javascript复制p1 <- DimPlot(pancreas.integrated, reduction = "umap", group.by = "celltype", label = TRUE, label.size = 3,
repel = TRUE) NoLegend() ggtitle("Reference annotations")
p2 <- DimPlot(pancreas.query, reduction = "ref.umap", group.by = "predicted.celltype", label = TRUE,
label.size = 3, repel = TRUE) NoLegend() ggtitle("Query transferred labels")
p1 p2