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

  为了更好的展示代码,我把之前的帖子重新整理成markdown的格式,方便大家观看!!!

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

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

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

工作流程示意图

细胞聚类的具体步骤:

1、初始化环境

library("metacell")
if(!dir.exists("testdb")){
  dir.create("testdb/")
}
#会使用testdb文件夹作为database用来存储生成的中间对象
scdb_init("testdb/", force_reinit=T) 
if(!dir.exists("figs")){
  dir.create("figs/")
}
#会使用figs文件夹作为默认路径存储生成的图片
scfigs_init("figs/") 

2、导入数据

#向database里导入表达矩阵(会生database中生成mat.pbmc.Rda)
 #'pbmc'为矩阵对象的id,可将base_dir换成包含10x的矩阵文件的本地路径。
mcell_import_scmat_10x("pbmc", base_dir="http://www.wisdom.weizmann.ac.il/~atanay/metac_data/pbmc_8k/")
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基因

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

8、metacell的二维可视化展示

#使用默认的颜色给metacell上色,也可提供自定颜色
mc_colorize_default('pbmc_mc_f')
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)

结果如下图:


image

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。各位看官们帮忙点个赞再走吧!!!

你可能感兴趣的:(MetaCell: scRNAseq聚类和细胞类型注释的R包)