草庐IT

Seurat分析10x Visium空间转录组数据

JeremyL 2023-03-28 原文

本教程使用Seurat包进行10x Visium单细胞空间转录组数据分析。

这个教程涉及:

  • 标准化

  • 降维和聚类

  • 检测空间差异表达基因

  • 交互可视化

  • 与单细胞转录组整合分析

  • 整合切片信息

#1. R环境

## 检查Seurat版本

本教程:Seurat (>=3.2)

help(Seurat)

## 安装包:

# Enter commands in R (or R studio, if installed)
install.packages('Seurat')
  • SeuratData是数据分发Seurat对象的包。使用它可以直接访问Seurat 教程中使用的数据集。
devtools:: install_github ('satijalab/seurat-data')
  • patchwork 用于组合图
install.packages('patchwork')

## 导入包

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

# 数据

本教程使用的空间转录组数据来由Visium v1产生 ;细胞来自于老鼠两个脑前部切片和对应的两个脑后部切片。

数据来自于10X官网,见10X Datasets; 在本教程中可以使用 Load10X_Spatial() 函数直接导入,返回Seurat 对象,其中reads数据由 spaceranger分析流程产生,包含spot水平的表达数据以及对应的组织切片的图像数据。

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

# 数据预处理

## 数据标准化

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

结果表明不同spots之间的变化不仅受技术的影响,也收到了组织切片的影响。在缺少神经元位置(such as the cortical white matter)单细胞测序得到的数值比较小;当使用LogNormalize()时,会首先将这些spots size标准化到同一水平,这种处理可能存在问题。

在此,作者建议使用sctransform (Hafemeister and Satija, Genome Biology 2019)。sctransform 通过建立基因表达的regularized negative binomial models来解释技术误差同时保留生物学误差。

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

## 比较sctransform 和log-normalization 的结果;

# rerun normalization to store sctransform residuals for all genes
brain <- SCTransform(brain, assay = "Spatial", return.only.var.genes = FALSE, verbose = FALSE)
# also run standard log normalization for comparison
brain <- NormalizeData(brain, verbose = FALSE, assay = "Spatial")
# Computes the correlation of the log normalized data and sctransform residuals with the number of UMIs
brain <- GroupCorrelation(brain, group.assay = "Spatial", assay = "Spatial", slot = "data", do.plot = FALSE)
brain <- GroupCorrelation(brain, group.assay = "Spatial", assay = "SCT", slot = "scale.data", do.plot = FALSE)
p1 <- GroupCorrelationPlot(brain, assay = "Spatial", cor = "nCount_Spatial_cor") + ggtitle("Log Normalization") +
    theme(plot.title = element_text(hjust = 0.5))
p2 <- GroupCorrelationPlot(brain, assay = "SCT", cor = "nCount_Spatial_cor") + ggtitle("SCTransform Normalization") +
    theme(plot.title = element_text(hjust = 0.5))
p1 + p2
image.png

在这儿,计算了每个基因UMI值和标准化之后结果的相关性。并且,根据基因表达的均值将其划分为6个组。在log-normalization 的结果中,前三个组(基因表达均值大)存在明显的偏差,这也表明技术偏差还是在log-normalization的结果中存在。相比之下,sctransform标准化大大减小了这种影响。

# 基因表达可视化

Seurat中的SpatialFeaturePlot()函数可以将分子数据叠加到组织组织学数据上进行展示。例如,在这组小鼠大脑数据中,Hpca基因是一个强大的海马标记,Ttr是脉络丛的标记。

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

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

  • pt.size.factor: 缩放斑点的大小。默认值为1.6
  • alpha-最小和最大透明度。默认值是c(1,1)
  • 尝试将alpha c(0.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
image.png

# 降维、聚类和可视化

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)

dimPlot()可视化UMAP结果;SpatialDimPlot()联合映像结果进行可视化;

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

SpatialDimPlot中的cells.highlight可以通过颜色区分细胞,并且可以标记不同类群细胞的空间位置。

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

# 交互式可视化

SpatialDimPlot()SpatialFeaturePlot()可以进行可视化;只需要设置interactive为TRUE就可以在Rstudio viewer面板展示结果。

  • SpatialDimPlot
SpatialDimPlot(brain, interactive = TRUE)
image.png
  • SpatialFeaturePlot
SpatialFeaturePlot(brain, features = "Ttr", interactive = TRUE)
image.png
  • LinkedDimPlot
LinkedDimPlot(brain)
image.png

# 差异表达基因鉴定

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()函数在不存在预注释的情况下寻找基因空间表达模式。FindSpatiallyVariables()函数可以调用markvariogram方法( Trendsceek),模拟空间转录组数据为标记点从而计算variogram,variogram可以表征基因表达水平受其空间位置的影响。具体点就是,计算一定距离(r,默认为5)两点之间的依赖性。

