空间转录组: 反卷积

简介: 空间转录组: 反卷积

引言

本系列讲解 空间转录组学 (Spatial Transcriptomics) 相关基础知识与数据分析教程,持续更新,欢迎关注,转发,文末有交流群!

简介

基于测序的空间转录组(ST)数据在每个 spot 中可能包含 0 到多个细胞,这些细胞可能完全被 spot 覆盖,也可能只是部分被覆盖,具体取决于平台的空间分辨率以及组织细胞的密度。数据的这一特点意味着一个 spot 内可能存在细胞类型的混合,因此也会出现转录程序的混合。

上图展示了 10x Genomics Visium spot(直径为 55 µm;紫色线)叠加在苏木精-伊红(H&E)染色图像上的情况。spot 之间的中心距为 100 µm(黄线),典型免疫细胞的直径约为 10 µm(青线)。

为了帮助理解这些混合物,目前已有至少 20 种反卷积技术被提出,用于 spot 级别的 ST 数据。某些方法需要从单细胞 RNA 测序(scRNA-seq)参考数据集中借用信息,而另一些方法则无需参考。根据底层算法将这些方法分为五大类:

  • probabilistic-based:使用贝叶斯推断、似然估计或概率建模来估算细胞类型组成,同时纳入不确定性。可用工具包括 R 中的 spacexr(即 RCTD)、CARD、SpatialDecon 和 STdeconvolve,以及 Python 中的 std-poisson、stereoscope、scvi-tools(即 DestVI)、STRIDE 和 cell2location。
  • non-negative matrix factorization (NMF)-based:将基因表达数据分解为代表不同细胞类型的潜在成分。可用工具包括 R 中的 Giotto(即 SpatialDWLS)和 SPOTlight,以及 Python 中的 NMFReg。
  • graph-based:使用图神经网络或基于图的优化来建模空间关系。可用工具包括 R 中的 SD2,以及 Python 中的 DSTG 和 SpiceMix。
  • optimal transport (OT)-based:通过将 scRNA-seq 与 ST 数据进行映射,推断空间基因表达分布。可用工具包括 Python 中的 SpaOTsc 和 novosparc。
  • deep learning-based:利用神经网络对齐并整合单细胞与空间转录组数据。例如 Python 中的 Tangram。

其中,std-poisson、STdeconvolve 和 SpiceMix 为无需参考的方法。纳入空间位置信息的方法有 CARD、DSTG、SD2、Tangram、cell2location、DestVI、std-poisson 和 SpiceMix。

本文将展示在每个 spot 上进行细胞类型反卷积,使用 RCTD 在 Visium 和 VisiumHD 数据集上的应用。

依赖

library(OSTA.data)
library(VisiumIO)
library(SpatialExperiment)
library(ggspavis)
library(spacexr)
library(CARDspa)
library(ggplot2)
library(patchwork)
library(DropletUtils)
library(BiocParallel)
library(scran)
library(scater)
library(pheatmap)

在 Visium 乳腺癌数据中,我们在没有单细胞(Chromium)参考的情况下进行细胞类型去卷积,并将结果与 10x Genomics 提供的 Visium 注释进行一致性比较。

# retrieve dataset from OSF repository
id <- "Visium_HumanBreast_Janesick"
pa <- OSTA.data_load(id)
dir.create(td <- tempfile())
unzip(pa, exdir = td)

# read into 'SpatialExperiment'
vis <- TENxVisium(
    spacerangerOut = td, 
    processing = "filtered", 
    format = "h5", 
    images = "lowres") |> 
    import()

# retrieve spot annotations & add as metadata
df <- read.csv(file.path(td, "annotation.csv"))
cs <- match(colnames(vis), df$Barcode)
vis$anno <- factor(df$Annotation[cs])

# set gene symbols as feature names
rownames(vis) <- make.unique(rowData(vis)$Symbol)
vis

xy <- spatialCoords(vis) * scaleFactors(vis)
xs <- range(xy[, 1])
ys <- nrow(imgRaster(vis)) - range(xy[, 2])
box <- geom_rect(
    xmin = xs[1], xmax = xs[2], ymin = ys[1], ymax = ys[2], 
    col = "black", fill = NA, linetype = 2, linewidth = 2/3)
plotVisium(vis, spots = FALSE, point_size = 1) + box + 
    plotVisium(vis, point_size = 1, zoom = TRUE) + 
    plot_layout(nrow = 1) & facet_null()

反卷积在质量控制之后执行,通常使用未归一化且未转换的(即原始的)计数矩阵。

此处,我们快速检查一些典型的 spot 级别指标。

sub <- list(mt = grep("^MT-", rownames(vis)))
vis <- addPerCellQCMetrics(vis, subsets = sub)

vis$log_sum <- log1p(vis$sum)
plotCoords(vis, annotate = "log_sum") + ggtitle("log library size") + 
    plotCoords(vis, annotate = "subsets_mt_percent") + ggtitle("% mitochondrial") + 
    plot_layout(nrow = 1) & theme(
      legend.key.width = unit(0.5, "lines"), 
      legend.key.height = unit(1, "lines")) & 
    scale_color_gradientn(colors = pals::jet())

ggplot(data.frame(colData(vis))) + 
  geom_point(aes(x=sum, y=subsets_mt_percent)) + 
  scale_x_log10() + 
  scale_y_sqrt()

