先拆分再合并(学编程本质上是提高解决问题的能力)

有粉丝提问:跟着我们《生信技能树》的教程:借鉴escape包的一些可视化GSVA或者ssGSEA结果矩阵的方法 做他自己的单细胞数据集的gsva发现内存不够,但他自己的个人电脑已经是32G的顶配了,一时间没办法搞到服务器。

如果这个时候你以为我要发一个服务器的宣传:《96核心384G内存的超级服务器(共享)使用权一年》,那你就错了,我们是认认真真教学!

其实个人电脑已经是32G的顶配了,不应该是存在gsva内存瓶颈,一般来说是自己的代码写的太烂了。

安装seurat-data包获取测试数据

代码其实一句话即可:

 devtools::install_github('satijalab/seurat-data')

但是因为是在GitHub,所以中国大陆地区的小伙伴有时候会遇到:

> devtools::install_github('satijalab/seurat-data')
Error: Failed to install 'SeuratData' from GitHub:
  Timeout was reached: [api.github.com] Operation timed out after 10002 milliseconds with 0 out of 0 bytes received

正常情况下应该是:

* installing *source* package 'SeuratData’ ...
** using staged installation
** R
** exec
** inst
** byte-compile and prepare package for lazy loading
** help
*** installing help indices
** building package indices
** testing if installed package can be loaded from temporary location
** testing if installed package can be loaded from final location
** testing if installed package keeps a record of temporary installation path
* DONE (SeuratData)

如果你连GitHub都困难,你可以翻一下我们《生信技能树》很久以前的教程,其实把这个GitHub仓库自己备份到自己的gitee仓库就好了。

查看以及认识测试数据

library(SeuratData)
AvailableData()
# 假如你没有下载pbmc3k数据集 ,就使用下面的 代码 
# InstallData("pbmc3k") #  (89.4 MB) 
#  trying URL 'http://seurat.nygenome.org/src/contrib/pbmc3k.SeuratData_3.1.4.tar.gz'
# 上面的 InstallData 代码只需要运行一次即可哈
data("pbmc3k") 
exp  <- pbmc3k@assays$RNA@data
dim(exp)
exp[1:4,1:4]
table(is.na(pbmc3k$seurat_annotations )) 
as.data.frame(table(pbmc3k$seurat_annotations))

这个测试数据pbmc3k,是已经做好了降维聚类分群和注释啦,这个数据集超级出名的,大家可以自行去了解它的背景知识哈。如下所示:

> exp[1:4,1:4]
4 x 4 sparse Matrix of class "dgCMatrix"
              AAACATACAACCAC AAACATTGAGCTAC AAACATTGATCAGC AAACCGTGCTTCCG
AL627309.1                 .              .              .              .
AP006222.2                 .              .              .              .
RP11-206L10.2              .              .              .              .
RP11-206L10.9              .              .              .              .
> table(is.na(pbmc3k$seurat_annotations ))

FALSE  TRUE 
 2638    62 
> as.data.frame(table(pbmc3k$seurat_annotations))
          Var1 Freq
1  Naive CD4 T  697
2 Memory CD4 T  483
3   CD14+ Mono  480
4            B  344
5        CD8 T  271
6 FCGR3A+ Mono  162
7           NK  155
8           DC   32
9     Platelet   14

如果是follow我这个教程,你完全不需要使用这个测试数据pbmc3k,只要是一个seurat的对象即可。

如果跑gsva面临内存问题

代码如下:

sce=pbmc3k
mat=sce@assays$RNA@counts
mat[1:4,1:4]
X=as.matrix(mat)
dim(X)

gmtfile ='../MSigDB/symbols/h.all.v7.2.symbols.gmt'
library(GSEABase)
library(GSVA)
geneset <- getGmt( gmtfile )  
geneset
# method=c("gsva", "ssgsea", "zscore", "plage"),
# kcdf=c("Gaussian", "Poisson", "none"),
# mx.diff=FALSE: ES is calculated as the maximum distance of the random walk from 0. 
# mx.diff=TRUE (default): ES is calculated as the magnitude difference between the largest positive and negative random walk deviations.
es.max <- gsva(X, geneset, 
               mx.diff=FALSE, verbose=FALSE, 
               parallel.sz= 8 )

其中 h.all.v7.2.symbols.gmt 文件需要自行下载哦,MSigDB(Molecular Signatures Database)数据库中定义了已知的基因集合:http://software.broadinstitute.org/gsea/msigdb 包括H和C1-C7八个系列(Collection),每个系列分别是:

  • H: hallmark gene sets (癌症)特征基因集合,共50组,最常用;
  • C1: positional gene sets 位置基因集合,根据染色体位置,共326个,用的很少;
  • C2: curated gene sets:(专家)校验基因集合,基于通路、文献等:
  • C3: motif gene sets:模式基因集合,主要包括microRNA和转录因子靶基因两部分
  • C4: computational gene sets:计算基因集合,通过挖掘癌症相关芯片数据定义的基因集合;
  • C5: GO gene sets:Gene Ontology 基因本体论,包括BP(生物学过程biological process,细胞原件cellular component和分子功能molecular function三部分)
  • C6: oncogenic signatures:癌症特征基因集合,大部分来源于NCBI GEO  发表芯片数据
  • C7: immunologic signatures: 免疫相关基因集合。

因为这个案例,仅仅是3千个单细胞,所以很难遇到内存不足的报错,其实真实情况下 往往是5万个单细胞以上,大家如果有自己的数据,就可以测试了。

其实解决内存不足问题超级简单

只需要把前面的单细胞的表达矩阵,根据细胞类型拆分开来,分开独立跑gsva,然后再合并,代码如下:

table(sce@meta.data$orig.ident)
es.max.list <- lapply(unique(sce@meta.data$orig.ident),function(i){
  Y=X[,sce@meta.data$orig.ident == i ]
  es.max <- gsva(Y, geneset, 
                 mx.diff=FALSE, verbose=FALSE, 
                 parallel.sz=8)
  return(es.max)
}) 
es.max=do.call(cbind,es.max.list)
es.max[1:4,1:4]

当然了,这个时候表达矩阵的顺序其实是发生了变化哦,后续如果对这个gsva矩阵绘制热图的时候,需要调整回来哦。

es.max[1:4,1:4]
X[1:4,1:4]
identical(colnames(es.max),colnames(X))
pos=match(colnames(X),colnames(es.max))
es.max=es.max[,pos]
identical(colnames(es.max),colnames(X))

其实呢,也不一定要根据细胞类型来拆分表达量矩阵分开跑gsva,只需要拆分即可。毕竟啊, 按照细胞类型来拆分表达量矩阵,通常呢,并不是等价的。

 as.data.frame(table(pbmc3k$seurat_annotations))
          Var1 Freq
1  Naive CD4 T  697
2 Memory CD4 T  483
3   CD14+ Mono  480
4            B  344
5        CD8 T  271
6 FCGR3A+ Mono  162
7           NK  155
8           DC   32
9     Platelet   14

最后的可视化如下

ac=data.frame(celltype=pbmc3k$seurat_annotations)
rownames(ac)=rownames(sce@meta.data)
pheatmap::pheatmap(es.max,
                   annotation_col = ac,
                   show_colnames = F)

挺漂亮的:

文末友情推荐

(0)

相关推荐