第十七计 抛砖引玉
以自己的粗浅的意见引出别人高明的见解。
概述
本教程演示了如何使用Seurat(> = 3.2)分析空间分辨的RNA-seq数据。尽管分析流程类似于单细胞RNA序列分析的Seurat工作流程,但我们引入了更新的交互作用和可视化工具,特别着重于空间和分子信息的整合。本教程将涵盖以下任务,我们认为这些任务在许多空间分析中都是常见的:
- 正常化
- 降维和聚类
- 检测空间可变特征
- 互动可视化
- 与单细胞RNA-seq数据整合
- 处理多个切片
对于我们的第一个小插图,我们分析了使用10x Genomics的Visium技术生成的数据集。我们将扩展Seurat以便在不久的将来使用其他数据类型,包括SLIDE-Seq,STARmap和MERFISH。
首先,我们加载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)
这些图表明,斑点上分子计数的变化不仅是技术上的问题,而且还取决于组织的解剖结构。例如,神经元(例如皮质白质)耗竭的组织区域可再现地显示出较低的分子数。结果,在标准化后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"))
Seurat中的默认参数强调分子数据的可视化。但是,您还可以通过更改以下参数来调整斑点的大小(及其透明度),以改善组织学图像的可视化:
-
pt.size.factor
-这将缩放斑点的大小。默认值为1.6 -
alpha
-最小和最大透明度。默认值为c(1,1)。 - 尝试设置为
alpha
c(0.1,1),以降低具有较低表达式的点的透明度
p1 <- SpatialFeaturePlot(brain, features = "Ttr", pt.size.factor = 1)
p2 <- SpatialFeaturePlot(brain, features = "Ttr", alpha = c(0.1, 1))
p1 + p2
降维,聚类和可视化
然后,我们可以使用与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
由于存在许多种颜色,因此可视化哪个体素属于哪个群集可能具有挑战性。我们有一些策略可以帮助您解决这个问题。设置label
参数会在每个群集的中位数处放置一个彩色框(请参见上图)。
您还可以使用cells.highlight
参数在上划分特定的关注单元格SpatialDimPlot()`。如下所示,这对于区分单个群集的空间定位非常有用。
SpatialDimPlot(brain, cells.highlight = CellsByIdentities(object = brain, idents = c(2, 1, 4, 3,
5, 8)), facet.highlight = TRUE, ncol = 3)
交互式绘图
我们还内置了许多交互式绘图功能。无论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)
在中实施的另一种方法FindSpatiallyVariables()
是在没有预先注释的情况下搜索表现出空间图案的特征。默认方法(method = 'markvariogram
)受Trendsceek启发,该工具将空间转录组学数据建模为标记点过程,并计算“变异函数”,该变异函数可识别表达水平取决于其空间位置的基因。更具体地说,此过程计算gamma(r)值,该值测量相距某个“ r”距离的两个点之间的依赖性。默认情况下,我们在这些分析中使用r值“ 5”,并且仅计算可变基因的这些值(其中变异独立于空间位置而计算)以节省时间。
我们注意到,文献中有多种方法可以完成此任务,包括SpatialDE和Splotch。我们鼓励感兴趣的用户探索这些方法,并希望在不久的将来为其提供支持。
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))
细分解剖区域
与单单元格对象一样,您可以对对象进行子集化以集中处理数据的子集。在这里,我们大约将额叶皮层子集化。该过程还有助于在下一节中将这些数据与皮质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
与单细胞数据集成
在〜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)
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)
基于这些预测分数,我们还可以预测位置受空间限制的单元格类型。我们使用基于标记点过程的相同方法来定义空间可变特征,但将细胞类型预测得分用作“标记”而不是基因表达。
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)
最后,我们证明我们的整合程序能够恢复神经元和非神经元子集(包括层状兴奋性,第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))
在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"))
SpatialDimPlot(brain.merge)
SpatialFeaturePlot(brain.merge, features = c("Hpca", "Plp1"))
致谢
我们要感谢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)
然后,我们使用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))
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)
识别空间可变特征
正如Visium插图中提到的那样,我们可以通过两种通用方法来识别空间可变的特征:预先标注的解剖区域之间的差异表达测试或测量特征对空间位置的依赖性的统计信息。
在这里,我们FindSpatiallyVariableFeatures()通过设置来实现Moran's I的实现,以演示后者
method = 'moransi'。Moran's I计算总体空间自相关,并给出一个统计量(类似于相关系数),该统计量用于衡量要素对空间位置的依赖性。这使我们能够根据表达的空间变化程度对要素进行排名。为了便于快速估算此统计信息,我们实施了一种基本的分级策略,该策略将在Slide-seq圆盘上绘制一个矩形网格,并对每个分级中的特征和位置取平均。x和y方向上的仓数分别由
x.cuts和
y.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")