实验记录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 = "")
output_4_0.png

1. Partition-based Graph Abstraction(PAGA)

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

sc.tl.paga(adata, groups='louvain')
sc.pl.paga(adata, color=['louvain'],title = "")
output_13_1.png

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

sc.pl.paga(adata, color=['AVP'])
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)
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')
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()
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
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'])
output_38_0.png

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

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

#plot again to see full legends info
sc.pl.draw_graph(adata, color=['louvain_anno'],
                 legend_loc='right margin',title = ['']) 
output_39_0.png

保存结果文件:

adata.write("/data1/zll/project/deepBase3/HCA/bone_marrow/scanpy/3_31_traj/trajectory_3_31.h5ad")
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,560评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,104评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,297评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,869评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,275评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,563评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,833评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,543评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,245评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,512评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,011评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,359评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,006评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,062评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,825评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,590评论 2 273
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,501评论 2 268

推荐阅读更多精彩内容