CellphoneDB 方法 3(差异表达)

2024-06-26  本文已影响0人  可能性之兽

在这个示例中,我们使用方法 3 (degs_analysis_method) 来研究在滋养层细胞 (Trophoblast) 分化和侵入母体子宫过程中,血管周细胞 (PVs) 和滋养层细胞之间的细胞-细胞相互作用如何变化。此方法将检索至少有一个参与相互作用的基因(参与相互作用的基因)差异表达的相互作用。

差异表达的基因应该由用户预先计算,使用他们首选的方法(例如,Limma、DEseq2、Seurat、TradeSeq 等),并将显著结果以预定义的表格格式传递给 CellphoneDB。

此笔记本假设您已经知道如何下载 CellphoneDB 数据库或创建自己的数据库。如果不是这种情况,请查看 T0_BuildDBfromFiles.ipynbT0_BuildDBfromRelease.ipynb。在此笔记本中,我们将解释如何运行 CellphoneDB 的差异表达方法

检查 Python 版本

import pandas as pd
import sys
import os

pd.set_option('display.max_columns', 100)
# 定义分析的基本目录
os.chdir('/home/jovyan/cpdb_tutorial')
# 检查环境是否包含 CellphoneDB 要求的 Python >= 3.8
print(sys.version)

安装 CellphoneDB

在当前 conda 环境中安装 CellphoneDB 的最新版本。
如果您想查看详细的安装过程,请移除 --quiet 标志。

pip install --quiet cellphonedb


输入文件

差异表达方法接受 6 个输入文件(其中 4 个是必需的)。

degs_file_pathmicroenvs_file_path 的内容将根据研究者想要回答的生物学问题而定。

这个例子中,我们研究了随着滋养层细胞分化和侵入母体子宫过程中,血管周细胞 (PVs) 和滋养层细胞之间的细胞-细胞相互作用如何变化。因此,degs_file_path 只包含沿着滋养层分化谱系差异表达的基因,因为我们对那些在此分化过程中变化的细胞-细胞通信过程感兴趣。microenvs_file_path 只包含在胎盘特定解剖区域(即在同一时空邻域中的 PVs 和滋养层细胞状态)存在的细胞。meta_file_pathcounts_file_path 包含了我们感兴趣的所有 PVs 和滋养层细胞。

CellphoneDB 将检索在 PVs 和滋养层细胞之间发生的所有相互作用,其中:(i) 所有蛋白质在相应的细胞类型中表达,并且 (ii) 至少有一个基因由滋养层细胞差异表达。

cpdb_file_path = 'db/v5/cellphonedb.zip'
meta_file_path = 'data/metadata.tsv'
counts_file_path = 'data/normalised_log_counts.h5ad'
microenvs_file_path = 'data/microenvironment.tsv'
degs_file_path = 'data/DEGs_inv_trophoblast.tsv'
active_tf_path = 'data/active_TFs.tsv'
out_path = 'results/method3_withScore'

检查输入文件

1) 元数据文件由两列组成:

metadata = pd.read_csv(meta_file_path, sep='\t')
metadata.head(3)

2) 计数文件是来自 scanpy 的 h5ad 对象。此对象的维度和顺序必须与元数据文件的维度一致,即两个文件中的细胞数量必须相同。

import anndata

adata = anndata.read_h5ad(counts_file_path)
adata.shape

# 检查元数据和计数文件中的条形码是否一致
list(adata.obs.index).sort() == list(metadata['barcode_sample']).sort()

3) 差异表达基因文件是一个两列文件,指示在某个细胞类型中上调(或特定)的基因。第一列对应于集群名称(这些名称与元数据文件中的名称匹配),第二列是上调基因。其余列被 CellphoneDB 忽略。此文件中存在的所有基因都会被考虑,因此用户必须在此文件中仅提供那些被认为上调或对分析重要的基因。

pd.read_csv(degs_file_path, sep='\t').head(3)

4) 微环境定义了属于特定微环境的细胞类型。CellphoneDB 仅计算属于给定微环境的细胞之间的相互作用。在此文件中,我们仅定义了一个微环境。

microenv = pd.read_csv(microenvs_file_path, sep='\t')
microenv.head(3)

