实验记录13: scanpy细胞分化轨迹推断大型真香现场

与上次翻车实验的不同:
  1. 过滤了更多的细胞和基因。在处理数据时,低质量的细胞一定要清除掉,告诫大家宁缺毋滥。。。否则后续分析真的是一堆的噪点。
  2. 跳过了scanpy中的降噪步骤。scanpy的降噪算法做的真不咋地,一个好图降噪之后更加混乱了。这个故事告诉我们一个道理:不要迷信作者说的话!!!

对翻车实验感兴趣的话:https://www.jianshu.com/p/e688646a451b


什么是轨迹推断/伪时间分析?

轨迹推断对应英文是trajectory inference,伪时间分析对应英文是pseudotime analysis。其实它们做的是同一件事。

在单细胞转录组测序完成的时候,无论是细胞在发育、分化还是凋亡的过程中,它们的生命活动已经在这一时刻静止了,因此我们可以将这些测序数据看作是这一个时刻细胞呈现的表达状态的瞬时截图。

而轨迹推断/伪时间分析则构建了一个细胞发育和分化的模型。这一个瞬时截图内的细胞在各种各样不同的发育状态,有的发育早,有的发育晚,有的分化了,有的未分化,甚至有的处于中间态。而决定细胞分化往往就是基因表达的变化。

轨迹推断利用各类细胞基因表达的连续性建立了一个“分化轨迹”,再将这些细胞投射到这个“分化轨迹”上。如此一来,这个静态的截图就呈现出了动态的过程。


PS:细胞类型分类真是一场艰苦卓绝的战斗!!!一入文献深似海!!!!


0. 数据预处理

先加载需要的包:

import numpy as np
import pandas as pd
import matplotlib.pyplot as pl
from matplotlib import rcParams
import scanpy as sc

sc.settings.verbosity = 3  # verbosity: errors (0), warnings (1), info (2), hints (3)
sc.logging.print_versions()

版本信息:

scanpy==1.4 anndata==0.6.19 numpy==1.14.5 scipy==1.1.0 pandas==0.23.4 scikit-learn==0.19.2 statsmodels==0.9.0 python-igraph==0.7.1 louvain==0.6.1 

