安装
pip install infercnvpy
import scanpy as scimport infercnvpy as cnvimport matplotlib.pyplot as plt
sc.settings.set_figure_params(figsize=(5, 5))
infercnvpy.io.genomic_position_from_gtf()
function to read these information from a GTF file and add them to adata.var.adata = cnv.datasets.maynard2020_3k()adata.var.loc[:, ["ensg", "chromosome", "start", "end"]].head()
sc.pl.umap(adata, color="cell_type")
现在运行 infercnvpy.tl.infercnv()。本质上,该方法通过染色体和基因组位置对基因进行分类,并将基因组区域的平均基因表达与参考进行比较。原始的 inferCNV 方法使用上下游50个基因作为窗口,但更大的窗口大小可能有意义,具体取决于数据集中的基因数量。
infercnv()
adds a cell x genomic_region matrix to adata.obsm[“X_cnv”].
# We provide all immune cell types as "normal cells".cnv.tl.infercnv( adata, reference_key="cell_type", reference_cat=[ "B cell", "Macrophage", "Mast cell", "Monocyte", "NK cell", "Plasma cell", "T cell CD4", "T cell CD8", "T cell regulatory", "mDC", "pDC", ], window_size=250,)
现在,可以按细胞类型和染色体绘制平滑的基因表达。 可以观察到主要由肿瘤细胞组成的上皮细胞cluster似乎受到拷贝数变化的影响。
cnv.pl.chromosome_heatmap(adata, groupby="cell_type")
Clustering by CNV profiles and identifying tumor cells
为了对细胞进行聚类和注释,infercnvpy 结合了 scanpy 工作流程。以下函数与它们的 scanpy 对应函数完全一样,除了使用 CNV 分析矩阵作为输入。使用这些函数,可以执行基于图形的聚类并根据CNV分析矩阵生成 UMAP 图。基于这些聚类,可以注释肿瘤和正常细胞。
cnv.tl.pca(adata)cnv.pp.neighbors(adata)cnv.tl.leiden(adata)
运行 leiden 聚类后,可以通过 CNV 聚类绘制染色体热图。可以观察到,与底部的clusters相反,顶部的clusters基本上没有差异表达的基因组区域。差异表达的区域可能是由于拷贝数变异,并且各自的clusters可能代表肿瘤细胞。
cnv.pl.chromosome_heatmap(adata, groupby="cnv_leiden", dendrogram=True)
我们可以将相同的clusters可视化为UMAP图。此外,infercnvpy.tl.cnv_score() 计算一个汇总分数,量化每个cluster的拷贝数变异量。它被简单地定义为每个cluster的 CNV 矩阵的绝对值的平均值。
cnv.tl.umap(adata)cnv.tl.cnv_score(adata)
UMAP 图由一大团“正常”细胞和几个具有不同 CNV 分布的较小cluster组成。除了由纤毛细胞组成的cluster“12”外,孤立的cluster都是上皮细胞。这些可能是肿瘤细胞,每个cluster代表一个单独的亚克隆。
fig, ((ax1, ax2), (ax3, ax4)) = plt.subplots(2, 2, figsize=(11, 11))ax4.axis("off")cnv.pl.umap( adata, color="cnv_leiden", legend_loc="on data", legend_fontoutline=2, ax=ax1, show=False,)cnv.pl.umap(adata, color="cnv_score", ax=ax2, show=False)cnv.pl.umap(adata, color="cell_type", ax=ax3)
还可以在基于转录组学的 UMAP 图上可视化 CNV 分数和cluster。同样,可以看到存在属于不同 CNV cluster的上皮细胞subcluster,并且这些cluster往往具有最高的 CNV 分数。
fig, ((ax1, ax2), (ax3, ax4)) = plt.subplots( 2, 2, figsize=(12, 11), gridspec_kw=dict(wspace=0.5))ax4.axis("off")sc.pl.umap(adata, color="cnv_leiden", ax=ax1, show=False)sc.pl.umap(adata, color="cnv_score", ax=ax2, show=False)sc.pl.umap(adata, color="cell_type", ax=ax3)
基于这些观察,现在可以将细胞分配给“肿瘤”或“正常”。为此,在 adata.obs 中添加一个新列 cnv_status。
adata.obs["cnv_status"] = "normal"adata.obs.loc[ adata.obs["cnv_leiden"].isin(["10", "13", "15", "5", "11", "16", "12"]), "cnv_status"] = "tumor"fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 5), gridspec_kw=dict(wspace=0.5))cnv.pl.umap(adata, color="cnv_status", ax=ax1, show=False)sc.pl.umap(adata, color="cnv_status", ax=ax2)
cnv.pl.chromosome_heatmap(adata[adata.obs["cnv_status"] == "tumor", :])
本质上,这个包是 infercnv 的 Python 重新实现。通过使用 numpy、scipy 和稀疏矩阵,它的计算效率要高得多。
1、从所有细胞中减去参考基因表达。由于数据在对数空间中,这有效地计算了对数倍数变化。如果有多个类别的引用可用(即为 reference_cat 指定了多个细胞类型),则log fold change是“bounded”:
生活很好,有你更好
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。