metacell: scRNAseq聚类和细胞类型注释的R包

        scRNAseq可谓是目前科研界研究细胞异质性的有效手段,正处于如火如荼的阶段。单细胞分析一个很重要目的就是为了确定细胞的类型。说到单细胞分析,大家第一时间想到的肯定是三大R包Seurat、monocle、scater,但是今天我准备给大家介绍一个新的R包metacell,可以用来聚类和注释细胞类型,功能堪比Seurat,但实现方法却很不一样。

         接下来就说说metacell包与其他包不同的地方,这个R包聚类不用建立在PCA的基础上,而是将细胞分成若干的元胞(MetaCell);最重要的是这个包可以系统性地注释细胞类型,先用层次聚类将元胞大体分成若干组,然后可以根据mark基因的lfp(相当于基因在元胞中的富集情况)值进一步细分分组。

话不多说,下面来介绍这个包使用方法,流程如下图所示:

工作流程图

具体步骤

1、初始化环境

library("metacell")

if(!dir.exists("testdb")){

  dir.create("testdb/")

}

scdb_init("testdb/", force_reinit=T) #会使用testdb文件夹作为database用来存储生成的中间对象

if(!dir.exists("figs")){

  dir.create("figs/")

}

scfigs_init("figs/") #会使用figs文件夹作为默认路径存储生成的图片

2、导入数据

#向database里导入表达矩阵(会生database中生成mat.pbmc.Rda)

mcell_import_scmat_10x("pbmc", base_dir="http://www.wisdom.weizmann.ac.il/~atanay/metac_data/pbmc_8k/") #'pbmc'为矩阵对象的id,可将base_dir换成包含10x的矩阵文件的本地路径。

mat <- scdb_mat("pbmc") #从database获取矩阵对象

#或者从 sparse Matrix of class "dgCMatrix"(行为基因,列为细胞) 导入数据,该方式需要自己添加cell_metadata,matrix格式如下:

        AAACCCAAGGAGAGTA  AAACGCTTCAGCCCAG  AAAGAACAGACGACTG

7SK                    .                .                . 

A1BG                  .                .                .      

A1CF                  .                .                .       

#获取cell_metadata信息

cellid <- colnames(matrix)

cell_metadata <- data.frame(cellid,type='10x',batch_set_id=paste0('test_',cellid),amp_batch_id=paste0('test_',cellid),seq_batch_id=paste0('test_',cellid), spike_count=0,row.names=1)

#创建需要的矩阵对象

mat <- scm_new_matrix(matrix, cellmeta, stat_type = "umi")

scdb_add_mat('pbmc', mat) #将矩阵对象添加到database以便后续使用

3、数据质检及过滤

#UMI分布直方图,会在figs目录下生成一个名为pbmc.total_umi_distr.png文件

mcell_plot_umis_per_cell(dbid)

# 过滤不想要的基因和低UMI的细胞

nms <- c(rownames(mat@mat), rownames(mat@ignore_gmat))

ig_genes <- c(grep("^IGJ", nms, v=T),grep("^IGH",nms,v=T),grep("^IGK", nms, v=T),grep("^IGL", nms, v=T))

bad_genes <- unique(c(grep("^MT-", nms, v=T), grep("^MTMR", nms, v=T), grep("^MTND", nms, v=T),"NEAT1","TMSB4X", "TMSB10",ig_genes))

mcell_mat_ignore_genes(new_mat_id='pbmc', mat_id='pbmc', bad_genes, reverse=F)

mcell_mat_ignore_small_cells('pbmc', 'pbmc', 800)

4、选择特征基因

#选择代表性的基因可以加快计算速度

mcell_add_gene_stat(gstat_id='pbmc', mat_id='pbmc', force=T)

mcell_gset_filter_varmean(gset_id='pbmc_feats', gstat_id='pbmc', T_vm=0.08, force_new=T) #(会在database中生成gset.pbmc_feats.Rda)

mcell_gset_filter_cov(gset_id='pbmc_feats', gstat_id='pbmc', T_tot=100, T_top3=2)

mcell_plot_gstats(gstat_id='pbmc', gset_id='pbmc_feats') #(会在database中生成gstat.pbmc.Rda,在figs中生成三个图片pbmc.szcor.png 、pbmc.top3.png、pbmc.varmin.png)

5、构建平衡的细胞图聚类

mcell_add_cgraph_from_mat_bknn(mat_id='pbmc', gset_id='pbmc_feats', graph_id='pbmc_graph', K=100, dsamp=T) #(生成cgraph.pbmc_graph.Rda)

mcell_coclust_from_graph_resamp(coc_id='pbmc_coclust', graph_id='pbmc_graph', min_mc_size=20, p_resamp=0.75, n_resamp=500)

