单细胞36计之17抛砖引玉---使用Seurat对空间转录组数据集进行分析,可视化和集成

第十七计 抛砖引玉
以自己的粗浅的意见引出别人高明的见解。

概述

本教程演示了如何使用Seurat(> = 3.2)分析空间分辨的RNA-seq数据。尽管分析流程类似于单细胞RNA序列分析的Seurat工作流程,但我们引入了更新的交互作用和可视化工具,特别着重于空间和分子信息的整合。本教程将涵盖以下任务,我们认为这些任务在许多空间分析中都是常见的:

  • 正常化
  • 降维和聚类
  • 检测空间可变特征
  • 互动可视化
  • 与单细胞RNA-seq数据整合
  • 处理多个切片

对于我们的第一个小插图,我们分析了使用10x Genomics的Visium技术生成的数据集。我们将扩展Seurat以便在不久的将来使用其他数据类型,包括SLIDE-SeqSTARmapMERFISH

首先,我们加载Seurat和此小插图所需的其他软件包。

library(Seurat)
library(SeuratData)
library(ggplot2)
library(patchwork)
library(dplyr)

10倍的Visium

数据集

在这里,我们将使用使用Visium v1化学方法生成的最近发布的矢状小鼠大脑切片的数据集。有两个连续的前节和两个(匹配的)连续后节。

您可以在此处下载数据,然后使用该Load10X_Spatial()功能将其加载到Seurat中。这将读取spaceranger管道的输出,并返回一个Seurat对象,该对象包含点级表达数据以及组织切片的关联图像。您还可以使用我们的SeuratData包来轻松访问数据,如下所示。安装数据集后,您可以键入?stxBrain以了解更多信息。

InstallData("stxBrain")
brain <- LoadData("stxBrain", type = "anterior1")

数据预处理

我们通过基因表达数据当场执行的初始预处理步骤与典型的scRNA-seq实验相似。我们首先需要对数据进行归一化,以解决各个数据点之间的测序深度差异。我们注意到,对于空间数据集,分子计数/斑点的差异可能很大,尤其是在组织中细胞密度存在差异的情况下。我们在这里看到大量的异质性,这需要有效的规范化。

plot1 <- VlnPlot(brain, features = "nCount_Spatial", pt.size = 0.1) + NoLegend()
plot2 <- SpatialFeaturePlot(brain, features = "nCount_Spatial") + theme(legend.position = "right")
wrap_plots(plot1, plot2)
image.png

这些图表明,斑点上分子计数的变化不仅是技术上的问题,而且还取决于组织的解剖结构。例如,神经元(例如皮质白质)耗竭的组织区域可再现地显示出较低的分子数。结果,在标准化后LogNormalize()`强制每个数据点具有相同的底层“大小”的标准方法(例如函数)可能会出现问题。

作为替代方案,我们建议使用sctransform(Hafemeister和Satija,Genome Biology 2019),它构建了基因表达的正则化负二项式模型,以便在保留生物学差异的同时考虑技术伪像。有关sctransform更多详细信息,请参见文章在这里和修拉的小插曲在这里。sctransform可以对数据进行归一化,检测高变异特征并将数据存储在SCT测定中。

brain <- SCTransform(brain, assay = "Spatial", verbose = FALSE)

基因表达可视化

在Seurat中,我们具有探索空间数据固有的视觉本质并与之交互的功能。SpatialFeaturePlot()Seurat中的功能FeaturePlot()`可以扩展,并且可以在组织组织学之上叠加分子数据。例如,在此小鼠大脑数据集中,基因Hpca是强海马标志物,而Ttr是脉络丛的标志物。

SpatialFeaturePlot(brain, features = c("Hpca", "Ttr"))
image.png

Seurat中的默认参数强调分子数据的可视化。但是,您还可以通过更改以下参数来调整斑点的大小(及其透明度),以改善组织学图像的可视化:

  • pt.size.factor-这将缩放斑点的大小。默认值为1.6
  • alpha-最小和最大透明度。默认值为c(1,1)。
  • 尝试设置为alphac(0.1,1),以降低具有较低表达式的点的透明度
