Tools:eggnog-mapper全新的功能注釋工具,構建自己的Orgdb數據庫

不要還守著GO分析不放手了。來看看新的工具。
eggnog-mapper官網
徐州更的教程
主要是數據庫功能比較全,問題是數據庫比較大,需要下載時間比較長。而且部分內容不是最新版的。
主要使用環境是:用于注釋新的基因組、轉錄組、微生物(宏基因組)
最新版本的是V2版本 github

  • 新增加了GO、KEGG的數據庫
  • 優點是:使用的是直系同源的序列進行功能注釋
  1. 使用conda安裝emapper
    conda install -c bioconda eggnog-mapper
    2.下載數據庫
    eggnog5 下載數據庫
    需要下載的文件有:
    eggnog.db.gz
    eggnog_proteins.dmnd.gz
    選擇當前最新的版本下載

準備的輸入文件

3.開始分析

abbr="C.idella"
sed -i 's/.$//g' ${abbr}.pep.fa #刪除序列行尾多余的.
emapper.py -i ${abbr}.pep.fa -o ${abbr} -m diamond --cpu 24 #指定24個cpu來進行分析
sed '/^##/d' ${abbr}.emapper.annotations|sed 's/#//' > emapper.annotations.tsv #刪除以##開頭的行,同時刪除表頭行的#

4.構建自己的orgdb數據庫(多線程,速度非常快)

library(tidyverse)
library(KEGGREST)
library(AnnotationForge) 
library(clusterProfiler) 
library(jsonlite) 
library(purrr) 
library(RCurl)
if(! require("parallel"))install.packages("parallel")
library(parallel)#用于后面的多線程

emapper <- rio::import('emapper.annotations.tsv')
#將空值替換為NA,方便后續使用na.omit()函數提出沒有注釋到的行 
emapper[emapper==""]<-NA
###########################提取GO信息#############
#提取query列,Preferred_named列,GO列
gene_info <- emapper %>% dplyr::select(GID = query, GENENAME = Preferred_name) %>% na.omit() 
gos <- emapper %>% dplyr::select(query, GOs) %>% na.omit()
#構建一個空的數據框為后面填充數據
gene2go = data.frame(GID = character(),
                     GO = character(),
                     EVIDENCE = character())
#填充gene2go數據框(這一步時間比較長,所以開啟多線程)
# for (row in 1:nrow(gos)) { 
#   the_gid <- gos[row, "query"][[1]] 
#   the_gos <- str_split(gos[row,"GOs"], ",", simplify = FALSE)[[1]] 
#   df_temp <- data_frame(GID = rep(the_gid, length(the_gos)), 
#                         GO = the_gos, 
#                         EVIDENCE = rep("IEA", length(the_gos))) 
#   gene2go <- rbind(gene2go, df_temp)}

#####################多線程開始
#檢測當前可用的cpu核數
cl.cores <- detectCores()
#使用指定核數8,開啟集群任務
cl <- makeCluster(8)
###并行任務
#定義并行的函數
getgene2go <- function(row){
  the_gid <- gos[row, "query"][[1]] 
  the_gos <- str_split(gos[row,"GOs"], ",", simplify = FALSE)[[1]] 
  df_temp <- data_frame(GID = rep(the_gid, length(the_gos)), 
                        GO = the_gos, 
                        EVIDENCE = rep("IEA", length(the_gos))) 
  return(df_temp)
}
#開始并行分析
list_rows <- 1:nrow(gos)
clusterExport(cl,"gos")#導入外部變量gos
clusterEvalQ(cl, library(tidyverse))#加載外部環境的包tidyverse
gene2go <- parLapply(cl,list_rows,getgene2go) # lapply的并行版本
gene2go <- do.call('rbind',gene2go) # 整合結果
# 關閉集群任務
stopCluster(cl)
#####################多線程結束

#將“-”替換為NA,然后使用na.omit()刪除含有NA的行
gene2go$GO[gene2go$GO=="-"]<-NA 
gene2go<-na.omit(gene2go)
save(gene2go,file="gene2go.RData")

############提取KEGG信息##################
#將emapper中query列,KEGG_ko列提取出來
gene2ko <- emapper %>% dplyr::select(GID = query, Ko = KEGG_ko) %>% na.omit() 
#將gene2ko的Ko列中"ko:"刪除,不然后面找pathway會報錯 
gene2ko$Ko <- gsub("ko:","",gene2ko$Ko)