brain <- FindSpatiallyVariableFeatures(brain, assay = "SCT", features = VariableFeatures(brain)[1:1000],
    selection.method = "markvariogram")
    
top.features <- head(SpatiallyVariableFeatures(brain, selection.method = "markvariogram"), 6)
SpatialFeaturePlot(brain, features = top.features, ncol = 3, alpha = c(0.1, 1))
image.png

还有更多方法可以用于鉴定差异表达基因,例如 SpatialDE, 和Splotch

可视化鉴定的最显著

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

# 根据切片区域提取单细胞数据

这儿提取前额皮质的数据进行进一步分析;提取数个细胞类群的数据,然后在切片数据上进行可视化。

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

# 单细胞数据整合

10x Visium中每个spot长宽约50um,因此每个spot测序数据包含多个细胞。更多的研究者希望反卷积去研究每个空间点的数据从而去预测细胞类型的构成。Seurat作者使用公开的SMART-Seq2数据(a reference scRNA-seq dataset of ~14,000 adult mouse cortical cell taxonomy from the Allen Institute)测试一些列反卷积和整合方法。相比于反卷积,整合的方法能够取得更好的结果。这可能是空间转录组数据和普通单细胞转录组数据的噪音模型存在巨大的差异造成的。在此,使用 Seurat v3中基于anchor的整合方法,能够给予参考数据对新的数据集进行注释。

数据下载:data

