前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Seurat软件学习3-scrna数据整合分析注释数据集

Seurat软件学习3-scrna数据整合分析注释数据集

作者头像
小胡子刺猬的生信学习123
发布2022-10-04 15:58:13
9470
发布2022-10-04 15:58:13
举报

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
analysis-1.png
analysis-1.png

使用综合参考的细胞类型分类

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")
vlnplots-1.png
vlnplots-1.png

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
panc.refdimplots-1.png
panc.refdimplots-1.png

本文系外文翻译,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系外文翻译前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 单细胞参考图谱介绍
  • 数据集预处理
  • 整合3个胰岛细胞数据集
  • 使用综合参考的细胞类型分类
  • UMAP 投影
    • MapQuery 在做什么?
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档