作者:尧小飞
审稿:童蒙
编辑:amethyst
引言
随着10xGenomics单细胞转录组技术的普及,现在的单细胞转录组分析越来越普及,得到的单细胞数据越来越多。然而单细胞转录组技术发展年限相对而言较短,在分析上还存在着一定的瓶颈,其中比较头疼的一个瓶颈就是单细胞亚群的鉴定。比如说:得到这么多细胞,我不知道细胞是什么细胞,这怎么分析,这是单细胞转录组分析中绕不过去的一点。
一般来说,需要老师根据自己专业背景知识,进行判断单细胞亚群是什么类型细胞,但不是每个老师的专业背景都这么强。
这个问题并不是我们才有的问题,全世界都有这个问题。幸好Dvir等人在2019年1月14日发表在Nature Immunology (https://www.x-mol.com/paper/journal/104)( IF 23.530 )上的文章解决了这个问题,作者开发了一个SingleR (http://www.bioconductor.org/packages/release/bioc/vignettes/SingleR/inst/doc/SingleR.html)工具,可以自动鉴定细胞亚群的类型,这个工具支持人和小鼠两个物种,其实工具的本质上计算每个单细胞的表达量数据与纯的bulk RNA数据相关性,相关性越大,说明是此类细胞,当然作者对数据有其他的处理过程。SingleR也有在线版本的。主要功能有如下:
for each test cell:
- We compute the Spearman correlation between its expression profile and that of each reference sample. This is done across the union of marker genes identified between all pairs of labels.
- We define the per-label score as a fixed quantile (by default, 0.8) of the distribution of correlations.
- We repeat this for all labels and we take the label with the highest score as the annotation for this cell.
- We optionally perform a fine-tuning step:
- The reference dataset is subsetted to only include labels with scores close to the maximum.
- Scores are recomputed using only marker genes for the subset of labels.
- This is iterated until one label remains.
下面我们来详细看看如何使用这个软件。
SingleR的安装
- 使用bioconductor安装
SingleR的安装有多种方式,这是一个R包,并且发布在biocondutor,当然可以直接用biocondutor方式来安装:
if (!requireNamespace("BiocManager", quietly = TRUE))
install.packages("BiocManager")
BiocManager::install("SingleR")
- 使用github来安装
这个R包已经放在GitHub上面,可以直接使用GitHub安装R包的方式来安装:
devtools::install_github('dviraran/SingleR')
不过在查找问题的时候,发现这个包已经放在别的仓库了,因此可以通过别的仓库来安装:
devtools::install_github('LTLA/SingleR')
- 注意事项
新的R包,需要在 R (version "3.6")版本以上的才能安装,其实一直很纳闷,为什么R一升级,就不能兼容下面的,还得重新安装R,这是R的一个大弊病。
SingleR升级
一般来说,如果工具能够一直维护和升级,当然是好事,singleR第一版出来以后,解决了没有工具自动进行细胞亚群鉴定的问题,但是存在一个较大的问题,就是这个运行速度特别的慢,细胞类型少,自己定制参考数据集较困难,因此亟需改进。作者在1月份发表文章,5月23日就做了一个较大的升级。这次的升级与之前的分析很多不兼容,具体升级的功能有:
1.官方提供了部分数据集,细胞类型增多,免疫细胞分的更细了,更符合分析预期;
2.提高了运行速度;
3.修改了部分函数,旧版本的函数与新版本的函数可能不兼容;
4.提供了参考数据集的接口,虽然之前也提供了,但是现在的接口使用更便。
SingleR参考数据集
新版的SingleR一大优点就是提供了较多的数据集,不是之前的所有数据集整合在里面,我们看不见摸不着,而且细胞类型较少,新的数据集有7种,主要是人和小鼠物种,特别的两个物种的免疫基因,可以把细胞分成很细的T细胞。具体如下:
每个数据集类型较多,就不一一列举了。以下主要列举两个免疫基因数据集,主要是在单细胞转录组研究中,免疫细胞的研究较多,而且免疫细胞亚群鉴定相对困难,下面的数据集是非常好的参考数据集。
01 DatabaseImmuneCellExpressionData Labels
02 ImmGenData Labels
当然下面的表格不全,只是列举了少部分,从这些细胞类型来看,很多都能满足我们常见的免疫细胞鉴定。
03 其他数据集的细胞类型
当然下面的表格不全,只是列举了少部分,从这些细胞类型来看,很多都能满足我们常见的免疫细胞鉴定,其他数据集可以看SingleR的网页,点击如下的红色箭头指定的部分就可以看到所有细胞类型。
SingleR测试
报错的解决
在测试SingleR的时候,首先就是想把参考数据集下载下来,以后做分析的时候,可以直接用,不用联网分析。结果下载的时候,有如下所示报错,说明格式有问题。
然后发现数据下载是通过ExperimentHub下载,其下载源代码如下:
1.create_se <- function(dataset, hub = ExperimentHub(), assays="logcounts",
2 rm.NA = c("rows","cols","both","none"), has.rowdata=FALSE, has.coldata=TRUE)
3{
4 rm.NA <- match.arg(rm.NA)
5 host <- file.path("SingleR", dataset)
6 # hub$rdatapath[grep('SingleR',hub$rdatapath)]
7 ## extract normalized values --------
8 all.assays <- list()
9 for (a in assays) {
10 nrmcnts <- hub[hub$rdatapath==file.path(host, paste0(a, ".rds"))][[1]]
11 all.assays[[a]] <- .rm_NAs(nrmcnts, rm.NA)
12 }
13
14 ## get metadata ----------------------
15 args <- list()
16 if (has.coldata) {
17 args$colData <- hub[hub$rdatapath==file.path(host, "coldata.rds")][[1]]
18 }
19 if (has.rowdata) {
20 args$rowData <- hub[hub$rdatapath==file.path(host, "rowdata.rds")][[1]]
21 }
22
23 ## make the final SE object ----------
24 do.call(SummarizedExperiment, c(list(assays=all.assays), args))
25}
26##下载函数
27ImmGenData <- function(ensembl=FALSE) {
28 version <- "1.0.0"
29 se <- .create_se(file.path("immgen", version),
30 assays="logcounts", rm.NA = "none",
31 has.rowdata = FALSE, has.coldata = TRUE)
32
33 if (ensembl) {
34 se <- .convert_to_ensembl(se, "Mm")
35 }
36 se
37}
38 hub$rdatapath[grep('SingleR',hub$rdatapath)]
39> hub$rdatapath[grep('SingleR',hub$rdatapath)]
40 #[1] "SingleR/blueprint_encode/1.0.0/logcounts.rds"
41 #[2] "SingleR/blueprint_encode/1.0.0/coldata.rds"
42 #[3] "SingleR/hpca/1.0.0/logcounts.rds"
43 #[4] "SingleR/hpca/1.0.0/coldata.rds"
44 #[5] "SingleR/immgen/1.0.0/logcounts.rds"
45 #[6] "SingleR/immgen/1.0.0/coldata.rds"
46 #[7] "SingleR/mouse.rnaseq/1.0.0/logcounts.rds"
47 #[8] "SingleR/mouse.rnaseq/1.0.0/coldata.rds"
48# [9] "SingleR/dice/1.0.0/logcounts.rds"
49#[10] "SingleR/dice/1.0.0/coldata.rds"
50#[11] "SingleR/dmap/1.0.0/logcounts.rds"
51#[12] "SingleR/dmap/1.0.0/coldata.rds"
52#[13] "SingleR/monaco_immune/1.0.0/logcounts.rds"
53#[14] "SingleR/monaco_immune/1.0.0/coldata.rds"
由于运行一直有报错,然后就一步一步地运行,在如下代码的时候报错:
1args$colData <- hub[hub$rdatapath==file.path(host, "coldata.rds")][[1]]
2h=hub[hub$rdatapath==file.path(host, paste0(a, ".rds"))]
3h[[1]]
上面图片的报错,可能还是网络的问题,没法翻墙的情况下就不能用这个方法,只能继续寻找其他方法。之后在GitHub上面发现有如下的数据,鉴于无法翻墙的网络,还是下载不了,不过在GitHub上面就好办,可以先把这个项目导入到gitee,然后从gitee下载。
通过下面方式导入,这个工具可能有点大,800M,估计要点时间。
结果示范图
不同参考数据集的影响
01 运行速度-不同数据集的影响
为了测试不同的参考数据集对结果的影响,这里用了同一个querry数据集、不同的参考数据集进行测试。这里选择的测试数据为小鼠,querry数据集是经过流式sort后的T细胞,有20519个细胞,这属于常规项目,细胞数不少。小鼠的参考数据集就只有两个,ImmGenData()和MouseRNAseqData(),前一个数据集主要集中在免疫细胞相关,后一个的细胞范围较广,两个数据集都有T细胞,因此两个数据集都可以使用。
下面表格为测试结果,从结果来看,参考数据集的细胞类型越少,其运行时间越短,MouseRNAseqData参考数据集所耗时间只有3 min左右。但是main labels为20个的ImmGenData所费时间要远远高于MouseRNAseqData的时间,这说明运行时间与参考数据集的细胞数或者说样品数目有关,ImmGenData有830个细胞或者样品,而MouseRNAseqData只有358个细胞或者样品。
02 结果准确性-不同数据集的影响
其实在这里说结果准确性有点不合适,我们也不知道具体的结果如何,只能比较一下其结果。
1. MouseRNAseqData
a .main labels
> data<-immune.combined@assays$RNA@data
> pred.hesc <- SingleR(test = data, ref =ref_data, labels = ref_data$label.main)
> table(pred.hesc$labels)
Dendritic cells Granulocytes NK cells T cells
1 1 192 20325
b. fine labels
> pred.hesc_label.fine <- SingleR(test = data, ref =ref_data, labels = ref_data$label.fine)
> table(pred.hesc_label.fine$labels)
Granulocytes NK cells T cells
1 189 20329
从上面两种标签的结果来看,其结果基本上没有太大差异,不过有部分不一致,这个数据集是经过sort以后的T细胞,因此大部分细胞应该属于T细胞,从这个来说,上述结果都比较符合预期,比较sort的细胞也不能保证百分比的纯细胞,其他细胞1%以下还是可以接受的。如果非要分个上学,fine labels的T细胞数目更多,不过差别不大,只多了4个细胞,几乎可以忽略不计。
2. ImmGenData
ImmGenData数据的细胞数目和细胞种类要远远大于MouseRNAseqData数据集,因此运行的速度会远远低于它,但是细胞类型多,各种免疫细胞都有,其结果将更符合研究目的。
a. main labels
> pred.hesc <- SingleR(test = data, ref =ref_data, labels = ref_data$label.main)
> table(pred.hesc$labels)
Basophils ILC NK cells NKT T cells Tgd
2 81 39 721 19435 241
b. fine labels
1> pred.hesc_label.fine <- SingleR(test = data, ref =ref_data, labels = ref_data$label.fine)
2> as.matrix(table(pred.hesc_label.fine$labels))
3T cells (T.4SP69+) 1
4T cells (T.8EFF.OT1.12HR.LISOVA) 114
5T cells (T.8EFF.OT1.24HR.LISOVA) 135
6T cells (T.8EFF.OT1.48HR.LISOVA) 66
7T cells (T.8Mem) 1515
8T cells (T.8MEM) 61
9T cells (T.8MEMKLRG1-CD127+.D8.LISOVA) 445
10T cells (T.8NVE.OT1) 386
11T cells (T.8Nve) 574
12T cells (T.8NVE) 19
13T cells (T.CD4.1H) 1707
14T cells (T.CD4.24H) 6
15T cells (T.CD4.48H) 1
16T cells (T.CD4.5H) 40
17T cells (T.CD4.CTR) 22
18T cells (T.CD4+TESTDB) 1
统计了一下,T cells 一共有19761个细胞,比main labels的19435多了300多个细胞。其他的结果就不统计了。上面结果只展示了部分的细胞结果,如果仅仅从这个结果来看,这个参数数据集可以将T细胞或者其他免疫细胞分的很细,比如这里可以分到naive细胞或者效应细胞等等。因此这个数据集适合哪种sort T细胞或者其他免疫细胞。
结语
以上就是SingleR研究过程中的一些心得,希望可以对各位小伙伴有所启发~~