allen_reference <- readRDS("./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.png
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

对每个spots打分;特别是前额叶皮质区是层级兴奋性神经元。在这里,可以区分这些神经元亚型的不同顺序层:

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

基于预测分数也可以预测不同细胞类型在空间上的位置。使用同样的方法也可以鉴定空间差异表达基因,使用细胞类型预测分数打分基因代替基因表达。

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

最终,结果表明整合方法能够发现已知神经元或非神经元( including laminar excitatory, layer-1 astrocytes, and the cortical grey matter.)的空间定位模式。

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

# 整合多个切片数据

前面处理的数据都是anterior,现在读入对应的posterior数据,然后进行一样的厨师标准化过程。

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

同时处理多个切片Seurat 对象数据;使用merge函数整合数据。

brain.merge <- merge(brain, brain2)

然后进行联合降维和聚类

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.png
SpatialDimPlot(brain.merge)
image.png
SpatialFeaturePlot(brain.merge, features = c("Hpca", "Plp1"))
image.png

# 原文

Analysis, visualization, and integration of spatial datasets with Seurat

有关Seurat分析10x Visium空间转录组数据的更多相关文章

  1. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  2. ruby - Ruby 有 `Pair` 数据类型吗? - 2

    有时我需要处理键/值数据。我不喜欢使用数组,因为它们在大小上没有限制(很容易不小心添加超过2个项目,而且您最终需要稍后验证大小)。此外,0和1的索引变成了魔数(MagicNumber),并且在传达含义方面做得很差(“当我说0时,我的意思是head...”)。散列也不合适,因为可能会不小心添加额外的条目。我写了下面的类来解决这个问题:classPairattr_accessor:head,:taildefinitialize(h,t)@head,@tail=h,tendend它工作得很好并且解决了问题,但我很想知道:Ruby标准库是否已经带有这样一个类? 最佳

  3. ruby - 我如何添加二进制数据来遏制 POST - 2

    我正在尝试使用Curbgem执行以下POST以解析云curl-XPOST\-H"X-Parse-Application-Id:PARSE_APP_ID"\-H"X-Parse-REST-API-Key:PARSE_API_KEY"\-H"Content-Type:image/jpeg"\--data-binary'@myPicture.jpg'\https://api.parse.com/1/files/pic.jpg用这个:curl=Curl::Easy.new("https://api.parse.com/1/files/lion.jpg")curl.multipart_form_

  4. 世界前沿3D开发引擎HOOPS全面讲解——集3D数据读取、3D图形渲染、3D数据发布于一体的全新3D应用开发工具 - 2

    无论您是想搭建桌面端、WEB端或者移动端APP应用,HOOPSPlatform组件都可以为您提供弹性的3D集成架构,同时,由工业领域3D技术专家组成的HOOPS技术团队也能为您提供技术支持服务。如果您的客户期望有一种在多个平台(桌面/WEB/APP,而且某些客户端是“瘦”客户端)快速、方便地将数据接入到3D应用系统的解决方案,并且当访问数据时,在各个平台上的性能和用户体验保持一致,HOOPSPlatform将帮助您完成。利用HOOPSPlatform,您可以开发在任何环境下的3D基础应用架构。HOOPSPlatform可以帮您打造3D创新型产品,HOOPSSDK包含的技术有:快速且准确的CAD

  5. FOHEART H1数据手套驱动Optitrack光学动捕双手运动(Unity3D) - 2

    本教程将在Unity3D中混合Optitrack与数据手套的数据流,在人体运动的基础上,添加双手手指部分的运动。双手手背的角度仍由Optitrack提供,数据手套提供双手手指的角度。 01  客户端软件分别安装MotiveBody与MotionVenus并校准人体与数据手套。MotiveBodyMotionVenus数据手套使用、校准流程参照:https://gitee.com/foheart_1/foheart-h1-data-summary.git02  数据转发打开MotiveBody软件的Streaming,开始向Unity3D广播数据;MotionVenus中设置->选项选择Unit

  6. 使用canal同步MySQL数据到ES - 2

    文章目录一、概述简介原理模块二、配置Mysql使用版本环境要求1.操作系统2.mysql要求三、配置canal-server离线下载在线下载上传解压修改配置单机配置集群配置分库分表配置1.修改全局配置2.实例配置垂直分库水平分库3.修改group-instance.xml4.启动监听四、配置canal-adapter1修改启动配置2配置映射文件3启动ES数据同步查询所有订阅同步数据同步开关启动4.验证五、配置canal-admin一、概述简介canal是Alibaba旗下的一款开源项目,Java开发。基于数据库增量日志解析,提供增量数据订阅&消费。Git地址:https://github.co

  7. ruby-on-rails - 从应用程序中自定义文件夹内的命名空间自动加载 - 2

    我们目前正在为ROR3.2开发自定义cms引擎。在这个过程中,我们希望成为我们的rails应用程序中的一等公民的几个类类型起源,这意味着它们应该驻留在应用程序的app文件夹下,它是插件。目前我们有以下类型:数据源数据类型查看我在app文件夹下创建了多个目录来保存这些:应用/数据源应用/数据类型应用/View更多类型将随之而来,我有点担心应用程序文件夹被这么多目录污染。因此,我想将它们移动到一个子目录/模块中,该子目录/模块包含cms定义的所有类型。所有类都应位于MyCms命名空间内,目录布局应如下所示:应用程序/my_cms/data_source应用程序/my_cms/data_ty

  8. ruby-on-rails - 创建 ruby​​ 数据库时惰性符号绑定(bind)失败 - 2

    我正在尝试在Rails上安装ruby​​,到目前为止一切都已安装,但是当我尝试使用rakedb:create创建数据库时,我收到一个奇怪的错误:dyld:lazysymbolbindingfailed:Symbolnotfound:_mysql_get_client_infoReferencedfrom:/Library/Ruby/Gems/1.8/gems/mysql2-0.3.11/lib/mysql2/mysql2.bundleExpectedin:flatnamespacedyld:Symbolnotfound:_mysql_get_client_infoReferencedf

  9. STM32读取串口传感器数据(颗粒物传感器,主动上传) - 2

    文章目录1.开发板选择*用到的资源2.串口通信(个人理解)3.代码分析(注释比较详细)1.主函数2.串口1配置3.串口2配置以及中断函数4.注意问题5.源码链接1.开发板选择我用的是STM32F103RCT6的板子,不过代码大概在F103系列的板子上都可以运行,我试过在野火103的霸道板上也可以,主要看一下串口对应的引脚一不一样就行了,不一样的就更改一下。*用到的资源keil5软件这里用到了两个串口资源,采集数据一个,串口通信一个,板子对应引脚如下:串口1,TX:PA9,RX:PA10串口2,TX:PA2,RX:PA32.串口通信(个人理解)我就从串口采集传感器数据这个过程说一下我自己的理解,

  10. SPI接收数据异常问题总结 - 2

    SPI接收数据左移一位问题目录SPI接收数据左移一位问题一、问题描述二、问题分析三、探究原理四、经验总结最近在工作在学习调试SPI的过程中遇到一个问题——接收数据整体向左移了一位(1bit)。SPI数据收发是数据交换,因此接收数据时从第二个字节开始才是有效数据,也就是数据整体向右移一个字节(1byte)。请教前辈之后也没有得到解决,通过在网上查阅前人经验终于解决问题,所以写一个避坑经验总结。实际背景:MCU与一款芯片使用spi通信,MCU作为主机,芯片作为从机。这款芯片采用的是它规定的六线SPI,多了两根线:RDY和INT,这样从机就可以主动请求主机给主机发送数据了。一、问题描述根据从机芯片手

随机推荐