前面我们分享过空间邻域的概念,见:空间转录组细胞邻域(Cellular Neighborhood)分析。今天来看看实战,使用Squidpy工具进行分析,该软件于2022年1月31号发表在 Nature Methods 杂志上,文献标题为《Squidpy: a scalable framework for spatial omics analysis》。学习的参考教程如下:
https://www.sc-best-practices.org/spatial/neighborhood.html
在对数据集中的细胞类型或细胞状态进行注释后,我们可以量化这些注释是否在空间上富集,并分析组织中的细胞邻域。
细胞邻域分析是各种下游任务的良好起点,因为它有助于理解组织的细胞组成,并识别出可用于更深入分析的候选区域。例如,它可以根据空间邻近性帮助找到细胞间通信的候选区域,或者识别出空间区域和聚类,以便鉴定空间可变基因。
邻域分析通常通过空间统计学进行 [Gelfand et al., 2010],这些是定量评分,可用于识别组织中的空间邻域。在这里,我们将查看在 Squidpy [Palla et al., 2022] 中实现的各种空间统计方法。
https://squidpy.readthedocs.io/en/stable/
conda activate sc
pip install squidpy -i https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple
加载模块:
import scanpy as sc
import squidpy as sq
sc.settings.verbosity = 3
sc.settings.set_figure_params(dpi=80, facecolor="white")
示例数据来自:https://support.10xgenomics.com/spatial-gene-expression/datasets/1.1.0/V1_Adult_Mouse_Brain
包内置下载:
adata = sq.datasets.visium_hne_adata()
adata
或者下载后,数据结构如下:
读取:
adata = sc.read_visium(path="../data/V1_Adult_Mouse_Brain/", count_file="V1_Adult_Mouse_Brain_filtered_feature_bc_matrix.h5")
adata
当然这里的信息没有上面的多,还是使用上面那个就好了。
# 可视化看一眼
import matplotlib.pyplot as plt
# 设置全局绘图大小
plt.rcParams['figure.figsize'] = (10, 10) # 宽度和高度(单位:英寸)
sc.pl.spatial(adata, img_key = "hires", color="leiden", size=1.2)
# 显示绘图
plt.show()
注释后的信息:
# 可视化看一眼
sc.pl.spatial(adata, img_key = "hires", color="cluster", size=1.2)
在对细胞类型或状态进行注释后,可以通过计算邻域富集度来识别在组织中相邻的簇。富集评分机制:
通过 n_perms
参数设置随机扰动数量(默认值为 1000)。为了进行这种分析,需要计算空间连通性矩阵(a spatial connectivity matrix,空间图),这可以通过 squidpy.gr.spatial_neighbors()
函数完成:
sq.gr.spatial_neighbors(adata)
得到的结果在:
Creating graph using `grid` coordinates and `None` transform and `1` libraries.
Adding `adata.obsp['spatial_connectivities']`
`adata.obsp['spatial_distances']`
`adata.uns['spatial_neighbors']`
Finish (0:00:01)
现在可以通过提供 adata.obs
中的注释cluster来运行邻域富集测试,结果为 AnnData 对象中的adata.uns['cluster_nhood_enrichment']
sq.gr.nhood_enrichment(adata, cluster_key="cluster")
adata.uns["cluster_nhood_enrichment"]
添加的对象包含两个数组。第一个存储在 zscore
下,包含每个细胞间相互作用的富集 Z 分数。第二个存储在 count
下,表示富集计数。可以直接使用 squidpy.pl.nhood_enrichment()
来可视化结果:
sq.pl.nhood_enrichment(adata, cluster_key="cluster", method="average", figsize=(5, 5))
上面的图中 Pyramidal_layer 和 Dentate_gyrus 簇在空间上存在富集现象,即这些簇的细胞经常彼此靠近,形成“邻居”关系。通过查看上面的空间散点图,我们可以确认这些簇确实是“邻居”,因为它们的成员通常彼此靠近。
类似的方法是计算相互作用矩阵interaction matrix,即组织中簇之间所有连接观测值的总和。这种方法与邻域富集分析有关,但它不是一个检验,而是空间图的一个简单总结统计量。看看这个数据集的相互作用矩阵是什么样子的:
sq.gr.interaction_matrix(adata, cluster_key="cluster")
# Adding `adata.uns['cluster_interactions']`
adata.uns["cluster_interactions"]
# 可视化互作用矩阵
sq.pl.interaction_matrix(adata, cluster_key="cluster", method="average", figsize=(5, 5))
对于这个数据集,大致重现了邻域富集测试,但似乎没有观察到 Pyramidal_layer 和 Dentate_gyrus 簇之间存在特别强烈的相互作用。这种结果可能是:这些簇的观测数量较少,因此相互作用的数量也较低。
另一种可以在空间坐标中的细胞类型注释上计算的空间统计量是共出现分数co-occurrence score [Palla et al., 2022, Tosti et al., 2021]。共出现分数co-occurrence score为我们提供了一个指示,即簇在组织中随着距离的增加是否共同出现。共现分数的定义是:
其中,P(A∣B) 是在簇 B 存在的条件下观察到簇 A 的条件概率,而 P(A) 是在感兴趣的半径范围内观察到簇 A 的概率。该分数是在组织中每个观测点(即这里的点)周围逐渐增加的半径范围内计算的。
sq.gr.co_occurrence(adata, cluster_key="cluster")
sq.pl.co_occurrence(adata, cluster_key="cluster", clusters="Cortex_1", figsize=(8, 5))
这里,我们选择可视化 Cortex_1 簇,以展示在近距离下,该簇与其他 Cortex 簇的共同出现情况。
今天分享到这~