Nature methods | FlowSig--揭示细胞间流动网络新方法!有具体代码可实操!

news2024/11/15 6:59:29


–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!

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2079077.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Ubuntu系统使用Docker部署中文版trilium并实现远程编辑笔记

文章目录 前言1. 安装docker与docker-compose2. 启动容器运行镜像3. 本地访问测试4.安装内网穿透5. 创建公网地址6. 创建固定公网地址 前言 今天和大家分享一款在G站获得了26K的强大的开源在线协作笔记软件,Trilium Notes的中文版如何在Linux环境使用docker本地部署…

GPT微调和嵌入哪个好,大模型微调 和嵌入有什么区别?微调(fine-tuning),嵌入(embedding)的用法!

GPT擅长回答问题,但是只能回答它以前被训练过的问题,如果是没有训练过的数据,比如一些私有数据或者最新的数据该怎么办呢? 这种情况下通常有两种办法,一种是微调(fine-tuning),一种…

四大神器:2024免费数据恢复软件推荐!

在这个数字化的时代,数据丢失可能是我们最不想面对的事情之一。但不用担心,今天我就来给大家介绍几款免费又好用的数据恢复软件! 第一款:福昕数据恢复 链接:www.pdf365.cn/foxit-restore/ 这是一款由福昕公司推出的…

Vue3+Ts封装input组件时遇到的问题

使用input事件监听输入框变化时,如果当前使用的输入法是中文,他也会触发input事件,正常来说,中文没有输入完毕是不用触发事件的。 控制台打印时发现: 那么我们应该怎么去规避这件事呢? 其实input还有几个事…

从永远到永远-日语学习-て形用法及变形规律

て形用法及变形规律 0.前置知识1.常见用法1.请求某人做某事 「~てください」2.几个连续发生的动作 ~て、~て、~て3.两个动作先后发生「てから」4. 表示许可 「てもいいです」5.表示禁止 「~てはいけません」6.「&#…

亚马逊新品如何获取评论,为店铺提高产品排名权重流量订单?测评

大多数消费者都会购买具有最佳评论和评级的产品。亚马逊评论是影响消费者决策的关键因素,卖家对评论的重视程度也非常之高,亚马逊卖家最常见的挑战之一是获得产品评论。 1.亚马逊Vine计划: 亚马逊Vine计划是亚马逊为品牌卖家提供的专属评论计…

猫咪浮毛如何清理?希喂、安德迈、范罗士宠物空气净化器功能实测

拥有一只属于自己的小猫咪,是一件非常幸福的事。美中不足的就是它掉毛,疯狂的掉毛,家里到处都是毛发散落的痕迹。和它亲近的时候,也会沾满一身毛,清理起来非常麻烦。特别是随着季节的转换,猫咪换毛季的到来…

使用IntelliJ IDEA将本地项目推送到远程Git

1,安装Git 打开 下载地址,下载Git安装包。根据引导程序,完成安装。 2,IntelliJ IDEA配置Git 打开IntelliJ IDEA,依次点击File>>Settings…>>Git,然后配置自己的Git的路径,然后点…

系统架构分析

一、速通一图流 二、系统架构功能、作用分析 1. Furion:框架核心层 功能:这是 Furion 框架的核心层,通常包含框架本身的基本功能和配置。这一层应该是比较稳定的,不应该包含业务逻辑,而是提供项目其他部分需要依赖的…

yolo7 自定义数据训练

数据打标labelimg 预定义标签 格式name label 数据集定义文件errimg.yaml train: /home/kean/works/yolov7/dataset/train.txt val: /home/kean/works/yolov7/dataset/val.txt # number of classes nc: 1 # class names names: ["error_dialog"] 数据定义文件train.…

【JS】使用MessageChannel实现深度克隆

前言 通常使用简便快捷的JSON 序列化与反序列化实现深克隆,也可以递归实现或者直接使用lodash。 但 JSON 序列化与反序列化 无法处理如下的循环引用: 实现 MessageChannel 内部使用了浏览器内置的结构化克隆算法,该算法可以在不同的浏览器上…

学习之在window上安装MySQL server 并连接到Navicat

一、下载 下载地址:https://www.mysql.com/ 二、安装 1、双击软件安装2、点击yes

【解析几何笔记】9. 向量的内积运算

9. 向量的内积运算 定义&#xff1a;有向量 α , β \pmb{\alpha},\pmb{\beta} α,β&#xff0c; α ⋅ β ∣ α ∣ ∣ β ∣ ⋅ cos ⁡ < α , β > \pmb{\alpha}\cdot\pmb{\beta}|\pmb{\alpha}||\pmb{\beta}|\cdot\cos<\pmb{\alpha},\pmb{\beta}> α⋅β∣α…

Commons Lang库中,StringUtils.isBlank()和StringUtils.isEmpty()区别

在Apache Commons Lang库中&#xff0c;StringUtils.isBlank()和StringUtils.isEmpty()方法都是用来判断字符串是否为空或者空白的。它们的主要区别在于处理空格的方式上。 StringUtils.isEmpty(String str): 这个方法会返回true当字符串为null或者长度为0时。也就是说&#xf…

自动化测试和性能测试面试题精选(含答案)

前言 今天分享软件测试工程师常见的面试题&#xff0c;主要来源于个人面试遇到的、网络搜集&#xff08;完善&#xff09;、工作日常讨论等&#xff0c;分为以下十个部分&#xff0c;供大家参考。如有错误的地方&#xff0c;欢迎指正。有更多的面试题或面试中遇到的坑&#xf…

javacv-ffmpeg ProcessBuilder实现对图片的旋转

javacv-ffmpeg ProcessBuilder实现对图片的旋转&#xff0c;最近需要处理很多图片&#xff0c;量有点多&#xff0c;所以不能一个一个去编辑旋转图片&#xff0c;所以写一个工具类&#xff0c;实现对图片的旋转 maven配置文件&#xff0c;加上对ffmpeg的依赖&#xff0c;由于f…

读论文《SHOW-O》8.22发布的贼强的大模型多模态理解和生成解决方案

全名&#xff1a;Show-o: One Single Transformer to Unify Multimodal Understanding and Generation 8月22发表的&#xff0c;一个名为Show-o的统一变换器&#xff08;transformer&#xff09; 论文地址&#xff1a;2408.12528v2 (arxiv.org) 项目地址&#xff1a;GitHub …

开放式耳机有哪些优点?开放式耳机推荐

开放式耳机&#xff0c;相较于封闭式耳机&#xff0c;以其独特的声学设计和佩戴体验&#xff0c;为用户带来了更加自然流畅的听觉享受。以下是开放式耳机几个显著优点&#xff1a; 宽广的音场与深度&#xff1a;开放式耳机最大的魅力之一在于它们能够模拟出更加宽广和深邃的音场…

P1533 可怜的狗狗

*原题链接* 题意&#xff1a;m次询问区间[l,r]中第k大的数&#xff0c;各询问区间互不相交。 这道题的解法可谓是八仙过海&#xff0c;而我看到询问区间[l,r]中第k大的数&#xff0c;直接就想到了权值线段树(本蒟蒻不会更高级的数据结构了)&#xff0c;权值线段树维护区间中数…

Python编写BC260Y TCP数据收发压力测试脚本

Python编写BC260Y TCP数据收发压力测试脚本 使用BC260Y的TCP AT命令发送数据时&#xff0c;能够在数据中带有’\r\n’&#xff08;回车换行&#xff09;&#xff0c;而其他模组会将’\r\n’当做AT命令处理的结束符&#xff0c;例如EC800E&#xff0c;为了验证TCP数据中带有’\r…