空间转录组以及单细胞转录组
技术,为解析细胞-细胞通讯(Cell–Cell Communication, CCC)提供了前所未有的机会。然而,如何在重建细胞通讯网络的过程中充分整合细胞间的空间位置信息和复杂的生化过程,仍然是一个重大挑战。
COMMOT
(
COMMunication analysis by Optimal Transport
)是一种创新的分析方法,旨在在空间转录组数据中推断细胞通讯关系。它基于
集体最优传输理论(collective optimal transport)
,能够同时考虑多个配体-受体对之间的相互竞争关系以及细胞之间的空间距离,实现更为精确和生物学上合理的通讯建模。该算法发表于2023年的Nature Methods,题为《Screening cell–cell communication in spatial transcriptomics via collective optimal transport》。
COMMOT 的主要功能包括:
支持多种类型空间数据(如原始空间转录组或配对成像数据推断的空间单细胞转录组);
提供全面的可视化工具,包括通讯热图、信号流向图和基因调控网络图等。
下面我们学习一下官网的参考文档(https://github.com/zcang/COMMOT):
首先是环境的部署:
#构建分析环境commot mamba create -n commot python=3.8 -y conda activate commot pip install commot #mamba install -c conda-forge pygraphviz #pip install get-version==2.0.4 mamba install -y nb_conda_kernels ipykernel python -m ipykernel install --user --name commot --display-name commot
可选:
#安装官网教程,在下游分析DE genes时会用到tradeseq mamba install rpy2 mamba install r-base==3.6.3 pip install commot[tradeSeq]
#安装完成后,进入R程序,在里面安装tradeSeq if (! require ( "BiocManager" , quietly = TRUE )) install.packages( "BiocManager" ) BiocManager::install( "tradeSeq" )
参考文档总共分为两大部分:
以及Visium data example (mouse brain)
一. Basic usage
import commot as ct import scanpy as sc import pandas as pd import numpy as np import matplotlib.pyplot as plt
Step1. 加载示例数据
adata = sc.datasets.visium_sge(sample_id= 'V1_Mouse_Brain_Sagittal_Posterior' ) adata.var_names_make_unique()
Step2. 数据预处理
该方法假定使用的数值为非负数,并反映信号分子的丰度。
sc.pp.normalize_total(adata, inplace= True ) sc.pp.log1p(adata)
Step3.
指定配体-受体对
这里,我们以仅包含三个 LR 对为例。
可以用同样的方式指定用户自定义的 LR 数据库,或者也可以通过函数
commot.pp.ligand_receptor_database()
获取内置的 LR 数据库。
例如,
df_ligrec = ct.pp.ligand_receptor_database(database='CellChat', species='mouse')
。
LR=np.array([[ 'Tgfb1' , 'Tgfbr1_Tgfbr2' , 'Tgfb_pathway' ], [ 'Tgfb2' , 'Tgfbr1_Tgfbr2' , 'Tgfb_pathway' ], [ 'Tgfb3' , 'Tgfbr1_Tgfbr2' , 'Tgfb_pathway' ], [ 'Fgf1' , 'Fgfr1' , 'FGF_pathway' ], [ 'Fgf1' , 'Fgfr2' , 'FGF_pathway' ]],dtype=str) df_ligrec = pd.DataFrame(data=LR)
Step4. 构建 CCC 网络
使用最优传输方法为满足 500 微米空间距离约束的配体-受体对构建 CCC 网络(距离超过 500 米的细胞之间禁止耦合)。 例如,Tgfb1(配体)与 Tgfbr1_Tgfbr2(受体)的点对点矩阵存储在 adata.obsp['commot-user_database-Tgfb1-Tgfbr1_Tgfbr2'] 中。每个配体-受体对的总发送或接收信号分别存储在 adata.obsm['commot-user_database-sum-sender'] 和 adata.obsm['commot-user_database-sum-receiver'] 中。
ct.tl.spatial_communication(adata, database_name= 'user_database' , df_ligrec=df_ligrec, dis_thr= 500 , heteromeric= True , pathway_sum= True )
Step5. 可视化
pts = adata.obsm[ 'spatial' ] s = adata.obsm[ 'commot-user_database-sum-sender' ][ 's-Fgf1-Fgfr1' ] r = adata.obsm[ 'commot-user_database-sum-receiver' ][ 'r-Fgf1-Fgfr1' ] fig, ax = plt.subplots( 1 , 2 , figsize=( 10 , 4 )) ax[ 0 ].scatter(pts[:, 0 ], pts[:,
1 ], c=s, s= 5 , cmap= 'Blues' ) ax[ 0 ].set_title( 'Sender' ) ax[ 1 ].scatter(pts[:, 0 ], pts[:, 1 ], c=r, s= 5 , cmap= 'Reds' ) ax[ 1 ].set_title( 'Receiver' )
image-20250321214846249
可视化信号传导方向
将信号传导方向插值为向量场。
ct.tl.communication_direction(adata, database_name= 'user_database' , lr_pair=( 'Fgf1' , 'Fgfr1' ), k= 5 ) ct.pl.plot_cell_communication(adata, database_name= 'user_database' , lr_pair=( 'Fgf1' , 'Fgfr1' ), plot_method= 'grid' , background_legend= True , scale= 0.00003 , ndsize= 8 , grid_density= 0.4 , summary= 'sender' , background= 'image' , clustering= 'leiden' , cmap= 'Alphabet' , normalize_v = True , normalize_v_quantile= 0.995 )
image-20250321214906136
或者,根据接收信号的水平绘制方向。
ct.pl.plot_cell_communication(adata, database_name= 'user_database' , lr_pair=( 'Fgf1' , 'Fgfr1' ), plot_method= 'grid' , background_legend= True , scale= 0.00003 , ndsize= 8 , grid_density= 0.4 , summary= 'receiver' , background= 'summary' , clustering= 'leiden' , cmap= 'Reds' , normalize_v = True , normalize_v_quantile= 0.995 )
image-20250321214921482
COMMOT 分析的结果附加在 anndata 对象中:
**adata.uns['commot-user_database-info']**:所使用的配体-受体数据库
**adata.obsm['commot-user_database-sum-sender']**:每个配体-受体对的发送信号量以及各信号通路的总和
**adata.obsm['commot-user_database-sum-receiver']**:每个配体-受体对的接收信号量以及各信号通路的总和
**adata.obsm['commot_sender_vf-user_database-Fgf1-Fgfr1']**:每个点上与发送信号相关的插值信号传导方向
**adata.obsm['commot_receiver_vf-user_database-Fgf1-Fgfr1']**:每个点上与接收信号相关的插值信号传导方向
**adata.obsp['commot-user_database-Fgf1-Fgfr1']**:一个稀疏矩阵,其中的元素表示通过 Fgf1-Fgfr1 从一个点到另一个点的 CCC 分数
adata
AnnData object with n_obs × n_vars = 3355 × 32285 obs: 'in_tissue', 'array_row', 'array_col' var: 'gene_ids', 'feature_types', 'genome' uns: 'spatial', 'log1p', 'commot-user_database-info' obsm: 'spatial', 'commot-user_database-sum-sender', 'commot-user_database-sum-receiver', 'commot_sender_vf-user_database-Fgf1-Fgfr1', 'commot_receiver_vf-user_database-Fgf1-Fgfr1' obsp: 'commot-user_database-Fgf1-Fgfr2', 'commot-user_database-Fgf1-Fgfr1', 'commot-user_database-Tgfb2-Tgfbr1_Tgfbr2', 'commot-user_database-Tgfb3-Tgfbr1_Tgfbr2', 'commot-user_database-Tgfb1-Tgfbr1_Tgfbr2', 'commot-user_database-FGF_pathway', 'commot-user_database-Tgfb_pathway', 'commot-user_database-total-total'
二. Visium data example (mouse brain)
import os import gc import ot import pickle import anndata import scanpy as sc import pandas as pd import numpy as np from scipy import sparse from scipy.stats import spearmanr, pearsonr from scipy.spatial import distance_matrix import matplotlib.pyplot as plt import commot as ct adata = sc.datasets.visium_sge(sample_id= 'V1_Mouse_Brain_Sagittal_Posterior' )
Step1. 数据预处理
这里需要合理反映分子丰度的非负数值。 我们这里只进行最基础的数据预处理,包括归一化总计数和 log1p 变换。 也可以进行更详细的预处理,例如回归细胞周期基因的影响。
adata.var_names_make_unique() adata.raw = adata sc.pp.normalize_total(adata, inplace= True ) sc.pp.log1p(adata) adata_dis500 = adata.copy()
Step2. 基本聚类
使用常见的 scRNA-seq 数据聚类方法对数据进行基本聚类。 或者,可以使用专门用于空间转录组数据的工具,例如 SpaceFlow
sc.pp.highly_variable_genes(adata, min_mean=