【生信实战】最详细的非模式物种的GO/KEGG富集分析全攻略

有时候不得不感慨,时间已经来到了2024年的尾声,但是对于许多非模式的物种来说,各种工具、数据集、参考等等依然还在寒冬。今天带大家手动的构建属于小众物种的富集分析全攻略。

1. 简介

相信每一个做过生信的人来说,对于GO/KEGG等富集分析并不陌生。有越来越多的工具和云平台可以提供这些分析。然而,对于许多对于许多农口或者微生物研究人员来说,由于低质量的参考基因组,和无人构建的数据集都使得这一“简单”的需求莫名的走了许多弯路。
其实,简单来说,对于任何一个物种都需要对应的基因->条目Term这样的关系表,有了这样的关系就可以构建我们的抽奖模型“超分布几何检验”。只不过对于大多数的模式物种来说,有大量的前辈已经把这些整理好了;前人栽树,后人乘凉即可。所以,理论上当我们没有现成的数据库时,就需要我们构建自己的物种的注释数据库,就可以轻松的完成今后的富集分析。

2.注释库构建

注释库的构建我们使用eggNOG,eggNOG(evolutionary genealogy of genes: Non-supervised Orthologous Groups)是一种用于基因组功能注释的数据库和工具,广泛应用于基因组学和生物信息学研究。目前已经更新到了eggNOG v5版本,他可以一次性的完整GO/COG/KEGG/PFAM等一系列的注释。

2.1 准备工作

1. 全转录本/基因的核酸或蛋白序列: 通常为fasta格式,里面包含了我们物种的所有基因/转录本。当然如果是组装程度极低或者甚至无参考的,可能是一些contig/scaffold。
2.eggNOG-maaper:该工具可以在github上下载https://github.com/eggnogdb/eggnog-mapper/releases/
3.eggNOG数据库:这部份建议手动下载,目前最新版本的地址如下:

http://eggnog6.embl.de/download/emapperdb-5.0.2/eggnog_proteins.dmnd.gz
http://eggnog6.embl.de/download/emapperdb-5.0.2/mmseqs.tar.gz
http://eggnog6.embl.de/download/emapperdb-5.0.2/eggnog.db.gz
http://eggnog6.embl.de/download/emapperdb-5.0.2/eggnog.taxa.tar.gz
http://eggnog6.embl.de/download/emapperdb-5.0.2/pfam.tar.gz

2.2 比对数据库

安装好eggNOG-maaper,和对应的python依赖后将我们下载的数据库解压到eggNOG-mapper的data目录下,结构大致如下:

data/
├── eggnog.db
├── eggnog_proteins.dmnd
├── eggnog.taxa.db
├── eggnog.taxa.db.traverse.pkl
├── mmseqs
│   ├── mmseqs.db
│   ├── mmseqs.db.dbtype
│   ├── mmseqs.db_h
│   ├── mmseqs.db_h.dbtype
│   ├── mmseqs.db_h.index
│   ├── mmseqs.db.index
│   ├── mmseqs.db.lookup
│   └── mmseqs.db.source
└── pfam
    ├── Pfam-A.clans.tsv.gz
    ├── Pfam-A.hmm
    ├── Pfam-A.hmm.h3f
    ├── Pfam-A.hmm.h3i
    ├── Pfam-A.hmm.h3m
    ├── Pfam-A.hmm.h3m.ssi
    ├── Pfam-A.hmm.h3p
    └── Pfam-A.hmm.idmap

如果我们的输入是蛋白序列则使用nohup emapper.py -i proteins.fa -o myeggnog --cpu 12 --dbmem -m diamond &
如果我们的是核酸序列则需要先翻译,此时使用命令nohup emapper.py -i gene.fa --itype genome -o myeggnog --translate --cpu 12 --dbmem -m diamond &
具体的其他参数可以通过-h进行查看,cpu数可以根据实际调整。

2.3 整理结果

当emapper比对完毕后会得到 myeggnog.emapper.annotations文件,该文件就是我们后面用于构建我们自己GO/KEGG数据库的关键,我们需要对结果进行进一步的整理。