# 显示按微环境分组的细胞
microenv.groupby('microenvironment')['cell_type'].apply(lambda x: list(x.value_counts().index))

5) 活跃转录因子定义了在特定细胞类型中活跃的转录因子。

pd.read_csv(active_tf_path, sep='\t').head(3)

使用差异分析方法运行 CellphoneDB(方法 3)

此方法的输出将保存到 output_path,并分配到预定义的变量中。

from cellphonedb.src.core.methods import cpdb_degs_analysis_method

cpdb_results = cpdb_degs_analysis_method.call(
    cpdb_file_path=cpdb_file_path,                            # 必需:CellphoneDB 数据库 zip 文件。
    meta_file_path=meta_file_path,                            # 必需:定义条形码到细胞标签的 tsv 文件。
    counts_file_path=counts_file_path,                        # 必需:标准化计数矩阵 - 计数文件的路径或内存中的 AnnData 对象。
    degs_file_path=degs_file_path,                            # 必需:包含 DEG 的 tsv 文件。
    counts_data='hgnc_symbol',                                # 定义计数矩阵中的基因注释。
    active_tfs_file_path=active_tf_path,                      # 可选:定义细胞类型及其活跃的 TFs。
    microenvs_file_path=microenvs_file_path,                  # 可选(默认:无):定义每个微环境中的细胞。
    score_interactions=True,                                  # 可选:是否对相互作用进行评分。
    threshold=0.1,                                            # 定义用于分析的基因在细胞中表达的最小百分比。
    result_precision=3,                                       # 设置 significant_means 中均值值的舍入。
    separator='|',                                            # 设置用于在结果数据框中分隔细胞的字符串 "cellA|CellB"。
    debug=False,                                              # 以 pkl 格式保存分析过程中使用的所有中间表。
    output_path=out_path,                                     # 保存结果的路径
    output_suffix=None,                                       # 替换输出文件中的时间戳为用户定义的字符串(默认:无)
    threads=25
)

结果保存为文件,并作为字典保存在 cpdb_results 变量中。

list(cpdb_results.keys())

输出文件描述

大多数输出文件共享常见列:

相关相互作用字段:

cpdb_results['relevant_interactions'].head(2)

显著均值字段:

cpdb_results['significant_means'].head(2)

均值字段:

cpdb_results['means'].head(2)

去卷积字段:

cpdb_results['deconvoluted'].head(2)

相互作用评分字段:

cpdb_results['interaction_scores'].head(2)

CellSign字段:

cpdb_results['CellSign_active_interactions'].head(2)

探索 CellphoneDB 结果

此模块允许通过指定:细胞类型对、基因或特定相互作用来筛选 CellphoneDB 结果。

我们可以指定两个细胞类型列表 (query_cell_type_1query_cell_type_2),该方法将对每个列表中定义的细胞类型进行成对比较,并将相互作用子集化为这些细胞对。如果我们有兴趣筛选在给定细胞与数据集中所有其他细胞之间发生的相互作用,我们可以定义 query_cell_type_1 = 'All'query_cell_type_2 = ['cellA', 'cellB', ...]。参数 genes 允许用户筛选基因参与的相互作用,用户还可以根据相互作用名称 query_interactions 定义特定相互作用。

这个例子中,我们将筛选一部分滋养层细胞与 PV 细胞相互作用的结果,此外,我们还将选择基因 TGFBR1 参与的相互作用以及名为 CSF1_CSF1R 的特定相互作用。

此方法筛选显著均值文件的行和列;NaN 值对应于未发现显著的相互作用对,non-NaN 值对应于发现显著的相互作用对。

from cellphonedb.utils import search_utils