p1 <- SpatialFeaturePlot(brain, features = "Ttr", pt.size.factor = 1)
p2 <- SpatialFeaturePlot(brain, features = "Ttr", alpha = c(0.1, 1))
p1 + p2
image

降维,聚类和可视化

然后,我们可以使用与scRNA-seq分析相同的工作流程,对RNA表达数据进行降维和聚类。

brain <- RunPCA(brain, assay = "SCT", verbose = FALSE)
brain <- FindNeighbors(brain, reduction = "pca", dims = 1:30)
brain <- FindClusters(brain, verbose = FALSE)
brain <- RunUMAP(brain, reduction = "pca", dims = 1:30)

然后,我们可以在UMAP空间带有DimPlot())中可视化聚类的结果,或者使用覆盖可视化图像上的聚类结果SpatialDimPlot()

p1 <- DimPlot(brain, reduction = "umap", label = TRUE)
p2 <- SpatialDimPlot(brain, label = TRUE, label.size = 3)
p1 + p2
image

由于存在许多种颜色,因此可视化哪个体素属于哪个群集可能具有挑战性。我们有一些策略可以帮助您解决这个问题。设置label参数会在每个群集的中位数处放置一个彩色框(请参见上图)。

您还可以使用cells.highlight参数在上划分特定的关注单元格SpatialDimPlot()`。如下所示,这对于区分单个群集的空间定位非常有用。

SpatialDimPlot(brain, cells.highlight = CellsByIdentities(object = brain, idents = c(2, 1, 4, 3, 
    5, 8)), facet.highlight = TRUE, ncol = 3)
image

交互式绘图

我们还内置了许多交互式绘图功能。无论SpatialDimPlot()SpatialFeaturePlot()现在有一个interactive参数,当设置为TRUE,将打开Rstudio观众面板与互动闪亮的情节。下面的示例演示了一种交互式SpatialDimPlot()的方法,您可以在其上悬停并查看单元名称和当前标识类(类似于先前的do.hover`行为)。

SpatialDimPlot(brain, interactive = TRUE)

对于SpatialFeaturePlot(),将“交互性”设置为TRUE会弹出一个交互窗格,您可以在其中调整点的透明度,点的大小以及Assay`要绘制的和特征。浏览数据后,选择完成按钮将返回最后一个活动图作为ggplot对象。

SpatialFeaturePlot(brain, features = "Ttr", interactive = TRUE)

LinkedDimPlot()`功能将UMAP表示链接到组织图像表示,并允许交互式选择。例如,您可以在UMAP图中选择一个区域,并且图像表示中的相应斑点将突出显示。

LinkedDimPlot(brain)

识别空间可变特征

Seurat提供了两种工作流程来识别与组织内空间位置相关的分子特征。第一种是基于组织内预先标注的解剖区域执行差异表达,这可以从无监督的聚类或先验知识中确定。在这种情况下,此策略将起作用,因为上面的群集显示出明显的空间限制。

de_markers <- FindMarkers(brain, ident.1 = 5, ident.2 = 6)
SpatialFeaturePlot(object = brain, features = rownames(de_markers)[1:3], alpha = c(0.1, 1), ncol = 3)
image.png