library(tidyverse)
egg <- read_tsv('myeggnog.emapper.annotations', comment = '##') %>% mutate( `#query` = str_replace( `#query`, "_\\d+$", "")) %>% group_by(`#query`) %>% top_n( n=1, wt = score)
egg_df <- egg %>% select(GID = `#query`, GOs, KEGG_ko) %>% filter(GOs != '-', KEGG_ko != '-') %>% separate_rows(GOs, sep = ",")  %>% separate_rows(KEGG_ko, sep = ",") 
egg_df <- egg_df %>% mutate(KEGG_ko = str_replace_all(KEGG_ko,'ko:','')) %>% rename(KO = KEGG_ko) %>% distinct()
library(KEGGREST)
kegg_pathways <- keggList("pathway", "ko") # "ko" 表示 KO 专用的 pathway
kegg_ko_pathways <- keggLink("ko", "pathway")
kegg_db <- tibble(Pathway = names(kegg_pathways), Name = kegg_pathways)
kegg_db <- tibble(Ko = sub("ko:","", kegg_ko_pathways), Pathway = sub("path:", "", names(kegg_ko_pathways))) %>% filter(str_detect(Pathway, '^ko'))  %>% inner_join(kegg_db, by = 'Pathway')
gene_info <- egg %>% select(GID = `#query`, GENENAME = seed_ortholog) 
gene2go <- egg_df %>% select(GID, GOs) %>% mutate(EVIDENCE = 'IEA') %>% distinct() %>% rename(GO = GOs)
koterms <- egg_df %>% select(GID, KO) %>% distinct()
gene2pathway <- kegg_db %>% inner_join(koterms, by = c('Ko' = 'KO')) %>% select(GID, Pathway) %>% distinct()
library(AnnotationForge)
makeOrgPackage(gene_info=gene_info, go=gene2go, ko=koterms,  pathway=gene2pathway, version="1.0.0", maintainer='Terry Xizzy <xxx@gmail.com>', author='Terry Xizzy <xxx@gmail.com>',outputDir=".", tax_id="12345", genus="Genus", species="species",goTable="go")
kegg_df <- koterms %>% inner_join(kegg_db, by = c('KO' = 'Ko')) %>% write_tsv('MyKEGG.xls')

在实际运行中只需要修改自己的输入文件名即可。这里的结果是基于5.0.2构建,后续可能出现列名变化的情况,需要根据实际进行调整。
代码运行完毕后会在目录下生成用于GO富集的Org会根据genusspecies生成,这里就是org.Gspecies.eg.db,使用install.packages("org.Gspecies.eg.db",repos = NULL, type = "source")安装我们的包,后续分析时候只需要参考正常的clusterProfiler方法,详细的方法可以参考我以前的文章,核心步骤如下:

library(org.Gspecies.eg.db))
Db <- org.Gspecies.eg.db
enrichGO(gene_list, OrgDb = Db, ont='ALL',pAdjustMethod = 'BH',pvalueCutoff = 1,qvalueCutoff = 1,keyType = 'SYMBOL')

这里有一点需要注意的是,我们构建数据使用的GID应该和我们输入的gene_list的使用同一种
而KEGG的分析则需要我们手动使用 enricher进行,关键代码如下:

library(tidyverse)
library(clusterProfiler)
kegg_df <- read_tsv('MyKEGG.xls')
#这里用于测试我们取前100个GID作为gene_list进行分析
gene_list <- kegg_df$GID[1:100]
kegg_res <- enricher(gene_list, TERM2GENE = select(kegg_df, Pathway, GID),  TERM2NAME = select(kegg_df, Pathway, Name), pvalueCutoff = 1,qvalueCutoff = 1)
kegg_res %>% as_tibble

输出如下:

kegg_res %>% as_tibble
# A tibble: 134 × 9
   ID      Description GeneRatio BgRatio   pvalue p.adjust   qvalue geneID Count
   <chr>   <chr>       <chr>     <chr>      <dbl>    <dbl>    <dbl> <chr>  <int>
 1 ko01120 Microbial … 70/81     162/46… 3.75e-97 5.02e-95 3.04e-95 unass…    70
 2 ko00010 Glycolysis… 46/81     46/4637 1.58e-88 1.06e-86 6.41e-87 unass…    46
 3 ko01110 Biosynthes… 75/81     441/46… 1.05e-71 4.69e-70 2.84e-70 unass…    75
 4 ko01200 Carbon met… 51/81     113/46… 9.27e-67 3.10e-65 1.88e-65 unass…    51

至此,我们就可以对任意的物种轻松的进行GO/KEGG分析,一起动手试试吧!

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,384评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,845评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,148评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,640评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,731评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,712评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,703评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,473评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,915评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,227评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,384评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,063评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,706评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,302评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,531评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,321评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,248评论 2 352

推荐阅读更多精彩内容