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
    选择当前最新的版本下载

准备的输入文件

  • 物种的蛋白文件(注意:蛋白序列的名称一定是以后你要做富集分析的基因名称的格式,如果不一样,后续你可能需要重新制作orgdb)
  • 从https://www.ncbi.nlm.nih.gov/taxonomy 输入物种拉丁名称,查询你的物种的tax_id。例如:Ctenopharyngodon idella 对应的id是7959
  • 从https://www.genome.jp/kegg-bin/download_htext?htext=ko00001&format=json&filedir= 下载ko00001.json文件,主要是用来解析kegg的文件结构,并不是作为数据库,因此只下载这一个即可

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 ',#你自己的邮箱
               author='chaimol ',#你自己的邮箱
               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:https://www.jianshu.com/p/f2e4dbaae719
参考作者:三点水的番薯 链接:https://www.jianshu.com/p/0bcc3db0d7e8

在使用parLapply的时候需要开启多线程,同时使用下面的命令分别导入环境中的变量和包。否则多线程里无法使用环境中的变量和包。

clusterExport(cl,"gos")#导入外部变量gos
clusterEvalQ(cl, library(tidyverse))#加载外部环境的包tidyverse

你可能感兴趣的:(Tools:eggnog-mapper全新的功能注释工具,构建自己的Orgdb数据库)