mcell_mc_from_coclust_balanced(coc_id='pbmc_coclust',mat_id='pbmc', mc_id='pbmc_mc',K=30, min_mc_size=30,alpha=2) #(生成coclust.pbmc_coclust.Rda)

6、去除异常值

mcell_plot_outlier_heatmap(mc_id='pbmc_mc', mat_id = 'pbmc', T_lfc=3) #(会在figs中生成pbmc_mc.outlier.png)

mcell_mc_split_filt(new_mc_id='pbmc_mc_f', mc_id='pbmc_mc', mat_id='pbmc', T_lfc=3, plot_mats=F) #(会在database中生成mc.pbmc_mc_f.Rda)

7、选择metacell的mark基因

mcell_gset_from_mc_markers(gset_id='pbmc_markers', mc_id='pbmc_mc_f') #(会在database中生成gset.pbmc_markers.Rda)

8、metacell的二维可视化展示

mc_colorize_default('pbmc_mc_f')#使用默认的颜色给metacell上色,也可提供自定颜色

mcell_mc2d_force_knn(mc2d_id='pbmc_2dproj',mc_id='pbmc_mc_f', graph_id='pbmc_graph')

tgconfig::set_param("mcell_mc2d_cex",1.5, "metacell")  #设置metacell在图中的点大小

tgconfig::set_param("mcell_mc2d_height",1100, "metacell") #设置图片的高度

tgconfig::set_param("mcell_mc2d_width",1100, "metacell") #设置图片的宽度

mcell_mc2d_plot('pbmc_2dproj') #(会在figs中生成pbmc_2dproj.2d_graph_proj.png)

以上就可以将数据划分成若干个MC,后续就是对MC的细胞类型做注释。注释之前需要明白一个概念就是lfp,可以表示基因在MC上的富集程度,通过衡量mark基因的lfp值将不同的MC划分成不同的组。

系统性的细胞类型注释

1、将MC层次聚类

mc_hc <- mcell_mc_hclust_confu(mc_id = 'pbmc_mc_f', graph_id = 'pbmc_graph')

mc_sup <- mcell_mc_hierarchy(mc_id = 'pbmc_mc_f', mc_hc = mc_hc, T_gap = 0.04)

#生成pbmc_mc_f.supmc_confu.png

mcell_mc_plot_hierarchy(mc_id = 'pbmc_mc_f', graph_id = 'pbmc_graph', mc_order = mc_hc$order, sup_mc = mc_sup,width = 1500, height = 2400, min_nmc=2, show_mc_ids = T)

2、通过mark基因确定MC的细胞类型

查看聚类具体的某个分支结果

mc_sup[[4]]

$marks

  GAPDH CD27-AS1    CXCR6  CARD16    SELL    CTLA4 TNFRSF1B    ICOS

1.409033 1.425825 1.478982 1.527237 1.571408 1.609004 1.647381 1.729588

TNFRSF4    FOXP3    RGS1    TIGIT    CCR8    PIM2    SAT1    CD27

1.908381 1.955422 2.052494 2.065926 2.076183 2.108668 2.131010 2.170227

TNFRSF18  MIR4632    IL2RA    BATF

2.185034 2.188458 2.318691 2.542111

$min_marks

    CXCR6      SELL      CD82      RGS1    SIRPG      ICOS      IL32    CARD16

0.7418518 0.7487228 0.7501615 0.9337986 1.0267765 1.0475643 1.0644945 1.0738282

    CTLA4      CD74      CCR8    GAPDH  CD27-AS1    FOXP3    TIGIT      SAT1

1.1351219 1.1766789 1.1937338 1.2025314 1.3105893 1.3563242 1.5938838 1.6433828

    IL2RA      PIM2      CD27      BATF

1.7104313 1.7890192 2.0234116 2.1977205

$marks_gap

    PKM    IFI6    IL1R2    ENO1    LDHA    SRGN    SAT1 TNFRSF1B

1.173707 1.179759 1.208043 1.212875 1.219272 1.235725 1.239677 1.257179

APOBEC3C    GAPDH    ICOS    CTSC  MIR4632    DDIT4  TNFRSF4    CCR8

1.298520 1.340427 1.342362 1.389729 1.482165 1.484738 1.512940 1.667040

  CXCR6    RGS1 TNFRSF18    BATF

1.860873 1.901821 1.971574 2.075978

$marks_gap_anti

      GIMAP7        GIMAP4        TXNIP          CD52      S100A10

  -2.1707354    -1.6104371    -1.5863388    -1.4286298    -1.1785400

        FCMR GIMAP1-GIMAP5          SELL        LIME1      ALOX5AP

  -1.1444732    -1.1084550    -1.0938374    -1.0360991    -0.9999712

          AES          LDHB        GSTK1        RPL13A          CCR7

  -0.9894325    -0.9848750    -0.9780960    -0.9670300    -0.9525264

      GIMAP5          RPS6        UBXN11      RARRES3          LEF1

  -0.9523882    -0.9315339    -0.8861049    -0.8690605    -0.8554596