#從https://www.genome.jp/kegg-bin/download_htext?htext=ko00001&format=json&filedir= 下載ko00001.json文件,主要是用來解析kegg的文件結構,并不是作為數據庫,因此只下載這一個即可
update_kegg <- function(json = "ko00001.json") { 
  pathway2name <- tibble(Pathway = character(), Name = character()) 
  ko2pathway <- tibble(Ko = character(), Pathway = character()) 
  kegg <- fromJSON(json) 
  for (a in seq_along(kegg[["children"]][["children"]])) { 
    A <- kegg[["children"]][["name"]][[a]] 
    for (b in seq_along(kegg[["children"]][["children"]][[a]][["children"]])) { 
      B <- kegg[["children"]][["children"]][[a]][["name"]][[b]] 
      for (c in seq_along(kegg[["children"]][["children"]][[a]][["children"]][[b]][["children"]])) { 
        pathway_info <- kegg[["children"]][["children"]][[a]][["children"]][[b]][["name"]][[c]] 
        pathway_id <- str_match(pathway_info, "ko[0-9]{5}")[1] 
        pathway_name <- str_replace(pathway_info, " \\[PATH:ko[0-9]{5}\\]", "") %>% str_replace("[0-9]{5} ", "") 
        pathway2name <- rbind(pathway2name, tibble(Pathway = pathway_id, Name = pathway_name))
        kos_info <- kegg[["children"]][["children"]][[a]][["children"]][[b]][["children"]][[c]][["name"]] 
        kos <- str_match(kos_info, "K[0-9]*")[,1] 
        ko2pathway <- rbind(ko2pathway, tibble(Ko = kos, Pathway = rep(pathway_id, length(kos))))}}} 
   save(pathway2name, ko2pathway, file = "kegg_info.RData")} 
# 調用函數后在本地創建kegg_info.RData文件 
update_kegg() 
# 載入kegg_info.RData文件 
load(file = "kegg_info.RData")

#根據gene2ko中的ko信息將gene2ko中的Pathway列提取出來
gene2pathway <- gene2ko %>% left_join(ko2pathway, by = "Ko") %>% dplyr::select(GID, Pathway) %>% na.omit()

####去除重復
gene2go <- unique(gene2go) 
gene2go <- gene2go[!duplicated(gene2go),] 
gene2ko <- gene2ko[!duplicated(gene2ko),] 
gene2pathway <- gene2pathway[!duplicated(gene2pathway),]

save(pathway2name, ko2pathway,gene2pathway,file="KEGG.RData")
#save.image(file="All.Rdata") #保存所有的數據到ALL.Rdata

############構建OrgDb(注意:郵箱(作者和維護者)中不能包括“_”)
tax_id = "7959"
genus = "Ctenopharyngodon"
species = "idella"
makeOrgPackage(gene_info=gene_info,
               go=gene2go,
               ko=gene2ko,
               maintainer='chaimol <chaimol@163.com>',#你自己的郵箱
               author='chaimol <chaimol@163.com>',#你自己的郵箱
               pathway=gene2pathway,
               version="0.0.1",
               outputDir =".",#輸出路徑
               tax_id=tax_id,#你的物種在NCBI的id
               genus=genus,#屬名
               species=species,#種名
               goTable="go")

## 安裝剛剛創建完成的orgdb數據庫
## then you can call install.packages based on the return value
install.packages("org.Cidella.eg.db", repos=NULL,type="source")

使用創建的orgdb進行GO富集分析

library(org.Cidella.eg.db)
library(tidyverse)
library(clusterProfiler)
#顯示所有的列名
columns(org.Cidella.eg.db)
##[1] "EVIDENCE"    "EVIDENCEALL" "GENENAME"    "GID"         "GO"          "GOALL"       "Ko"          "ONTOLOGY"    "ONTOLOGYALL" "Pathway"  
#顯示所有的基因
keys(org.Cidella.eg.db)
#查看數據庫總共有多少基因
length(keys(org.Cidella.eg.db))

genel <- read.csv("test.csv",header=FALSE) #讀取一個基因列表
ego <- enrichGO(gene          = genel,
                OrgDb         = org.Cidella.eg.db,
                keyType = "GID",
                ont           = "ALL",
                pAdjustMethod = "BH",
                pvalueCutoff  = 0.01,
                qvalueCutoff  = 0.05)
head(ego)
dotplot(ego)

進行KEGG富集分析 沒法使用Orgdb,所以只能使用enricher函數來實現。其實GO也可以同樣完成

需要提供TERM2GENE和TERM2NAME參數。

  • TERM2GENE格式如下
ko04012 Cli01G000030
  • TERM2NAME格式如下
ko00010 Glycolysis / Gluconeogenesis

使用上面輸出的KEGG.Rdata來創建上述2個文件。

load("KEGG.RData")
pathway2name$Name <- gsub(" \\[BR:ko[0-9]{5}\\]","",pathway2name$Name) #刪除BR:ko等字符
pathway2name <- na.omit(pathway2name)

term2gene <- gene2pathway[,c("Pathway","GID")]
term2name <- pathway2name
ego_kegg <- enricher(gene = genel,
                     TERM2GENE = term2gene,
                     TERM2NAME = term2name)
head(ego_kegg)
dotplot(ego_kegg)
cnetplot(ego_kegg,layout = "circle")
cnetplot(ego_kegg)

參考1:http://www.lxweimin.com/p/f2e4dbaae719
參考作者:三點水的番薯 鏈接:http://www.lxweimin.com/p/0bcc3db0d7e8

在使用parLapply的時候需要開啟多線程,同時使用下面的命令分別導入環境中的變量和包。否則多線程里無法使用環境中的變量和包。

clusterExport(cl,"gos")#導入外部變量gos
clusterEvalQ(cl, library(tidyverse))#加載外部環境的包tidyverse

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,527評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,687評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,640評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,957評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,682評論 6 413
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,011評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,009評論 3 449
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,183評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,714評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,435評論 3 359
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,665評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,148評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,838評論 3 350
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,251評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,588評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,379評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,627評論 2 380

推薦閱讀更多精彩內容