在中实施的另一种方法FindSpatiallyVariables()是在没有预先注释的情况下搜索表现出空间图案的特征。默认方法(method = 'markvariogram)受Trendsceek启发,该工具将空间转录组学数据建模为标记点过程,并计算“变异函数”,该变异函数可识别表达水平取决于其空间位置的基因。更具体地说,此过程计算gamma(r)值,该值测量相距某个“ r”距离的两个点之间的依赖性。默认情况下,我们在这些分析中使用r值“ 5”,并且仅计算可变基因的这些值(其中变异独立于空间位置而计算)以节省时间。

我们注意到,文献中有多种方法可以完成此任务,包括SpatialDESplotch。我们鼓励感兴趣的用户探索这些方法,并希望在不久的将来为其提供支持。

brain <- FindSpatiallyVariableFeatures(brain, assay = "SCT", features = VariableFeatures(brain)[1:1000], 
    selection.method = "markvariogram")

现在,我们可视化此度量确定的前6个特征的表达。

top.features <- head(SpatiallyVariableFeatures(brain, selection.method = "markvariogram"), 6)
SpatialFeaturePlot(brain, features = top.features, ncol = 3, alpha = c(0.1, 1))
image.png

细分解剖区域

与单单元格对象一样,您可以对对象进行子集化以集中处理数据的子集。在这里,我们大约将额叶皮层子集化。该过程还有助于在下一节中将这些数据与皮质scRNA-seq数据集进行整合。首先,我们获取群集的子集,然后根据精确位置进行进一步细分。子集化后,我们可以在完整图像或裁剪后的图像上可视化皮质细胞。

cortex <- subset(brain, idents = c(1, 2, 3, 4, 6, 7))
# now remove additional cells, use SpatialDimPlots to visualize what to remove
# SpatialDimPlot(cortex,cells.highlight = WhichCells(cortex, expression = image_imagerow > 400 |
# image_imagecol < 150))
cortex <- subset(cortex, anterior1_imagerow > 400 | anterior1_imagecol < 150, invert = TRUE)
cortex <- subset(cortex, anterior1_imagerow > 275 & anterior1_imagecol > 370, invert = TRUE)
cortex <- subset(cortex, anterior1_imagerow > 250 & anterior1_imagecol > 440, invert = TRUE)
p1 <- SpatialDimPlot(cortex, crop = TRUE, label = TRUE)
p2 <- SpatialDimPlot(cortex, crop = FALSE, label = TRUE, pt.size.factor = 1, label.size = 3)
p1 + p2
image

与单细胞数据集成

在〜50um时,来自于病毒测定的斑点将涵盖多个细胞的表达谱。对于可获得scRNA-seq数据的系统列表不断增加,用户可能有兴趣对每个空间体素进行“反卷积”以预测细胞类型的潜在组成。在准备此小插图时,我们使用了参考scRNA-seq数据集测试了多种decovonlution和整合方法使用SMART-Seq2协议生成的来自Allen Institute的约14,000个成年小鼠皮质细胞分类学。我们一直发现使用积分方法(而不是反卷积方法)具有更好的性能,这可能是由于表征空间和单细胞数据集的噪声模型存在很大差异,并且积分方法专门设计为对这些差异具有鲁棒性。因此,我们应用了Seurat v3中引入的基于“锚”的集成工作流,该工作流使注释能够从引用到查询集的概率传输。因此,我们利用sctransform归一化方法遵循此处介绍的标签传输工作流程,但期望开发出新方法来完成此任务。

我们首先加载数据(可在此处下载),对scRNA-seq参考进行预处理,然后执行标签转移。该过程为每个点输出每个scRNA-seq派生类的概率分类。我们将这些预测添加为Seurat对象中的一项新分析。

allen_reference <- readRDS("../data/allen_cortex.rds")
# note that setting ncells=3000 normalizes the full dataset but learns noise models on 3k cells
# this speeds up SCTransform dramatically with no loss in performance
library(dplyr)
allen_reference <- SCTransform(allen_reference, ncells = 3000, verbose = FALSE) %>% RunPCA(verbose = FALSE) %>% 
    RunUMAP(dims = 1:30)
# After subsetting, we renormalize cortex
cortex <- SCTransform(cortex, assay = "Spatial", verbose = FALSE) %>% RunPCA(verbose = FALSE)
# the annotation is stored in the 'subclass' column of object metadata
DimPlot(allen_reference, group.by = "subclass", label = TRUE)
image
anchors <- FindTransferAnchors(reference = allen_reference, query = cortex, normalization.method = "SCT")
predictions.assay <- TransferData(anchorset = anchors, refdata = allen_reference$subclass, prediction.assay = TRUE, 
    weight.reduction = cortex[["pca"]], dims = 1:30)
cortex[["predictions"]] <- predictions.assay

现在,我们获得了每个班级每个地点的预测分数。在额叶皮层区域中特别令人感兴趣的是层状兴奋性神经元。在这里,我们可以区分这些神经元亚型的不同顺序层,例如:

DefaultAssay(cortex) <- "predictions"
SpatialFeaturePlot(cortex, features = c("L2/3 IT", "L4"), pt.size.factor = 1.6, ncol = 2, crop = TRUE)
image

基于这些预测分数,我们还可以预测位置受空间限制的单元格类型。我们使用基于标记点过程的相同方法来定义空间可变特征,但将细胞类型预测得分用作“标记”而不是基因表达。

cortex <- FindSpatiallyVariableFeatures(cortex, assay = "predictions", selection.method = "markvariogram", 
    features = rownames(cortex), r.metric = 5, slot = "data")
top.clusters <- head(SpatiallyVariableFeatures(cortex), 4)
SpatialPlot(object = cortex, features = top.clusters, ncol = 2)
image.png

最后,我们证明我们的整合程序能够恢复神经元和非神经元子集(包括层状兴奋性,第1层星形胶质细胞和皮质灰质)的已知空间定位模式。

SpatialFeaturePlot(cortex, features = c("Astro", "L2/3 IT", "L4", "L5 PT", "L5 IT", "L6 CT", "L6 IT", 
    "L6b", "Oligo"), pt.size.factor = 1, ncol = 2, crop = FALSE, alpha = c(0.1, 1))
image.png

在Seurat中处理多个切片

小鼠大脑的该数据集包含与大脑另一半相对应的另一个切片。在这里,我们将其读入并执行相同的初始归一化。

brain2 <- LoadData("stxBrain", type = "posterior1")
brain2 <- SCTransform(brain2, assay = "Spatial", verbose = FALSE)

为了在同一个Seurat对象中使用多个切片,我们提供了该merge功能。

brain.merge <- merge(brain, brain2)

然后,这使得联合维数减少并在基础RNA表达数据上聚类。

DefaultAssay(brain.merge) <- "SCT"
VariableFeatures(brain.merge) <- c(VariableFeatures(brain), VariableFeatures(brain2))
brain.merge <- RunPCA(brain.merge, verbose = FALSE)
brain.merge <- FindNeighbors(brain.merge, dims = 1:30)
brain.merge <- FindClusters(brain.merge, verbose = FALSE)
brain.merge <- RunUMAP(brain.merge, dims = 1:30)

最后,可以在单个UMAP图中共同可视化数据。SpatialDimPlot()SpatialFeaturePlot()`默认将所有切片绘制为列,将分组/功能绘制为行。

DimPlot(brain.merge, reduction = "umap", group.by = c("ident", "orig.ident"))
image
SpatialDimPlot(brain.merge)
image
SpatialFeaturePlot(brain.merge, features = c("Hpca", "Plp1"))
image.png

致谢

我们要感谢Nigel Delaney和Stephen Williams对新的空间Seurat代码的有益反馈和贡献。

幻灯片序列

数据集

在这里,我们将分析使用小鼠海马体的Slide-seq v2生成的数据集。本教程将采用与10倍Visium数据的空间晕影大致相同的结构,但专门针对特定于Slide-seq数据的演示进行了量身定制。

您可以使用我们的SeuratData包来轻松访问数据,如下所示。安装数据集后,您可以键入?ssHippo以查看用于创建Seurat对象的命令。

InstallData("ssHippo")
slide.seq <- LoadData("ssHippo")

数据预处理

通过基因表达数据对珠子进行的初始预处理步骤与其他空间Seurat分析和典型的scRNA-seq实验相似。在这里,我们注意到许多珠子的UMI计数特别低,但选择保留所有检测到的珠子用于下游分析。

plot1 <- VlnPlot(slide.seq, features = "nCount_Spatial", pt.size = 0, log = TRUE) + NoLegend()
slide.seq$log_nCount_Spatial <- log(slide.seq$nCount_Spatial)
plot2 <- SpatialFeaturePlot(slide.seq, features = "log_nCount_Spatial") + theme(legend.position = "right")
wrap_plots(plot1, plot2)
image

然后,我们使用sctransform标准化数据并执行标准的scRNA-seq维数减少和聚类工作流。

slide.seq <- SCTransform(slide.seq, assay = "Spatial", ncells = 3000, verbose = FALSE)
slide.seq <- RunPCA(slide.seq)
slide.seq <- RunUMAP(slide.seq, dims = 1:30)
slide.seq <- FindNeighbors(slide.seq, dims = 1:30)
slide.seq <- FindClusters(slide.seq, resolution = 0.3, verbose = FALSE)

然后,我们可以在UMAP空间(使用DimPlot())或在珠坐标空间使用来可视化聚类的结果[SpatialDimPlot()](https://satijalab.org/seurat/reference/SpatialPlot.html)

plot1 <- DimPlot(slide.seq, reduction = "umap", label = TRUE)
plot2 <- SpatialDimPlot(slide.seq, stroke = 0)
plot1 + plot2

[图片上传失败...(image-30c441-1615977780709)]

SpatialDimPlot(slide.seq, cells.highlight = CellsByIdentities(object = slide.seq, idents = c(1, 
    6, 13)), facet.highlight = TRUE)

[图片上传失败...(image-bea41c-1615977780709)]

与scRNA-seq参考整合

为了促进Slide-seq数据集的细胞类型注释,我们利用了由Saunders *,Macosko *等人制作的现有小鼠单细胞RNA-seq海马数据集2018。数据可在此处作为已处理的Seurat对象下载,而原始计数矩阵可在DropViz网站上获得

ref <- readRDS("../data/mouse_hippocampus_reference.rds")

本文的原始注释在Seurat对象的单元元数据中提供。这些注释以几种“解决方案”提供,从大类(ref$class)到细胞类型()中的子类ref$subcluster。出于本小插图的目的,我们将对细胞类型注释(ref$celltype)进行修改,使之达到良好的平衡。

我们将从运行Seurat标签转移方法开始,以预测每个珠子的主要细胞类型。

anchors <- FindTransferAnchors(reference = ref, query = slide.seq, normalization.method = "SCT", 
    npcs = 50)
predictions.assay <- TransferData(anchorset = anchors, refdata = ref$celltype, prediction.assay = TRUE, 
    weight.reduction = slide.seq[["pca"]], dims = 1:50)
slide.seq[["predictions"]] <- predictions.assay

然后,我们可以可视化一些主要预期类别的预测分数。

DefaultAssay(slide.seq) <- "predictions"
SpatialFeaturePlot(slide.seq, features = c("Dentate Principal cells", "CA3 Principal cells", "Entorhinal cortex", 
    "Endothelial tip", "Ependymal", "Oligodendrocyte"), alpha = c(0.1, 1))
image.png
slide.seq$predicted.id <- GetTransferPredictions(slide.seq)
Idents(slide.seq) <- "predicted.id"
SpatialDimPlot(slide.seq, cells.highlight = CellsByIdentities(object = slide.seq, idents = c("CA3 Principal cells", 
    "Dentate Principal cells", "Endothelial tip")), facet.highlight = TRUE)
image.png

识别空间可变特征

正如Visium插图中提到的那样,我们可以通过两种通用方法来识别空间可变的特征:预先标注的解剖区域之间的差异表达测试或测量特征对空间位置的依赖性的统计信息。

在这里,我们FindSpatiallyVariableFeatures()通过设置来实现Moran's I的实现,以演示后者method = 'moransi'。Moran's I计算总体空间自相关,并给出一个统计量(类似于相关系数),该统计量用于衡量要素对空间位置的依赖性。这使我们能够根据表达的空间变化程度对要素进行排名。为了便于快速估算此统计信息,我们实施了一种基本的分级策略,该策略将在Slide-seq圆盘上绘制一个矩形网格,并对每个分级中的特征和位置取平均。x和y方向上的仓数分别由x.cutsy.cuts参数控制。此外,虽然不是必需的,但安装可选Rfast2软件包(install.packages('Rfast2')`),将通过更有效的实施方式来显着减少运行时间。

DefaultAssay(slide.seq) <- "SCT"
slide.seq <- FindSpatiallyVariableFeatures(slide.seq, assay = "SCT", slot = "scale.data", features = VariableFeatures(slide.seq)[1:1000], 
    selection.method = "moransi", x.cuts = 100, y.cuts = 100)

现在,我们可视化由Moran's I识别的前6个特征的表达。

SpatialFeaturePlot(slide.seq, features = head(SpatiallyVariableFeatures(slide.seq, selection.method = "moransi"), 
    6), ncol = 3, alpha = c(0.1, 1), max.cutoff = "q95")
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,242评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,769评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,484评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,133评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,007评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,080评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,496评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,190评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,464评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,549评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,330评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,205评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,567评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,889评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,160评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,475评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,650评论 2 335

推荐阅读更多精彩内容