$mcs

[1] 55 53 52 51 54 56

$x_ord

[1] 6.5

$sup_mcs

[1] 40 38 39 58 55 53 52 51 54 56

#mark基因的lfp阈值默认为 > 1.5

* mcs - the ids of metacells in the subtree (those marked in blue)。该分支中MC的id。

* sup_mcs - the ids of metacells in the subtree and in the sibling subtree (those marked in blue and gray)。该父分支(该分支和兄弟分支)中MC的id。

* x_ord - mean rank of the subtree metacells in the confusion matrix。该分支中MC的id在父分支MC的id中的位置rank值的平均值。

* marks - averaging lfp over mcs, showing the top 20 genes。每个mark基因在MC之间的平均值,取前20个基因。

* min_marks - taking the minimal lfp value per gene over mcs, showing the top 20 genes。所有MC中某个mark基因的lfp最小值,显示20个基因。

* marks_gap - showing the genes with maximal difference between the average lfp over mcs and average lfp over metacells in the sibling subtree。该分支中MC的某个mark基因的lfp平均值与兄弟分支中MC的lfp平均值的差值。

* marks_gap_anti - similar to marks_gap but showing genes with minimal difference (e.g. enriched in the sibling subtree。与marks_gap类似,兄弟分支的某个mark基因在该分支里的MC中的lfp平均值与兄弟分支中MC的lfp平均值的差值。

根据mark基因的聚类结果可以将MC大体分成几个分组,然后结合自己关注的mark基因的lfp值来进一步细分分组:

#查看具体mark基因的lfp值分布的步骤如下:

mc <- scdb_mc('pbmc_mc_f')

lfp <- log2(mc@mc_fp)

plt <- function(gene1, gene2, lfp, colors){

    plot(lfp[gene1, ], lfp[gene2, ], pch=21, cex=3, bg=colors, xlab=gene1, ylab=gene2)

    text(lfp[gene1, ], lfp[gene2, ], colnames(lfp))

}

#查看SLC4A10、KLRB1两个基因的lfp值在MC中的分布

plt(gene1 = 'SLC4A10', gene2 = 'KLRB1', lfp = lfp, colors = mc@colors)

结果如下图:

SLC4A10、KLRB1的lfp分布情况

3、细胞类型注释

根据聚类的结果,将MC和细胞类型整理成注释文件(supmc_key.txt),制表符分割格式如下:

supid    color    name

2    #107538    Tfh

4    #59b56f    tumor-Treg

8    #a3ffb9    blood-Treg

17    #b3d4f0    naive-TCF7

27    #6d8eaa    naive-CXCR6

34    #cee6b9    CD4-cyto

37    #fdb913    CD8-cyto

40    #a76eaf    CD8-dysf

51    #d29bc6    CD8-GZMK

supid-聚类热图中的分支节点ID,即热图左上mark基因后的数字

color-细胞类型的颜色

name-细胞类型的名称

如果需要根据基因的lfp值细分,需要另外整理一个注释文件(gene_key.txt),制表符分割格式如下:

name    gene    color    T_fold

CD8-dysf    TUBA1B    #a76eaf    2

CD8-MAIT    SLC4A10    #ead37a    1

CD8-dysf-KLRC4    KLRC4    #6b3273    3

naive-TCF7    XIST    #b3d4f0    1

#根据注释文件重新聚类并生成热图(如果不重名会覆盖之前的热图)

mc_colorize_sup_hierarchy(mc_id = 'pbmc_mc_f',supmc = mc_sup,supmc_key = 'supmc_key.txt', gene_key='gene_key.txt')

heatmapmcell_mc_plot_hierarchy(mc_id = 'pbmc_mc_f',graph_id = 'pbmc_graph',mc_order = mc_hc$order,sup_mc = mc_sup,width=1200,                                                                 height=2400, min_nmc=2, show_mc_ids= T)

#最后更新一下2D的聚类图,此时生成的图就会注释好细胞类型

mcell_mc2d_plot('pbmc_2dproj')

最终注释效果:

2D投影图

       最后,总结来说一下,这个R采用自己的一套聚类方式,引入一个新的MetaCell元胞概念,将细胞分成若干元胞,然后采用聚类和lfp值方式可以将元胞很细致分成不同的细胞类型。对于细胞包的分析也不失为一个不错的选择。这个R包的作者已经将R封装成各种函数,使用起来挺方便的,但也就是因为封装的很厉害导致需要一定的R基础才能修改输出结果。比如说封装的函数包装的基础画图函数plot,且暴露很少的参数修图,所以画出的图不好看。最后附上该包的文章链接:https://genomebiology.biomedcentral.com/articles/10.1186/s13059-019-1812-2。各位看官们帮忙点个赞吧!!!

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