参考:
[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/