–https://doi.org/10.1038/s41592-024-02380-w
Inferring pattern-driving intercellular flows from single-cell and spatial transcriptomics
FlowSig是刚刚(8月26日)发表在nature methods上的新文章,该方法系统性地推断出由细胞间通信驱动的细胞间流动网络,深入的阐述不同状态下细胞互作、通讯关系。
刚好最近在学习聂青大佬课题组的文章,太赞了!
留意更多内容,欢迎关注微信公众号:组学之心
研究团队和研究单位
1.FlowSig 简介
我们可以从单细胞 RNA 测序 (scRNA-seq) 和空间转录组学 (ST) 中提取高维基因表达模式,这些模式可以通过细胞间通讯网络或解耦基因模块来描述。这两种信息流描述通常被认为是独立发生的。然而,细胞间通讯驱动由细胞内基因模块介导的定向信息流,进而触发其他信号的流出。
目前描述这种细胞间流动的方法尚不完善。FlowSig 是一种新方法,用于从单细胞 RNA 测序 (scRNA-seq) 和空间转录组学 (ST) 数据中由配体-受体相互作用描述的定向细胞间流动,从而挖掘出驱动组织规模的基因表达模式。这些模式涉及信号的流入、细胞内基因模块 (GEMs) 的调控响应以及信号的流出。
FlowSig 的实现步骤如下:
-
1.图形因果建模:FlowSig 使用图形因果建模来构建和推断细胞间流动网络。无论是 scRNA-seq 还是 ST 数据,FlowSig 都会生成表示流入信号、细胞内基因模块 (GEMs) 和流出信号的变量,并通过条件独立性测试确定这些变量之间的依赖关系。
-
2.scRNA-seq 数据:对于非空间的 scRNA-seq 数据,FlowSig 通过对照和扰动条件(如健康与疾病状态)的比较,和直接下游 TF 靶标的通路知识来学习细胞间通讯产生的准确细胞间流动。在这种情况下,由于无法直接测量每个细胞接收到的信号,FlowSig 通过接收信号的潜力(受体基因表达)和实际接收到信号的程度(下游转录因子表达)来估算流入信号。
-
3.ST 数据:对于空间转录组数据,由于其包含位置信息,FlowSig 能够更准确地测量每个空间位置接收到的信号,能够在没有额外扰动数据的情况下推断出空间上的细胞间流动。在这种情况下,FlowSig 结合了诸如 COMMOT 等空间通信推断方法,使得流入信号的估计更加准确。
-
4.GEMs 的协同使用:在 FlowSig 中,GEMs(基因表达模块,当然也是邓紫棋们哈哈哈)在两种数据类型中都发挥着重要作用。对于 scRNA-seq 数据,GEMs 被用来表示与特定细胞类型相关的基因表达模式;对于 ST 数据,GEMs 则包含了与空间位置相关的基因表达模式。通过分析这些 GEMs 在不同数据类型中的关联性,FlowSig 能够识别出特定的调控因子和通信模式在空间和时间维度上的变化。
-
5.FlowSig 输出一个细胞间流动网络,描述从流入信号变量(从 COMMOT 推断的接收到的信号配体的量,rec. Li )到空间分辨的 GEM(GEMs 的membership,GEMi),再到流出变量(配体基因表达,Li)的定向边缘。
举个例子:
研究的一项分析首先用 pyLIGER 构建了 10 个 GEM,它们与研究独立识别的五个细胞型簇 alpha 、 beta 1 到 3 和 delta 对齐。
研究下一步使用这些细胞类型注释作为初步 CellChat 分析的输入;也就是说,对于每种情况,CellChat 都会推断出由这些细胞类型标记定义的细胞组之间显著的成对配体-受体相互作用。(是的没错,FlowSig调用了CellChat)
上图是FlowSig推断的全局细胞间流动网络,具体显示了从细胞间信号流入到基因表达模块(GEMs),再到信号流出的整个过程。
1. 流入信号(Inflowing signals):
上半部分显示了几个流入信号,分别是FGFR1、IL6R + IL6ST、NCL 和 SSTR2。这些信号代表的是通过特定受体接收到的细胞外信号。
2. 基因表达模块(GEMs):
中间部分显示了基因表达模块(GEMs),它们位于流入信号和流出信号之间。GEMs 是通过相关基因表达分析得出的基因集合,这些基因集合的表达模式在特定细胞类型中是高度相关的。图中的GEMs标注为GEM-1、GEM-3、GEM-4、GEM-5和GEM-6,它们与特定的转录因子(TFs)如ID1、NR1D1、TFF3和ZNF419相关联。这些GEMs表示细胞在接收到外部信号后,内部的基因调控响应。
3. 流出信号(Outflowing signals):
下半部分展示了细胞产生的流出信号,这些信号通过下游的GEMs调控而产生,包括GCG、INHBA、NAMPT、SPP1、TGFB1、TNFSF12 和 UCN3。这些信号传递给其他细胞,进一步影响细胞间通信。
4. 箭头与连线:
图中的箭头表示信息流动的方向,箭头的粗细或颜色深浅反映了流动的强度。
连接流入信号、GEMs和流出信号的线条展示了这些信号之间的因果关系和信息传递路径。
5. 图中的解析:
FlowSig 发现 FGF、IL-6、MDK 和 SST 是细胞间流的主要驱动因素,驱动 GCG、INHBA、NAMPT、SPP1、TGFB1、TNFSF12 和 UCN3 通过 GEM-1、GEM-3、GEM-5 和 GEM-6 流出。这种因果链条揭示了细胞接收到的外部信号如何通过内部基因调控网络被转化为新的信号,从而在组织或器官中引发一系列连锁反应。
6. 结合图a来解析结果背后的生物学意义:
可以观察到 GEM-1 在 alpha 和 beta 1 簇中均富集,GEM-3 和 GEM-5 在 alpha 簇中富集,GEM-4 在 beta 2 簇中富集,GEM-6 在 beta 1 簇中富集,表明细胞间流动由细胞类型驱动。这些结果在之前的研究得到验证,即在胰腺中,alpha 细胞是 GCG 的主要分泌物,beta 细胞是 UCN3 的主要分泌物,并且 SST 同时调节 GCG 和 UCN3。FlowSig观察到相同的 TF 对所有这些 GEM(ID1、NR1D1、TFF3 和 ZNF419)都有贡献,这表明这些 TF 介导两种条件下的细胞间流动。
2.代码实现之单细胞转录组数据
代码来源:https://github.com/axelalmet/flowsig
2.1 配置环境
作者推荐python3.8版本,3.9版本有不兼容的地方
此外,需要提前安装好Cellchat和COMMOT
python3 -m venv flowsigenv
source flowsigenv/bin/activate
# 克隆github的repository
git clone https://github.com/axelalmet/flowsig.git
cd ./flowsig/
# 用setup.cfg来安装
pip3 install .
需要安装NSF来推断空间转录组的GEM
pip3 install git+https://github.com/willtownes/spatial-factorization-py.git#egg=spatial-factorization
2.2 加载数据和细胞间通信推断
分析用到的数据可以从这里下载:https://github.com/axelalmet/FlowSigAnalysis_2023
https://zenodo.org/records/10850398
数据以 Scanpy 对象的形式指定。FlowSig 生成的所有后续输出都存储在 Scanpy 对象中。
import flowsig as fs
import scanpy as sc
import pandas as pd
data_directory = '../data/'
# Load the scanpy object
adata = sc.read(data_directory + 'burkhardt21_merged.h5ad')
condition_key = 'Condition'
# 加载细胞-细胞通讯的推断
cellchat_Ctrl = pd.read_csv('../communication_inference/output/burkhardt21_leiden_communications_Ctrl.csv')
cellchat_IFNg = pd.read_csv('../communication_inference/output/burkhardt21_leiden_communications_IFNg.csv')
cellchat_output_key = 'cellchat_output'
# Make sure your keys for the cellchat output dictionary match the relevant condition labels
adata.uns[cellchat_output_key] = {'Ctrl': cellchat_Ctrl,
'IFNg': cellchat_IFNg}
2.3 构建GEMs
从未标准化的count数据中构建基因表达模块 (GEM)。对于具有多个条件的非空间 scRNA-seq,使用 pyliger 的 iNMF 算法。
fs.pp.construct_gems_using_pyliger(adata,
n_gems = 10,
layer_key = 'counts',
condition_key = condition_key)
2.4 构建flow表达矩阵
研究为每种情况构建了增强流表达矩阵,用于测量三种类型的变量:
- 1.细胞间信号流入,即细胞接收到了多少信号。对于非空间 scRNA-seq,信号流入定义为受体基因表达,加权自指示信号激活的直接下游转录因子的平均表达。
- 2.GEM,封装细胞内信息处理。我们将其定义为 GEM 的细胞成员资格。
- 3.细胞间信号流出,即细胞发送了多少信号。这些只是配体基因表达。
flowsig 的关键假设是,所有细胞间信息流都从信号流入到 GEM,从一个 GEM 到另一个 GEM,从 GEM 到信号流出。
对于非空间 scRNA-seq,我们需要指定模型生物,以便 FlowSig 知道要查看哪个受体转录因子靶标列表。
fs.pp.construct_flows_from_cellchat(adata,
cellchat_output_key,
gem_expr_key = 'X_gem',
scale_gem_expr = True,
model_organism = 'human',
flowsig_network_key = 'flowsig_network',
flowsig_expr_key = 'X_flow')
为了减少推断细胞间流动所需的变量数量(从而减少计算时间),并优先考虑“信息变量”,只保留在控制和扰动条件下具有足够差异流动的流入和流出信号。使用 Wilcoxon 秩和检验确定差异流动信号,并且仅当变量低于指定的调整 p 值阈值(q 值)并高于指定的log(FC)阈值时才保留它们。
fs.pp.determine_informative_variables(adata,
flowsig_expr_key = 'X_flow',
flowsig_network_key = 'flowsig_network',
spatial = False,
condition_key = condition_key,
control_key = 'Ctrl',
qval_threshold = 0.05,
logfc_threshold = 0.5)
2.5 学习细胞间流动
fs.tl.learn_intercellular_flows(adata,
condition_key = condition_key,
control_key = 'Ctrl',
flowsig_key = 'flowsig_network',
flow_expr_key = 'X_flow',
use_spatial = False,
n_jobs = 4,
n_bootstraps = 500)
2.6 部分验证细胞间流动网络
最后移除任何“假阳性”边。注意到 CPDAG 包含有向弧和无向弧。
首先,FlowSig移除不是从信号流入到 GEM、从 GEM 到 GEM 或从 GEM 到信号流出的有向弧,对于无向边,我们重新调整它们的方向,使它们遵循先前的方向性。
fs.tl.learn_intercellular_flows(adata,
condition_key = condition_key,
control_key = 'Ctrl',
flowsig_key = 'flowsig_network',
flow_expr_key = 'X_flow',
use_spatial = False,
n_jobs = 4,
n_bootstraps = 500)
其次,FlowSig将删除自举频率低于指定边阈值的有向弧以及总自举频率低于相同阈值的无向边。
edge_threshold = 0.7
fs.tl.filter_low_confidence_edges(adata,
edge_threshold = edge_threshold,
flowsig_network_key = 'flowsig_network',
adjacency_key = 'adjacency_validated',
filtered_key = 'filtered')
每次应用这些步骤时,FlowSig都会生成一个描述细胞间流动网络边缘的新邻接矩阵。
learn_intercellular_flows 的原始输出存储在 adata.uns['flowsig_network][‘network’][‘adjacency’] 中。
使用 apply_biological_flow 进行验证后,FlowSig将 _validated 键添加到邻接键中,以便将新邻接存储在 adata.uns['flowsig_network][‘network’][‘adjacency_validated’] 中。
过滤低置信度边缘后,邻接存储在 adata.uns['flowsig_network][‘network’][‘adjacency_validated_filtered’] 下。
如果要想直接探索网络,FlowSig包含了一个函数来生成有向 NetworkX DiGraph 对象:
flow_network = fs.tl.construct_intercellular_flow_network(adata,
flowsig_network_key = 'flowsig_network',
adjacency_key = 'adjacency_validated_filtered')
3.代码实现之空转数据
分析用到的数据可以从这里下载:https://github.com/axelalmet/FlowSigAnalysis_2023
https://zenodo.org/records/10850398
import flowsig as fs
import scanpy as sc
import pandas as pd
3.1 加载数据和细胞间通信推断
data_directory = '../data/'
adata = sc.read(data_directory + 'chen22_E9.5_svg.h5ad')
commot_output_key = 'commot-cellchat'
3.2 构建GEM
FlowSig从未标准化的count数据中构建基因表达模块 (GEM)。对于 ST 数据,FlowSig使用 NSF。
fs.pp.construct_gems_using_nsf(adata,
n_gems = 20,
layer_key = 'count',
n_inducing_pts = 500,
length_scale = 10)
3.3 构建flow表达矩阵
对于空间数据,FlowSig直接使用 COMMOT 输出来构建信号流入表达,不需要有关 TF 数据库的知识。
fs.pp.construct_flows_from_commot(adata,
commot_output_key,
gem_expr_key = 'X_gem',
scale_gem_expr = True,
flowsig_network_key = 'flowsig_network',
flowsig_expr_key = 'X_flow')
对于空间数据,我们保留空间信息变量,这些变量通过计算信号流入和信号流出变量的 Moran’s I 值来确定。如果尚未为该数据计算空间图,FlowSig 将进行计算,这意味着我们需要指定坐标类型(网格或通用),如果是前者,则指定 n_neighs,在本例中为 8。
如果流表达式变量的 Moran’s I 值高于指定阈值,则将其定义为具有空间信息性。
fs.pp.determine_informative_variables(adata,
flowsig_expr_key = 'X_flow',
flowsig_network_key = 'flowsig_network',
spatial = True,
moran_threshold = 0.15,
coord_type = 'grid',
n_neighbours = 8,
library_key = None)
3.4 学习细胞间流动
对于空间数据,关于“控制与扰动”的研究要少得多,FlowSig使用 GSP 方法,该方法使用条件独立性测试和贪婪算法来学习包含有向弧和无向边的 CPDAG。
对于空间数据,我们不能通过在单个细胞中重新采样来进行引导,因为我们会丢失空间数据中包含的额外相关性层。相反,将组织划分为空间“块”,并在块内重新采样,这称为块引导。
为了计算块,FlowSig使用 scikit-learn 的 k-means 聚类方法来生成 20 个大小大致相等的空间块。
from sklearn.cluster import KMeans
kmeans = KMeans(n_clusters=20, random_state=0).fit(adata.obsm['spatial'])
adata.obs['spatial_kmeans'] = pd.Series(kmeans.labels_, dtype='category').values
使用这些模块来学习空间细胞间流动。
fs.tl.learn_intercellular_flows(adata,
flowsig_key = 'flowsig_network',
flow_expr_key = 'X_flow',
use_spatial = True,
block_key = 'spatial_kmeans',
n_jobs = 4,
n_bootstraps = 500)
3.5 部分验证细胞间流动网络
和单细胞部分的处理一样
fs.tl.apply_biological_flow(adata,
flowsig_network_key = 'flowsig_network',
adjacency_key = 'adjacency',
validated_key = 'validated')
fs.tl.apply_biological_flow(adata,
flowsig_network_key = 'flowsig_network',
adjacency_key = 'adjacency',
validated_key = 'validated')
flow_network = fs.tl.construct_intercellular_flow_network(adata,
flowsig_network_key = 'flowsig_network',
adjacency_key = 'adjacency_validated_filtered')
如果帮助到你,点个关注吧~thx!