search_results = search_utils.search_analysis_results(
    query_cell_types_1=['EVT_1', 'EVT_2', 'GC', 'eEVT', 'iEVT'],  # 细胞列表 1,将与细胞列表 2 配对(列表或 'All')。
    query_cell_types_2=['PV MMP11', 'PV MYH11', 'PV STEAP4'],     # 细胞列表 2,将与细胞列表 1 配对(列表或 'All')。
    query_genes=['TGFBR1'],                                       # 基于参与的基因筛选相互作用(列表)。
    query_interactions=['CSF1_CSF1R'],                            # 基于相互作用名称筛选相互作用(列表)。
    significant_means=cpdb_results['significant_means'],          # CellphoneDB 生成的 significant_means 文件。
    deconvoluted=cpdb_results['deconvoluted'],                    # CellphoneDB 生成的 deconvoluted 文件。
    separator='|',                                                # 用于拆分细胞的分隔符(默认:|)。
    long_format=True,                                             # 将输出转换为宽表格,移除非显著相互作用。
    query_classifications=['Signaling by Transforming growth factor']
)

search_results.head(3)

基本分析和绘图

在本节中,我们将对 CellphoneDB 返回的结果进行基本分析和绘图。用户熟悉数据的生物学背景对于从 CellphoneDB 结果中获得有意义的结果至关重要。

细胞-细胞相互作用数据可以通过多种方式绘制;描述细胞对之间相关相互作用数量的弦图/热图或点图,表示特定伙伴和相互作用细胞等。在本节中,我们选择点图,因为这些提供了相互作用和相互作用者的详细信息。

首先,我们将 relevant_interactionsmeans 的结果转换为长表格,因为这更方便工作,并且是大多数绘图库的输入格式。

# 获取注释列和相互作用
annotation = list(cpdb_results['relevant_interactions'].columns[:13])
interaction = list(cpdb_results['relevant_interactions'].columns[13:])

# 将 relevant_interactions 文件从宽表格转换为长表格
relevant_interactions_long = pd.melt(cpdb_results['relevant_interactions'],
                                     id_vars=annotation,
                                     var_name='Interacting_cell',
                                     value_vars=interaction,
                                     value_name='Relevance')

relevant_interactions_long[['Cell_a', 'Cell_b']] = relevant_interactions_long['Interacting_cell'] \
    .str.split('|', expand=True) \
    .rename(columns={0: 'Cell_a', 1: 'Cell_b'})

relevant_interactions_long.head(3)
# 将 means 文件从宽表格转换为长表格
means_long = pd.melt(cpdb_results['means'],
                     id_vars=annotation,
                     var_name='Interacting_cell',
                     value_vars=interaction,
                     value_name='Mean')

means_long.head(3)

按复发排序相互作用

为了方便选择感兴趣的相互作用,我们将计算每个相互作用的复发(即在所有相互作用伙伴中相互作用出现的次数)。在这里,我们假设我们对特定的相互作用感兴趣(即在有限数量的细胞之间发现的相互作用)。此表格与先前知识、其他数据集(如 visium、成像等)的验证一起,可以选择/验证最相关的相互作用。

# 创建一个字典,用于记录任何给定相互作用的复发
id_cp_dict = relevant_interactions_long.groupby('id_cp_interaction')['Relevance'].sum().to_dict()

# 添加新列以指示相互作用的复发
relevant_interactions_long['Recurrence'] = relevant_interactions_long['id_cp_interaction'].map(id_cp_dict)

# 按复发排序
relevant_interactions_long = relevant_interactions_long.sort_values(['Recurrence'], ascending=True)

relevant_inter

relevant_interactions_long.head(3)

基于我们自己的知识和与实验数据的验证,我们选择了一组相互作用,其 ID 如下。

interactions_to_plot = ['CPI-SC0F36DD437', 'CPI-SC06C3BA86F', 'CPI-SS0AB1F04A0', 'CPI-SC051FC855D', 'CPI-SC0DABCC4B5']

idx = [id in interactions_to_plot for id in relevant_interactions_long['id_cp_interaction']]
relevant_interactions_plot = relevant_interactions_long[idx].copy()

现在我们从之前转换为长格式的 means 表中添加相互作用伙伴的平均表达值。由于不同相互作用伙伴的平均值不能直接与其他相互作用伙伴的值进行比较,我们建议在每个相互作用内进行归一化。在这种情况下,我们应用 z 评分归一化。

from scipy.stats import zscore

# 添加相互作用伙伴的平均值
relevant_interactions_plot = relevant_interactions_plot.merge(means_long[['id_cp_interaction', 'Interacting_cell', 'Mean']],
                                                              on=['id_cp_interaction', 'Interacting_cell'],
                                                              how='inner')

