最近手頭處理一批代謝組數據, 想基于幾十個關鍵差異代謝物代謝物進行下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)