5.基于python的scRNA-seq细胞状态分析-细胞组成

参考:

[1] https://github.com/Starlitnightly/single_cell_tutorial

[2] https://github.com/theislab/single-cell-best-practices

目录

背景

差异基因分析是研究特定条件导致的基因表达变化,在分析管道中,我们还会关注细胞组成(细胞类型的比例)在特定条件下的变化。例如药物的干预会导致细胞组成发生变化。

这里我们使用Haber数据集子集,完整数据集包含来自小鼠小肠以及类器官的53,193个单个上皮细胞。一些细胞还受到细菌或蠕虫感染。子集仅包括被指定细菌----沙门氏菌和Heligmosomoides polygyrus的受感染和对照细胞:

python 复制代码
import omicverse as ov
import scanpy as sc

adata=ov.read('./data/haber_count.h5ad')
print(adata)
"""
AnnData object with n_obs × n_vars = 9842 × 15215
    obs: 'batch', 'barcode', 'condition', 'cell_label'
"""
print(adata.obs['condition'].cat.categories)
"""
Index(['Control', 'Hpoly.Day3', 'Hpoly.Day10', 'Salmonella'], dtype='object')
"""
print(adata.X.max())
"""
4385.0
"""

数据有10 个批次。条件是对照组(Control)、沙门氏菌(Salmonella)、肠道寄生线虫感染3天(Hpoly.Day3)和肠道寄生线虫感染10天(Hpoly.Day10)。cell_label存放了细胞类型。

组成差异

在分析单细胞数据中的细胞比例的时候,通常是描述细胞在不同分组中的占比来进行叙述的,在一般的分析教程中,例如药物治疗后,某类T细胞的比例上升。但是,这类T细胞真的上升了吗?这是一个值得思考的问题。看下面这个例子,在一项癌症研究中,想要比较健康器官和患病器官的细胞类型组成,假设在这种器官中存在三类细胞A,B,C。其中,健康器官中,三类细胞的细胞数量相同,都是2000个,患病器官中,A类细胞变成4000个,但是B和C还是2000个:

患病后显而易见,A类细胞翻倍变化了,但在实际测量中,技术有通量限制,测序仪单次通过的细胞在5000-6000之间,因此,每个病人器官所获得的细胞总数是有限的,我们会用所测序的细胞来作为这个"病人器官"的代表。

因此,前面的A、B、C三类细胞,我们并不能获得6000和8000个细胞,假设测序仪的限制为600,因此我们只能从中随机获得600个细胞。我们采用随机抽样模拟这一过程:

可以直观感受到,虽然A类细胞的比例依然最大,但是B和C类细胞在病人器官中出现了下降情况,但真实情况是,B和C在病人和健康人中的比例是不变的。

这一小节的例子是为了告诉我们,我们不能直接统计数据来分析细胞组成,这样得到的结果是有偏差的,所以应该使用专业的细胞组成分析方法。

基于已有的标记-scCODA

scCODA通过预定义的细胞类型来统计得到细胞的成分变化:

python 复制代码
sccoda_model = pt.tl.Sccoda()
sccoda_data = sccoda_model.load(
    adata,
    type="cell_level",
    generate_sample_level=True,
    cell_type_identifier="cell_label",
    sample_identifier="batch",
    covariate_obs=["condition"],
)
print(sccoda_data)

为了进一步概述不同条件下的细胞类型分布,我们使用boxplot来可视化:

python 复制代码
import seaborn as sns
import matplotlib.pyplot as plt

pt.pl.coda.boxplots(
    sccoda_data,
    modality_key="coda",
    feature_name="condition",
    figsize=(12, 5),
    add_dots=True,
    # args_swarmplot={"palette": ["red"]},
)
plt.show()

箱线图突出显示了细胞类型分布的差异,除了通过箱线图,也可以通过堆叠柱状图来可视化细胞类型的比例变化:

python 复制代码
pt.pl.coda.stacked_barplot(
    sccoda_data, modality_key="coda", feature_name="condition", figsize=(2, 2)
)
plt.xticks(fontsize=10)
plt.yticks(fontsize=10)
plt.ylabel('Prop',fontsize=11)
plt.legend(bbox_to_anchor=(1.05,1),fontsize=10)
plt.show()

选择一个几乎恒定的细胞作为参考细胞,比如上图的内分泌细胞(Endocrine)在4种类型中的变化很小,即具有几乎恒定的相对丰度,选择该类型,然后训练scCODA:

python 复制代码
sccoda_data = sccoda_model.prepare(
    sccoda_data,
    modality_key="coda",
    formula="condition",
    reference_cell_type="Endocrine",
)
sccoda_model.run_nuts(sccoda_data, modality_key="coda", rng_key=112)

sccoda_model.set_fdr(sccoda_data, 0.4)

sccoda_model.credible_effects(sccoda_data, modality_key="coda")

pt.pl.coda.effects_barplot(sccoda_data, modality_key="coda", 
                           covariates="condition")
plt.show()

该图为条件对细胞类型的显著且可信的影响,这些结果与现有发现吻合:

  • 感染沙门氏菌后,成熟肠上皮细胞(Entercyte)的频率大幅增加
  • 蠕虫感染后将导致杯状细胞(Goblet)和簇状细胞(Tuft)丰度增加

基于层次结构-TAscCODA

除了每种细胞类型的丰度之外,典型的单细胞数据集还以基于树的分层排序的形式包含有关不同细胞相似性的信息。这些层次结构可以通过基因表达的聚类(通常用于发现属于同一细胞类型的细胞簇)自动确定,也可以通过生物信息层次结构(如细胞谱系)自动确定。 TAscCODA是 scCODA 的扩展,它将分层信息和实验协变量集成。这对于高分辨率的细胞图谱工作特别有益。

下面就不再演示,TAscCODA的结果会更加合理,具体操作参考:https://single-cell-tutorial.readthedocs.io/zh/latest/stages/4-2/

相关推荐
傻啦嘿哟5 分钟前
如何使用 Python 开发一个简单的文本数据转换为 Excel 工具
开发语言·python·excel
B站计算机毕业设计超人12 分钟前
计算机毕业设计SparkStreaming+Kafka旅游推荐系统 旅游景点客流量预测 旅游可视化 旅游大数据 Hive数据仓库 机器学习 深度学习
大数据·数据仓库·hadoop·python·kafka·课程设计·数据可视化
IT古董36 分钟前
【人工智能】Python在机器学习与人工智能中的应用
开发语言·人工智能·python·机器学习
湫ccc1 小时前
《Python基础》之pip换国内镜像源
开发语言·python·pip
hakesashou1 小时前
Python中常用的函数介绍
java·网络·python
菜鸟的人工智能之路1 小时前
极坐标气泡图:医学数据分析的可视化新视角
python·数据分析·健康医疗
菜鸟学Python1 小时前
Python 数据分析核心库大全!
开发语言·python·数据挖掘·数据分析
小白不太白9501 小时前
设计模式之 责任链模式
python·设计模式·责任链模式
喜欢猪猪1 小时前
Django:从入门到精通
后端·python·django
糖豆豆今天也要努力鸭1 小时前
torch.__version__的torch版本和conda list的torch版本不一致
linux·pytorch·python·深度学习·conda·torch