与上次翻车实验的不同:
- 过滤了更多的细胞和基因。在处理数据时,低质量的细胞一定要清除掉,告诫大家宁缺毋滥。。。否则后续分析真的是一堆的噪点。
- 跳过了scanpy中的降噪步骤。scanpy的降噪算法做的真不咋地,一个好图降噪之后更加混乱了。这个故事告诉我们一个道理:不要迷信作者说的话!!!
对翻车实验感兴趣的话://www.greatytc.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
读取数据(数据来源详见//www.greatytc.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 = "")
1. Partition-based Graph Abstraction(PAGA)
这是一种基于空间划分的抽提细胞分化“骨架”的一种算法,用于显示细胞的分化轨迹,得到哪些cluster之间的关系更接近。
sc.tl.paga(adata, groups='louvain')
sc.pl.paga(adata, color=['louvain'],title = "")
AVP是造血干细胞表达的一个基因,给这个基因上色,我们可以看到基本上都富集在了cluster13的位置。那么有很大可能这个cluster就是造血干细胞。
sc.pl.paga(adata, color=['AVP'])
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)
于是就得到了这样像“骨架”一样的结果。这个图显示的就是细胞与细胞之间的关系,距离越近表示关系越接近。
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')
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()
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
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'])
伪时间图的分化轨迹无法用色彩体现出来,可能是伪时间参数的问题。
上面的图注被遮住了,所以单独做一个图。
#plot again to see full legends info
sc.pl.draw_graph(adata, color=['louvain_anno'],
legend_loc='right margin',title = [''])
保存结果文件:
adata.write("/data1/zll/project/deepBase3/HCA/bone_marrow/scanpy/3_31_traj/trajectory_3_31.h5ad")