在应用 z 评分归一化之前,我们将移除两个相互作用伙伴都是滋养层的相互作用。

import itertools

list_trophoblast = ['EVT_1', 'EVT_2', 'GC', 'VCT_CCC', 'eEVT', 'iEVT']
interact_rm = ['|'.join(i) for i in itertools.product(list_trophoblast, repeat=2)]

# 保留的相互作用
idx_keep = [i not in interact_rm for i in relevant_interactions_plot['Interacting_cell']]
relevant_interactions_plot = relevant_interactions_plot[idx_keep]

# 在相互作用内进行归一化
relevant_interactions_plot['Mean_scaled'] = relevant_interactions_plot.groupby('id_cp_interaction', group_keys=False)['Mean'].transform(lambda x: zscore(x, ddof=1))
relevant_interactions_plot = relevant_interactions_plot.sort_values('Interacting_cell')

relevant_interactions_plot.head(3)

绘制所选候选相互作用的点图

import seaborn as sns

g = sns.relplot(
    data=relevant_interactions_plot,
    x="Interacting_cell",
    y="interacting_pair",
    hue="Relevance",
    size="Mean_scaled",
    palette="vlag",
    hue_norm=(-1, 1),
    height=4,
    aspect=3,
    sizes=(0, 200)
)
g.set_xticklabels(rotation=90)

或者,我们可以使用 Kelvin 的实现(kt-plots tutorial)来显示 CellphoneDB 的输出。在这个示例中,我们将绘制由 TGFB2 和 CSF1R 介导的 PVs 和滋养层细胞之间的相互作用。

import os
import anndata as ad
import pandas as pd
import ktplotspy as kpy
import matplotlib.pyplot as plt
%matplotlib inline

kpy.plot_cpdb_heatmap(pvals=cpdb_results['relevant_interactions'],
                      degs_analysis=True,
                      figsize=(5, 5),
                      title="Sum of significant interactions")

kpy.plot_cpdb(
    adata=adata,
    cell_type1="PV MYH11|PV STEAP4|PV MMPP11",
    cell_type2="EVT_1|EVT_2|GC|iEVT|eEVT|VCT_CCC", 
    means=cpdb_results['means'],
    pvals=cpdb_results['relevant_interactions'],
    celltype_key="cell_labels",
    genes=["TGFB2", "CSF1R"],
    figsize=(11,4),
    title="Interactions between PV and trophoblast",
    max_size=5,
    highlight_size=0.75,
    degs_analysis=True,
    standard_scale=True,
    interaction_scores=cpdb_results['interaction_scores'],
    scale_alpha_by_interaction_scores=True,
)

绘制考虑了 CellSign 结果(受体下游的活跃 TFs)的相互作用。

kpy.plot_cpdb(
    adata=adata,
    cell_type1="PV MYH11",
    cell_type2="EVT_1|EVT_2|GC|iEVT|eEVT|VCT_CCC",
    means=cpdb_results['means'],
    pvals=cpdb_results['relevant_interactions'],
    celltype_key="cell_labels",
    figsize=(9, 4),
    title="Interactions between\nPV and trophoblast with\ndownstream significance",
    max_size=6,
    highlight_size=0.75,
    degs_analysis=True,
    standard_scale=True,
    cellsign=cpdb_results['CellSign_active_interactions'],
    filter_by_cellsign=True,
    scale_alpha_by_cellsign=True
)

相互作用也可以按通路分组绘制。

from plotnine import facet_wrap

p = kpy.plot_cpdb(
    adata=adata,
    cell_type1="PV MYH11",
    cell_type2="EVT_1|EVT_2|GC|iEVT|eEVT|VCT_CCC",
    means=cpdb_results['means'],
    pvals=cpdb_results['relevant_interactions'],
    celltype_key="cell_labels",
    genes=["TGFB2", "CSF1R", "COL1A1"],
    figsize=(12, 8),
    title="Interactions between PV and trophoblasts\n grouped by classification",
    max_size=6,
    highlight_size=0.75,
    degs_analysis=True,
    standard_scale=True
)

p + facet_wrap("~ classification", ncol=1)
上一篇 下一篇

猜你喜欢

热点阅读