scRNAseq分析R包metacell

? ? ? ? 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')

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