最近手头处理一批代谢组数据, 想基于几十个关键差异代谢物代谢物进行下KEGG富集,能想到有两种方式解决,一种常用方式就是基于MetaboAnalyst在线富集,另一种就是解析出该物种的通路与代谢物的对应关系文件,然后用Y叔叔的Clusterprofiler包富集。经一番搜索,massdatabase包可帮我们轻松获得这个文件。
一、MetaboAnalysis
网站功能是基于R语言实现,也有同名的R包可供使用。
网址:https://www.metaboanalyst.ca/
这种方式比较简单粗暴,支持的ID类型有化合物名称, HMDB ID, KEGG ID, PubChem CID等等,但其弊端是富集分析基于的通路为人类的代谢通路,因此最后可能会富集到一些奇怪的结果。
二、massdatabase包
massDatabase一共支持12个在线数据库, 支持下载物种的化合物/通路数据库并将它们转换为特定的数据结构,然后我们结合clusterprofiler包从而非常方便的进行代谢物富集分析。这里以研究物种—弓形虫(Toxoplasma gondii,缩写为tgo)的代谢通路和化合物数据库为例。
KEGG Organisms缩写查询:https://www.genome.jp/kegg/catalog/org_list.html
下载tgo的kegg通路数据库
主要利用3个函数功能 :1. download_kegg_pathway 2. read_kegg_pathway 3. convert_kegg2metpath ,分别进行下载,读取和转换作用。
#安装R包
remotes::install_github("tidymass/massdatabase", dependencies = TRUE)
## 下载tgo的通路代谢物关系
download_kegg_pathway(path = "kegg_tgo_pathway",
sleep = 1,
organism = "tgo")
## 然后读取所下载的数据
tgo_data <-
read_kegg_pathway(path = "kegg_tgo_pathway")
class(tgo_data)
## 转变数据库形式
kegg_pathway_database <-
convert_kegg2metpath(data = tgo_data, path = ".")
##查看有多少通路
length(unlist(kegg_pathway_database@pathway_name))
[1] 104
观察一下kegg_pathway_database的结果,共有104个通路,我们只需要关注这5个内容即可,一个最简单的思路就是通过for循环遍历将各个通路的信息提取出来,当然也可以用lapply等函数解析列表。
但是要注意一个细节,就是有的通路是没有gene或者compound对应, 也没有前两层级的KEGG信息,因此这部分需要我们for循环中多添加一个条件,如果遍历到这几行,我们赋值为None。
提取通路与gene对应信息
path_num <- c(68:76) ## 排除没有对应gene的几个通路
## 提取1到67 77 到104的通路
result1 <- NULL
for (i in 1:104) {
a <- tgo_data[[i]]$pathway_id # 提取id
b <- tgo_data[[i]]$pathway_name # 提取名称
e <- tgo_data[[i]]$gene_list # 提取gene对应关系
c <- tgo_data[[i]]$describtion
if ( i %in% path_num){
d <- 'None;None'
}else {
d <- tgo_data[[i]]$pathway_class # 提取前两层级注释
Pathway_re <- e%>% mutate(pathway_id = a,
pathway_name = b,
pathway_class= d) %>%
separate(pathway_class,into =c("Pathway1","Pathway2"),sep = ';',remove = FALSE) ##前两层分开
result1 <- rbind(result1,Pathway_re)}
}
write.table(result1, 'tgo_KEGG_path.tsv', sep = '\t',row.names = FALSE,quote = FALSE)
gene、注释及前几层通路信息如下:
提取通路与化合物对应信息
result2 <- NULL
com_num <- c(38,68:76,78:94,96,98,103) ## 排除没有对应化合物的几个通路
for (i in 1:104) {
a <- tgo_data[[i]]$pathway_id # 提取id
b <- tgo_data[[i]]$pathway_name # 提取名称
f <- tgo_data[[i]]$compound_list # 提取化合物对应关系
# c <- tgo_data[[i]]$describtion
if ( i %in% com_num){
d <- 'None;None'
}else {
d <- tgo_data[[i]]$pathway_class
Compound_re <- f %>% mutate(pathway_id = a,
pathway_name = b,
pathway_class= d)%>%
separate(pathway_class,into =c("Pathway1","Pathway2"),sep = ';',remove = FALSE)
result2 <- rbind(result2,Compound_re)
}
}
write.table(result2, 'tgo_KEGG_com.tsv', sep = '\t',row.names = FALSE,quote = FALSE)
化合物、名称及通路对应信息如下:
代谢物富集分析
有了上面的compound对应信息,我们只需提取其中几列作为背景文件轻松用clusterprofiler包进行富集。
library(clusterProfiler)
##制作背景文件
com_ano <- result2 %>% select(KEGG.ID,pathway_id,pathway_name)
## 富集ID
gene_select <- sample(com_ano$KEGG.ID,100)
#KEGG 富集分析
#默认以所有注释到 KEGG 的基因为背景集,也可通过 universe 参数指定其中的一个子集作为背景集
#默认以 p<0.05 为标准,Benjamini 方法校正 p 值,q 值阈值 0.2
#默认输出 top500 富集结果
kegg_rich <- enricher(gene = gene_select,
TERM2GENE = com_ano[c('pathway_id', 'KEGG.ID')],
TERM2NAME = com_ano[c('pathway_id', 'pathway_name')],
pvalueCutoff = 0.05,
pAdjustMethod = 'BH',
qvalueCutoff = 1,
maxGSSize = 500)
dotplot(kegg_rich) #富集气泡图
cnetplot(kegg_rich) #网络图展示富集功能和基因的包含关系
emapplot(kegg_rich) #网络图展示各富集功能之间共有基因关系
heatplot(kegg_rich)