clusterProfiler:自定义数据库

clusterProfiler中提供了enricher和GSEA两个函数,enricher包装了**Over-representation analysis**,GSEA包装了Gene Set Enrichment Analysis。这两个函数与其他的enrichKEGG、gseKEGG的唯一不同点是提供的不是KEGG数据库,而是TERM2GENE和TERM2NAME两个参数。

gson格式初探中,我们可以得到一个Anno对象kk,恰好其中就有kk@gsid2gene、kk@gsid2name两个属性,因此我们可以得知gsid2gene、gsid2name都是一个两列的长数据框:gsid2gene的第一列是gsid、表示通路ID,第二列是gene、表示通路基因;gsid2name的第一列是gsid,第二列是name、对通路的描述。有了这些知识,我们可以尝试自己构建一个数据库。

构建尝试

包自带的KEGG数据分析起来需要输入ENTREZID。而常规的GTF文件中并不包含这个,通过对比得到的结果只有SYMBOL和ENSEMBL,因此直接转换难免出现不能对应的情况。所以我们需要一个以SYMBOL为gene的gsid2gene数据库。

1
2
3
4
5
6
kk_SYMBOL <- list()
kk_SYMBOL[['TERM2NAME']] <- kk@gsid2name
kk_SYMBOL[['TERM2GENE']] <- kk@gsid2gene
tmp <- AnnotationDbi::select(org.Hs.eg.db::org.Hs.eg.db,keys=kk_SYMBOL$TERM2GENE$gene,columns='SYMBOL', keytype='ENTREZID')
kk_SYMBOL$TERM2GENE$gene <- tmp$SYMBOL
kk_SYMBOL$TERM2GENE

通过上面的代码,我们得到了一个gene为SYMBOL,其他与KEGG完全一致的新数据库,让我们放入enricher中进行测试,看看是否能行。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
kegg.d <- enricher(gene = subset(rres, log2FoldChange < -0.1 & padj < 0.05)$symbol,
universe = rres$symbol,
pAdjustMethod = "fdr",
qvalueCutoff = 0.05,
TERM2GENE = kk_SYMBOL$TERM2GENE,
TERM2NAME = kk_SYMBOL$TERM2NAME)
require(tidyverse)
require(enrichplot)
require(DOSE)
f_kegg_p <- function(keggr2, n = 15){
keggr <- subset(keggr2@result, p.adjust < 0.05)
keggr[['-log(Padj)']] <- -log10(keggr[['p.adjust']])
keggr[['geneRatio']] <- parse_ratio(keggr[['GeneRatio']])
keggr$Description <- factor(keggr$Description,
levels=keggr[order(keggr$geneRatio),]$Description)
ggplot(head(keggr,n),aes(x=geneRatio,y=Description))+
geom_point(aes(color=`-log(Padj)`,
size=`Count`))+
theme_bw()+
scale_color_gradient(low="blue1",high="brown1")+
labs(y=NULL) +
theme(axis.text.x=element_text(angle=90,hjust = 1,vjust=0.5, size = 12),
axis.text.y=element_text(size = 15))
}
f_title <- function(gp,title){
gp + labs(title = title) + theme(plot.title = element_text(hjust = 0.5))
}
f_kegg_p(kegg.d, n =15) %>% f_title("kegg.d")
require(enrichplot)
# options(BioC_mirror="https://mirrors.tuna.tsinghua.edu.cn/bioconductor")
# BiocManager::install("ggnewscale")
kegg.d2 <- pairwise_termsim(kegg.d)
emapplot(kegg.d2,showCategory=15)
rres <- rres[order(rres$log2FoldChange, decreasing = T),]
lgene <- rres$log2FoldChange
names(lgene) <- rres$symbol
options(repr.plot.width=8, repr.plot.height=8)
cnetplot(kegg.d2, foldChange=lgene)

显然,结果是成功的!

豁然开朗

既然可行,那我们来构建HALLMARKS试试。

  • 下载 h.all.v7.5.1.symbols.gmt,上传到服务器上
  • GMT格式为制表符分隔文件,第一列是通路名称,第二列是描述,第三列以及之后是对应通路下的基因,每个通路为一行。
  • 使用下面的代码构建我们自己的clusterProfiler数据库
1
2
3
4
5
6
7
8
9
10
11
12
13
14
text <- readLines("~/upload/zl_liu/gsea/h.all.v7.5.1.symbols.gmt", encoding = "UTF-8")
text <- strsplit(text, "\t")
H.ALL <- list(TERM2GENE=data.frame(), TERM2NAME=data.frame())
for (i in 1:length(text)){
line <- text[[i]]
gsid <- line[1]
H.ALL$TERM2NAME <- rbind(H.ALL$TERM2NAME, c(i,gsid))
for(k in 3:length(line)){
H.ALL$TERM2GENE <- rbind(H.ALL$TERM2GENE, c(i,line[k]))
}
}
colnames(H.ALL$TERM2NAME) <- c('gsid', 'name')
colnames(H.ALL$TERM2GENE) <- c('gsid', 'gene')
saveRDS(H.ALL, 'HALLMARKS.rds')

得到自己的HALLMARKS后,使用前面的方法即可进行enricher和GSEA分析。

1
2
3
4
5
6
7
H.ALL <- readRDS('HALLMARKS.rds')
gse.H <- GSEA(gene = lgene,
pAdjustMethod = "fdr",
eps = 0,
TERM2GENE = H.ALL$TERM2GENE,
TERM2NAME = H.ALL$TERM2NAME)
gseaplot2(gse.H,geneSetID=head(which(gse.H@result$enrichmentScore < -0.3),6))


clusterProfiler:自定义数据库
https://b.limour.top/1923.html
Author
Limour
Posted on
July 21, 2022
Licensed under