随着空间转录组技术的普及,越来越多的课题开始使用这一技术。当前,以10X Visium为代表的空间转录组技术是目前最常见的技术。然而,10X Visium由于技术本身的局限性,其分辨率较低,所得到spot并非单细胞水平,往往由10个左右的细胞构成一个spot,这给后续的分析带来了巨大的困扰。
1. 概念
所谓空间转录组反卷积算法是一种利用单细胞转录组数据作为参考,来推断空间转录组数据中每个位置的细胞类型和比例的方法。空间转录组数据是指在保留组织或细胞的空间信息的同时,测量基因表达的数据。由于空间转录组数据的分辨率有限,每个位置可能包含多种细胞类型的混合物,因此需要一种方法来解析每个位置的细胞组成。
空间转录组反卷积算法的意义是,它可以帮助我们更好地理解组织或细胞的空间结构和功能,揭示细胞类型之间的相互作用和通讯,发现空间上的细胞异质性和状态变化,以及探索空间转录组数据与其他空间数据(如组织形态学,免疫组化,荧光原位杂交等)的关联性。空间转录组反卷积算法在生物医学领域有着广泛的应用,例如神经科学,肿瘤学,发育生物学,免疫学等。
2 原理
按照实现的原理来说主要可以分为三种实现反卷积的方法:
(1)概率模型:这类方法假设每个位置的基因表达服从一个多项式分布,其参数由参考单细胞数据中的细胞类型的基因表达的加权和决定。这类方法的优点是可以考虑基因表达的离散性和噪声,以及细胞类型的先验信息。这类方法的代表RCTD,Cell2location等;
(2)非负矩阵分解和非负最小二乘:这类方法将空间转录组反卷积问题转化为一个非负矩阵分解或非负最小二乘的优化问题,即寻找一组非负的权重,使得每个位置的基因表达与参考单细胞数据中的细胞类型的基因表达的加权和的差异最小。这类方法的优点是可以利用现有的高效的优化算法,以及可以加入正则化项来防止过拟合。这类方法的代表有SpatialDWLS,Splotlight等;
(3)深度学习框架:这类方法利用深度神经网络来学习一个从空间转录组数据到细胞类型比例的映射函数。这类方法的优点是可以自动提取特征,以及可以处理非线性和复杂的关系。这类方法的代表有Tangram。
按照是否需要对应的单细胞转录组的数据有可以分为有参算法和无参算法:
(1)有参算法:RCTD、Cell2location等;
(2)无参算法:STdeconvolve等。
那么哪些这么多算法究竟哪些才比较符合真实的情况呢,我们看一下文献的总结:
右边是使用ISS法基于原位杂交得到的“阳性”结果,而左边则是靠软件反卷积去“猜测”的细胞组成结果。
在图中可以非常明显的观察到RCTD、cell2locaiton等有参考算法明显优于无参考的算法。且在各类算法中,RCTD所得到的结果和真实的更吻合,具有更突出的性能。
3 实战
这里以Seurat提供的代码为例进行讲解
#devtools::install_github("dmcable/spacexr", build_vignettes = FALSE) #安装RCTD
library(spacexr)
# set up reference
ref <- readRDS("mouse_hippocampus_reference.rds")
ref <- UpdateSeuratObject(ref)
Idents(ref) <- "celltype"
# extract information to pass to the RCTD Reference function
counts <- ref[["RNA"]]$counts
cluster <- as.factor(ref$celltype)
names(cluster) <- colnames(ref)
nUMI <- ref$nCount_RNA
names(nUMI) <- colnames(ref)
reference <- Reference(counts, cluster, nUMI) #构建用于参考的单细胞数据,这里其实重点就是counts单细胞表达矩阵,cluster是我们的celltype的注释,nUMI可以为空
# set up query with the RCTD function SpatialRNA
st_data <- readRDS("st_data.rds") #载入我们的空间转录组数据,如果是标准的space ranger数据可以使用Load10X_Spatial载入
counts <- st_data[["Spatial"]]$counts
coords <- GetTissueCoordinates(slide.seq)
colnames(coords) <- c("x", "y")
coords[is.na(colnames(coords))] <- NULL
query <- SpatialRNA(coords, counts, colSums(counts))
#运行RCTD开始反卷积
RCTD <- create.RCTD(query, reference, max_cores = 8)
RCTD <- run.RCTD(RCTD, doublet_mode = "full") # 我们使用10X Visium的数据,由于spot的特性,使用full,如果是高分辨率的平台可以使用doublet或singlet
decon_mtrx <- as.matrix(RCTD@results$weights)
运行到这里我们就得到了各Spot的成分了,我们会得到一张表格,标题为细胞的类型,列为spot的名字,然后每一个单元格就是我们这个spot中各细胞的占比。
接下来如果如何画出类似上面文章的占比的图呢,代码如下:
library(SPOTlight)
st_data$cell <- names(st_data$orig.ident)
st_data <- subset(st_data, cell %in% rownames(decon_mtrx))
p = plotSpatialScatterpie(st_data, decon_mtrx, scatterpie_alpha = 1, pie_scale = 0.3)
4 写在后面
对于10X Visium的数据来说,按照传统单细胞的分析十分荒谬,每个spot中包含的细胞已经多如牛毛,cluster中的细胞类型更是如繁星般。因此,充分的了解我们的组织上的细胞构成,做反卷积进行“真正”的细胞注释才是最大化的利用我们的空间转录组数据。