今天学习一个空转的分析方法 mistyR,于2022年4月14号发表在 Genome Biology 杂志,文献标题为《Explainable multiview framework for dissecting spatial relationships from highly multiplexed data》。mistyR 是一个多视角细胞间空间建模框架(Multiview Intercellular SpaTial modeling framework,简称 MISTy),通过分析细胞内和细胞间的关系,帮助深入理解标记物之间的相互作用。
下图为 mistyR 软件的原理图,展示了四种视角类型:
Fig. 1 MISTy
软件地址:
https://github.com/saezlab/mistyR
mistyR 可以借助cell2location反卷积的细胞亚群关注共定位情况,可以提供:
①细胞和细胞之间的共定位;
②基于cellchat/其他细胞通讯算法的配受体同细胞之间的共定位热图;
③基于已知通路的通路和细胞之间的共定位热图。
安装方式见网页:https://github.com/saezlab/mistyR
包有两个来源可选一个就行:
# bash终端安装
# R CMD INSTALL -l /usr/local/software/miniconda3/envs/R4.4/lib/R/library mistyR-master.tar.gz
## 使用西湖大学的 Bioconductor镜像
options(BioC_mirror="https://mirrors.westlake.edu.cn/bioconductor")
options("repos"=c(CRAN="https://mirrors.westlake.edu.cn/CRAN/"))
# install.packages("BiocManager")
BiocManager::install("mistyR")
# install.packages("remotes")
# remotes::install_github("saezlab/mistyR")
# 加载R包
# MISTy
library(mistyR)
library(future)
#Seurat
library(Seurat)
library(SeuratObject)
# Data manipulation
library(tidyverse)
# Distances
library(distances)
我们本次学习的内容参考:https://saezlab.github.io/mistyR/articles/MistyRStructuralAnalysisPipelineC2L.html
背景了解:10 visum空转的数据 spot直径为 55 μm,点之间的圆心距是100μm
示例数据:10 visum 空间转录组数据,来源于2022年8月10号发表在Nature杂志上的一篇文献,标题为《Spatial multi-omic map of human myocardial infarction》,https://doi.org/10.1038/s41586-022-05060-x。
样本组织类型为:human myocardial infarction,人类心肌梗死组织
# 下载数据
download.file("https://zenodo.org/records/6580069/files/10X_Visium_ACH005.tar.gz?download=1",
destfile = "10X_Visium_ACH005.tar.gz", method = "curl")
# 解压
untar("10X_Visium_ACH005.tar.gz")
内容如下:
ls -1
filtered_feature_bc_matrix
spatial
spatial_ACH005_filtered_feature_bc_matrix.h5
spatial_ACH005_filtered_feature_bc_matrix.zip
spatial_ACH005_metrics_summary.csv
spatial_ACH005_molecule_info.h5
spatial_ACH005_raw_feature_bc_matrix.h5
spatial_ACH005_raw_feature_bc_matrix.zip
spatial_ACH005_spatial_enrichment.csv
spatial_ACH005_spatial.zip
输入数据为 空转反卷积注释结果 以及 空间坐标信息。
作者提供的Seurat对象包含了其他内容,例如切片上点的坐标以及通过cell2location估算的细胞组成。
加载数据并简单探索:
# 加载数据
# Load file into R
seurat_vs <- readRDS("ACH005/ACH005.rds")
seurat_vs
head(seurat_vs@meta.data)
table(seurat_vs$batch)
# Extract the cell composition c2l反卷积
composition <- as.data.frame(t(seurat_vs[["c2l_props"]]$data))
head(composition)
# Extract the location data
geometry <- GetTissueCoordinates(seurat_vs, cols = c("imagerow", "imagecol"), scale = NULL)
head(geometry)
c2l反卷积结果:每一行为一个spot,行和为1;每一列为一种细胞类型,值为某种细胞在spot中的相对比例
空间坐标如下:
先看一下切片本身的结构:
# Tissue Slide
SpatialPlot(seurat_vs, keep.scale = NULL, alpha = 0)
再看看切片中某种细胞在每个spot的比例图:看一下 CM 细胞
# cell2location 反卷积结果
DefaultAssay(seurat_vs) <- "c2l_props"
# 细胞类型
rownames(seurat_vs)
# [1] "Adipo" "CM" "Endo" "Fib" "Lymphoid" "Mast" "Myeloid" "Neuronal" "PC" "prolif" "vSMCs"
# CM, cardiomyocytes 即心肌细胞
SpatialFeaturePlot(seurat_vs, keep.scale = NULL, features = "CM")
观察细胞的空间分布模式(绘制所有细胞类型结果):其中一些细胞类型广泛分布在整个载玻片上,而另一些则集中在特定区域。此外,还有一些细胞类型具有相似的分布模式。
定义 intraview 内部视角:captures the cell type proportions within a spot
定义 paraview 旁观视角:To capture the distribution of cell type proportions in the surrounding tissue
定义 the radius:the mean of the distance to the nearest neighbor plus the standard deviation
计算每个 spot 的权重:通过设置参数 family = gaussian
实现
距离计算:“distances” 构建了一组点的 Euclidean距离度量,公式如下:
# 运行mistyR
# Calculating the radius
head(geometry)
geom_dist <- as.matrix(distances(geometry))
geom_dist[1:5,1:4]
dim(geom_dist)
dist_nn <- apply(geom_dist, 1, function(x) (sort(x)[2]))
paraview_radius <- ceiling(mean(dist_nn+ sd(dist_nn)))
paraview_radius
# Create views
head(composition)
heart_views <- create_initial_view(composition) %>%
add_paraview(geometry, l= paraview_radius, family = "gaussian")
str(heart_views, max.level = 2)
# Run misty and collect results
run_misty(heart_views, "result/vignette_structural_pipeline")
misty_results <- collect_results("result/vignette_structural_pipeline")
返回的 geom_dist 是一个 3175 * 3175的矩阵,为任意两个spot间的距离。
1.与内部视角(intraview)相比,周围组织中存在的细胞类型在多大程度上能够解释该spot的细胞类型组成?
这句话探讨的是周围组织的细胞类型与特定点(spot)的细胞类型组成之间的关联程度,以及这种关联与内部视角 intraview 结果的对比。它评估周围组织的细胞类型分布对特定点细胞组成的影响,以及这种影响是否与 intraview 结果一致。
查看两种不同的统计指标:multi.R2
表示多视角模型解释的总方差,gain.R2
则显示从单视角模型到多视角模型时可解释方差的增加量。
# `multi.R2` 表示多视角模型解释的总方差
plot_improvement_stats(misty_results,"multi.R2")
multi.R² 的值,即多视角模型相对于单视角模型的改进程度:高度越高,说明多视角模型对解释标记物表达变异的贡献越大
# `gain.R2` 则显示从单视角模型到多视角模型时可解释方差的增加量。
plot_improvement_stats(misty_results,"gain.R2")
旁观视角(paraview)在解释脂肪细胞 Adipo 和肥大细胞 Mast 的方差方面表现出显著优势。R²的显著提升表明,通过引入除内在视角之外( intrinsic view)的其他视角,能够更准确地解释标记物X的表达。
第二个问题:
2. 哪些具体的关系能够解释这些贡献?
# the intrinsic view:
plot_interaction_heatmap(misty_results, view = "intra", clean = TRUE)
该图展示在 内部视角(intra-view) 下细胞亚群之间的相互作用强度:
# the importance values
temp <- misty_results$importances.aggregated %>%
filter(view == "intra", Predictor == "CM") %>%
arrange(-Importance)
head(temp)
# view Predictor Target Importance nsamples
# <chr> <chr> <chr> <dbl> <int>
# 1 intra CM Fib 2.74 1
# 2 intra CM vSMCs 2.43 1
# 3 intra CM prolif 2.23 1
# 4 intra CM Myeloid 2.21 1
# 5 intra CM Endo 2.15 1
# 6 intra CM Mast 2.02 1
看看这些细胞类型在组织切片中的空间分布情况:
SpatialFeaturePlot(seurat_vs, keep.scale = NULL, features = c("Fib","CM"), image.alpha = 0)
我们可以观察到,心肌细胞比例较高的区域,成纤维细胞的比例较低,反之亦然:
包的版本:
packageVersion("mistyR")
# [1] ‘1.10.0’
前面在 seurat v5 环境中绘图总有问题,可以这样读取数据并绘图:
## 绘图
data <- Read10X(data.dir = "ACH005/outs/filtered_feature_bc_matrix/")
dim(data)
data[1:5,1:5]
object <- CreateSeuratObject(counts = data, assay = "Spatial", min.cells = 1)
object
# 再读取
image <- Read10X_Image(image.dir = "ACH005/outs/spatial/",
image.name = "tissue_lowres_image.png",
filter.matrix = TRUE)
image
dim(image)
image <- image[Cells(x = object)]
DefaultAssay(object = image) <- "Spatial"
# 添加图片到object中
object[["SeuratProject"]] <- image
object@images[[1]]@scale.factors$lowres
object@images[[1]]@scale.factors$hires
head(object@meta.data)
SpatialFeaturePlot(object, keep.scale = NULL, features = "nCount_Spatial",pt.size.factor = 1.6)
object <- AddMetaData(object, metadata = composition)
head(object@meta.data)
SpatialFeaturePlot(object, features = "CM", keep.scale = NULL,pt.size.factor = 2,alpha = 1)