读取数据(数据来源详见https://www.jianshu.com/p/b190efae4d31)
这个数据是利用scanpy进行聚类后的对象。

adata = sc.read_h5ad("/data1/zll/project/deepBase3/HCA/bone_marrow/scanpy/3_29_PC16_filterMore/umap_tsne_3_29.h5ad")

预处理数据,计算距离并可视化。

sc.tl.draw_graph(adata)
sc.pl.draw_graph(adata, color='louvain', legend_loc='on data',title = "")
实验记录13: scanpy细胞分化轨迹推断大型真香现场_第1张图片
output_4_0.png

1. Partition-based Graph Abstraction(PAGA)

这是一种基于空间划分的抽提细胞分化“骨架”的一种算法,用于显示细胞的分化轨迹,得到哪些cluster之间的关系更接近。

sc.tl.paga(adata, groups='louvain')
sc.pl.paga(adata, color=['louvain'],title = "")
实验记录13: scanpy细胞分化轨迹推断大型真香现场_第2张图片
output_13_1.png

AVP是造血干细胞表达的一个基因,给这个基因上色,我们可以看到基本上都富集在了cluster13的位置。那么有很大可能这个cluster就是造血干细胞。

sc.pl.paga(adata, color=['AVP'])
实验记录13: scanpy细胞分化轨迹推断大型真香现场_第3张图片
output_15_1.png

2.注释细胞类型

上面的每个cluster都是用数字编号代替,为了能更清楚地知道这些细胞之间的关系,将细胞类型的信息注释上去。细胞类型的确定主要利用了marker基因以及现有的文献和资料,是一个非常复杂的过程。总之在与文献的一番斗争之后,找到了以下这些骨髓的细胞类型(仅供参考):

Cluster Cell Type Marker Gene
0 naive T cell CD3E, CD3D, RPS29
1 B cell MS4A1, CD79A
2 naive T cell RPL34,RPS6
3 CD8+ T cell CCL5, GZMK, IL32
4 Neutrophil S100A8, S100A9,VCAN
5 naive T cell RPL32,RPL13
6 Neutrophil FTL, S100A8, S100A9
7 NK cell PRF1, NKG7, KLRB1, KLRD1
8 Eosinophil LYZ, LGALS1,MT-CO3
9 CD8+ T cell GZMK, CD3D, CD8A, NKG7
10 Eosinophil MT-CO2, MT-CYB,MT-CO3
11 CD34+ pre-B CD79B, VPREB3
12 Nuceated Red blood cell(Erythroblast) HBB, HBA1,AHSP
13 CD34+ CMP,CD34+ HSC,Early-ERP HNRNPA1, BTF3,GNB2L1,NPM1
14 Monocyte FCGR3A, LST1, AIF1
15 Plasma Cell MZB1, SSR4, FKBP11
16 pre-dendritic cell CST3, HLA-DPA1,FCER1A
17 dendritic cell ITM2C, SEC61B,JCHAIN
18 Platelet PF4, PPBP, GP9
19 pro-B cell HMGB1, IGLL1,STMN1
20 Stromal cell AOX1, SEPP1
21 Eosinophil MT-CO2, MT-ND3,MT-CO3,
22 B cell , NK cell (mixture,not sure) CD74,CD79A, NKG7, GZMH
23 pro-B STMN1, TUBA1B

下面进行注释:

adata.obs['louvain'].cat.categories

返回共有24个cluster:

   Index(['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12',
           '13', '14', '15', '16', '17', '18', '19', '20', '21', '22', '23'],
          dtype='object')

将编号所对应的细胞类型注释上去:

adata.obs['louvain_anno'] = adata.obs['louvain']
# annote them with names
adata.obs['louvain_anno'].cat.categories = ['0/nT', '1/B', '2nT', '3/CD8+T',
                                            '4/Neu', '5/nT', '6/Neu', '7/NK',
                                            '8/Eos', '9/CD8+T', '10/Eos', '11/pre-B',
                                            '12/NRBC','13/HSC', '14/Mon', '15/plasma', 
                                            '16/preDC', '17/DC', '18/plt', '19/pro-B', 
                                            '20/strom','21/Eos','22/','23/pro-B']

3. 计算 PAGA并可视化

sc.tl.paga(adata, groups='louvain_anno')
sc.pl.paga(adata, threshold=0.03)
实验记录13: scanpy细胞分化轨迹推断大型真香现场_第4张图片
output_23_1.png

于是就得到了这样像“骨架”一样的结果。这个图显示的就是细胞与细胞之间的关系,距离越近表示关系越接近。

4. 利用PAGA重新计算细胞之间的距离

还记得我们第0步计算的距离吗?现在我们要将细胞在PAGA这个“骨架”上重现出来,就利用PAGA的计算结果,把细胞放上去。

sc.tl.draw_graph(adata, init_pos='paga')
sc.pl.draw_graph(adata, color=['louvain_anno'], legend_loc='right margin')
实验记录13: scanpy细胞分化轨迹推断大型真香现场_第5张图片
output_27_0.png

5.(可选)美化图片

Choose the colors of the clusters a bit more consistently.

pl.figure(figsize=(8, 2))
for i in range(28):
    pl.scatter(i, 1, c=sc.pl.palettes.zeileis_26[i], s=200)
pl.show()
实验记录13: scanpy细胞分化轨迹推断大型真香现场_第6张图片
output_30_0.png
zeileis_colors = np.array(sc.pl.palettes.zeileis_26)
new_colors = np.array(adata.uns['louvain_anno_colors'])
new_colors[[13]] = zeileis_colors[[17]]  # Stem colors / yellow
new_colors[[12]] = zeileis_colors[[5]]  # Ery colors / red
new_colors[[4,6]] = zeileis_colors[[12,12]] # Neutrophil / green
new_colors[[8,10]] = zeileis_colors[[11,11]] # Eosinophil / light red
new_colors[[14]] = zeileis_colors[[19]] # monocyte / light green
new_colors[[16,17]] = zeileis_colors[[18,26]]  # DC / yellow
new_colors[[0,2,3,5,9]] = zeileis_colors[[7,7,6,7,6]]  # naive T & CD8+T / light blue
new_colors[[7]] = zeileis_colors[[0]]  # NK cell / dark blue
new_colors[[1,11,19,23]] = zeileis_colors[[23,22,9,9]]  # B cell / pink

new_colors[[22]] = zeileis_colors[[25]]  # Not known / grey
new_colors[[15]] = zeileis_colors[[3]] #plasma cell / blue grey
new_colors[[18]] = zeileis_colors[[4]] #platelet / pink grey
adata.uns['louvain_anno_colors'] = new_colors

And add some white space to some cluster names.

sc.pl.paga_compare(
    adata, threshold=0.03, title='', right_margin=0.2, size=10, edge_width_scale=0.5,
    legend_fontsize=12, fontsize=12, frameon=False, edges=True, save=True)
--> added 'pos', the PAGA positions (adata.uns['paga'])
saving figure to file ./figures/paga_compare.pdf
实验记录13: scanpy细胞分化轨迹推断大型真香现场_第7张图片
output_35_1.png

6. 计算伪时间值

首先需要定义一个伪时间值为0的细胞群体,一般来说就是干细胞或者祖细胞。总之就是最原始的细胞类型。

# the most primitive cell is refered as 0 persudotime.
# Group 13 is the nearest cell population to Hematopoietic stem cell.
adata.uns['iroot'] = np.flatnonzero(adata.obs['louvain_anno']  == '13/HSC')[0]
sc.tl.dpt(adata)
sc.pl.draw_graph(adata, color=['louvain_anno', 'dpt_pseudotime'],
                 legend_loc='right margin',title = ['','pseudotime'])
实验记录13: scanpy细胞分化轨迹推断大型真香现场_第8张图片
output_38_0.png

伪时间图的分化轨迹无法用色彩体现出来,可能是伪时间参数的问题。

上面的图注被遮住了,所以单独做一个图。

#plot again to see full legends info
sc.pl.draw_graph(adata, color=['louvain_anno'],
                 legend_loc='right margin',title = ['']) 
实验记录13: scanpy细胞分化轨迹推断大型真香现场_第9张图片
output_39_0.png

保存结果文件:

adata.write("/data1/zll/project/deepBase3/HCA/bone_marrow/scanpy/3_31_traj/trajectory_3_31.h5ad")

你可能感兴趣的:(实验记录13: scanpy细胞分化轨迹推断大型真香现场)