一些spots的library sizes较低,可以删除。

vis <- vis[,vis$sum > 1000]

我们首先可视化10x Genomics提供的spot-level 细胞类型注释。

plotCoords(vis, 
           annotate = "anno", point_size = 1, 
           pal = unname(pals::trubetskoy())) + 
    theme(legend.key.size = unit(0, "lines"))

现在,我们为 Visium 数据集加载单细胞(Chromium)参考数据。为了简化演示,我们将 10x Genomics 提供的若干细胞类型注释(即 Annotation)合并为更宽泛的类别(即 Annogrp)。

# retrieve dataset from OSF repo
id <- "Chromium_HumanBreast_Janesick"
pa <- OSTA.data_load(id)
dir.create(td <- tempfile())
unzip(pa, exdir = td)

# read into 'SingleCellExperiment'
fs <- list.files(td, full.names = TRUE)
h5 <- grep("h5$", fs, value = TRUE)
sce <- read10xCounts(h5, col.names = TRUE)

# use gene symbols as feature names
rownames(sce) <- make.unique(rowData(sce)$Symbol)

# retrieve cell type labels
csv <- grep("csv$", fs, value = TRUE)
cd <- read.csv(csv, row.names = 1)

# ignore mixtures
lab <- cd$Annotation
lab[grepl("Hyb", lab)] <- NA 

# simplify annotations
pat <- c(
    "B Cell" = "B", "T Cell" = "T", "Mac" = "macro", 
    "Mast" = "mast", "DCs" = "dendritic", 
    "Peri" = "perivas", "End" = "endo", "Str" = "stromal", 
    "Inv" = "tumor", "Myo" = "myoepi")
for (. in names(pat)) 
    lab[grep(., lab)] <- pat[.]
lab <- gsub("\\s", "", lab)

# add as cell metadata
table(cd$Annogrp <- lab)

colData(sce)[names(cd)] <- cd[colnames(sce), ]

我们只保留带有注释且未被标记为 “Hybrid” 的 Chromium 数据,因为这些对应的是混合亚群。

sce <- sce[, !is.na(sce$Annogrp)]
dim(sce)

##  [1] 18082 26031
相关文章
|
消息中间件 Kubernetes 网络协议
K8S 性能优化 - OS sysctl 调优
K8S 性能优化 - OS sysctl 调优
|
Windows
如何使用挂载磁盘和windows服务器进行文件传输?
如何远程连接windows服务器,相信对于使用过windows服务器的朋友来说这都是非常简单的事情,但是对于如何以及为什么挂载本地磁盘到windows服务器,很多新手就不明白为什么了。
2303 1
|
4月前
|
存储 人工智能 Kubernetes
阿里云 AgentTeams 解读:当 Agent 开始真正在企业里干活
多 Agent 协作不只是任务并行,更是组织运转。从产品主创团队视角,聊聊 AgentTeams 在安全、协作、弹性、进化四个方向的设计思考。
1515 24
|
4月前
|
弹性计算 网络协议 应用服务中间件
阿里云国际站ECS部署Nginx网站打不开排查:多数人卡在第二步就放弃了
在阿里云上买台ECS、装完Nginx后看到欢迎页,顺手绑上域名,结果浏览器里却是一片空白——这种“最后一公里翻车”的故事,每天都在发生。阿里云ECS部署Nginx网站打不开排查往往是新手交的第一笔学费,而真正高效的定位方法,并不在于你查了多少篇教程,而在于你能否用最少的步骤把“能通”和“不能通”的边界画出来。
666 1
|
数据采集 数据挖掘 Serverless
空间转录组学: 质控处理(1)
空间转录组学: 质控处理(1)
空间转录组学: 质控处理(1)
|
存储 数据可视化 算法
空间单细胞|基于图像的空间数据分析(2)
空间单细胞|基于图像的空间数据分析(2)
1196 0
|
弹性计算 安全 数据库
【转】云服务器虚拟化内存优化指南:提升性能的7个关键策略
作为云计算服务核心组件,虚拟化内存管理直接影响业务系统性能表现。本文详解了内存优化方案与技术实践,助您降低30%资源浪费。
615 0
【转】云服务器虚拟化内存优化指南:提升性能的7个关键策略
|
机器学习/深度学习 数据可视化 PyTorch
深入解析图神经网络注意力机制:数学原理与可视化实现
本文深入解析了图神经网络(GNNs)中自注意力机制的内部运作原理,通过可视化和数学推导揭示其工作机制。文章采用“位置-转移图”概念框架,并使用NumPy实现代码示例,逐步拆解自注意力层的计算过程。文中详细展示了从节点特征矩阵、邻接矩阵到生成注意力权重的具体步骤,并通过四个类(GAL1至GAL4)模拟了整个计算流程。最终,结合实际PyTorch Geometric库中的代码,对比分析了核心逻辑,为理解GNN自注意力机制提供了清晰的学习路径。
1108 7
深入解析图神经网络注意力机制:数学原理与可视化实现
|
数据可视化 数据库
scRNA分析|使用CellChat完成细胞通讯分析-简单且可视化出众,代码自取
scRNA分析|使用CellChat完成细胞通讯分析-简单且可视化出众,代码自取
4143 1