跳转至

宏基因组功能注释——eggNOG-mapper实战

一句话概述

eggNOG-mapper是基于eggNOG数据库的快速功能注释工具,可将蛋白质序列一步映射到COG类别、KEGG通路、GO术语等多种功能分类体系,是宏基因组功能注释的首选工具之一。


核心知识点表格

知识点说明
eggNOG数据库evolutionary genealogy of genes: Non-supervised Orthologous Groups,包含>5000个物种的直系同源基因簇
OG (Orthologous Group)直系同源基因组,由进化树推断的功能等价基因集合
COG分类Clusters of Orthologous Groups,25个功能大类(如J=翻译、K=转录)
KEGG注释将基因映射到KEGG通路、KO编号
GO注释Gene Ontology三大类:分子功能(MF)、生物过程(BP)、细胞组分(CC)
emapper.pyeggNOG-mapper的核心命令行程序
DIAMONDeggNOG-mapper默认的序列比对引擎(比BLAST快500-20000x)
MMseqs2可选的更快比对引擎
seed_orthologseggNOG中用于构建OG的参考序列
税级限制(tax_scope)限制搜索的分类学范围以提高准确性和速度

各步骤详解

第一步:理解eggNOG数据库结构

白话解释: eggNOG把来自数千个物种的蛋白质按进化关系分组。同一组里的蛋白质来自共同祖先,大概率有相同功能。不同分类层级(如细菌域、变形菌门)都有对应的分组。

技术细节: - eggNOG v5.0包含4.4M个OGs,覆盖5090个物种(注:eggNOG最新版为v7,覆盖12535个物种、3.18M个OGs,但eggNOG-mapper v2仍默认使用v5.0数据) - 每个OG包含多层信息:COG category、KEGG KO、GO terms、EC number、CAZy、PFAM等 - 数据库按分类学层级组织:2(bacteria)、2157(archaea)、2759(eukaryota)等 - 本地数据库约60-100GB(全量)

数据库层级示例:

eggNOG v5.0(eggNOG-mapper v2 默认数据库)
├── root (LUCA level)
├── Bacteria (tax_id=2)
│   ├── Proteobacteria (tax_id=1224)
│   │   ├── Gammaproteobacteria
│   │   └── Alphaproteobacteria
│   └── Firmicutes (tax_id=1239)
├── Archaea (tax_id=2157)
└── Eukaryota (tax_id=2759)


第二步:安装eggNOG-mapper

白话解释: 安装emapper有两种方式:conda安装程序本体 + 下载配套数据库。数据库很大,需要提前准备。

代码示例:

# 方法1:conda安装(推荐)
conda create -n emapper python=3.9
conda activate emapper
conda install -c bioconda eggnog-mapper

# 方法2:pip安装
pip install eggnog-mapper

# 方法3:源码安装
git clone https://github.com/eggnogdb/eggnog-mapper.git
cd eggnog-mapper
pip install .

# 下载数据库(必须!约45GB)
download_eggnog_data.py --data_dir /data/eggnog_db/ -y

# 下载DIAMOND数据库(核心)
download_eggnog_data.py -D --data_dir /data/eggnog_db/ -y

# 下载特定tax scope的HMM数据库(可选,用于hmmer模式)
download_eggnog_data.py -H -d 2 --data_dir /data/eggnog_db/ -y  # bacteria
download_eggnog_data.py -H -d 2157 --data_dir /data/eggnog_db/ -y  # archaea

# 验证安装
emapper.py --version
emapper.py --data_dir /data/eggnog_db/ --list_taxa

第三步:输入文件准备

白话解释: eggNOG-mapper的输入是蛋白质序列(FASTA格式)。在宏基因组分析中,通常先用Prodigal等工具从组装的contigs预测ORF,再将翻译后的蛋白质序列提交注释。

技术细节: - 输入格式:FASTA(蛋白质或核苷酸) - 推荐使用蛋白质序列(更灵敏) - 序列ID不要含有特殊字符(空格、#等) - 大数据集建议拆分(每份100k-500k条序列)并行处理

代码示例:

# 从组装的contigs预测ORF(使用Prodigal)
prodigal -i assembled_contigs.fa \
         -o genes.gff \
         -a proteins.faa \        # 蛋白质序列输出
         -d genes.fna \           # 核苷酸序列输出
         -p meta \                # 宏基因组模式
         -f gff

# 检查蛋白序列数量
grep -c ">" proteins.faa

# 清理序列头(去除Prodigal额外信息)
sed 's/ .*//' proteins.faa > proteins_clean.faa

# 大文件拆分
# 拆成每份10万条序列
awk 'BEGIN{n=0; file="split_00.faa"} /^>/{n++; if(n%100000==1){file=sprintf("split_%02d.faa",n/100000)}} {print > file}' proteins_clean.faa

# 或使用seqkit拆分
seqkit split2 -s 100000 proteins_clean.faa -O split_dir/

第四步:运行eggNOG-mapper

白话解释: 核心命令就是emapper.py,指定输入文件、输出前缀和数据库路径即可。它先做序列比对找到最佳匹配的OG,再把OG对应的所有注释转移给你的序列。

技术细节: - 搜索模式:diamond(默认)、mmseqshmmer - DIAMOND模式最常用:快速,适合大数据集 - HMMer模式更灵敏但更慢,适合远缘同源 - --tax_scope限制搜索范围可显著提升速度 - --go_evidence控制GO证据等级过滤

代码示例:

# === 基本运行 ===
emapper.py -i proteins_clean.faa \
           --output sample1 \
           --output_dir /results/emapper/ \
           --data_dir /data/eggnog_db/ \
           --cpu 16 \
           --override

# === 宏基因组推荐参数 ===
emapper.py -i proteins_clean.faa \
           -m diamond \
           --itype proteins \
           --tax_scope Bacteria \
           --go_evidence non-electronic \
           --target_orthologs all \
           --seed_ortholog_evalue 1e-5 \
           --seed_ortholog_score 60 \
           --query_cover 20 \
           --subject_cover 20 \
           --output sample1_emapper \
           --output_dir /results/emapper/ \
           --data_dir /data/eggnog_db/ \
           --cpu 32 \
           --override \
           --temp_dir /tmp/emapper/

# === 分步运行(大数据集推荐) ===
# 步骤1:搜索阶段(最耗时)
emapper.py -i proteins_clean.faa \
           -m diamond \
           --itype proteins \
           --data_dir /data/eggnog_db/ \
           --cpu 32 \
           --no_annot \
           --output sample1 \
           --output_dir /results/emapper/ \
           --override

# 步骤2:注释阶段(基于步骤1的结果)
emapper.py --annotate_hits_table /results/emapper/sample1.emapper.seed_orthologs \
           --data_dir /data/eggnog_db/ \
           --cpu 16 \
           --go_evidence non-electronic \
           --tax_scope Bacteria \
           --output sample1 \
           --output_dir /results/emapper/ \
           --override

# === 使用MMseqs2(更快) ===
emapper.py -i proteins_clean.faa \
           -m mmseqs \
           --data_dir /data/eggnog_db/ \
           --cpu 32 \
           --output sample1_mmseqs \
           --output_dir /results/emapper/ \
           --override

第五步:解读输出结果

白话解释: emapper输出一个大表格(TSV),每行是一个查询蛋白,列包含它匹配到的OG、COG类别、KEGG KO号、GO terms等多维注释信息。

技术细节: - 核心输出文件:*.emapper.annotations - 主要列含义见下表 - 还会生成seed_orthologs文件(比对详情) - pfam/GO/KEGG等可能为空(并非所有蛋白都有完整注释)

输出列说明:

列名含义
query查询序列ID
seed_ortholog最佳匹配的eggNOG seed序列
evalueE-value
score比对得分
eggNOG_OGs匹配的OG(多层级)
COG_categoryCOG功能分类字母(可多个)
Description功能描述
Preferred_name基因名缩写
GOsGO terms(逗号分隔)
KEGG_koKEGG KO编号
KEGG_PathwayKEGG通路
KEGG_ModuleKEGG模块
PFAMsPFAM域
CAZy碳水化合物活性酶分类
EC酶分类编号

代码示例:

# 查看输出文件结构
head -5 sample1_emapper.emapper.annotations

# 统计注释率
total=$(grep -c ">" proteins_clean.faa)
annotated=$(grep -v "^#" sample1_emapper.emapper.annotations | wc -l)
echo "Annotation rate: $annotated / $total = $(echo "scale=2; $annotated*100/$total" | bc)%"

# 提取COG分类统计
grep -v "^#" sample1_emapper.emapper.annotations | \
  cut -f7 | grep -v "^-$" | grep -o . | sort | uniq -c | sort -rn

# 提取KEGG KO列表
grep -v "^#" sample1_emapper.emapper.annotations | \
  cut -f12 | grep -v "^-$" | tr ',' '\n' | sort -u > kegg_ko_list.txt

# 提取GO terms
grep -v "^#" sample1_emapper.emapper.annotations | \
  cut -f10 | grep -v "^-$" | tr ',' '\n' | sort -u > go_terms_list.txt

第六步:下游分析与可视化

白话解释: 拿到注释结果后,通常做:(1) COG功能分类柱状图;(2) KEGG通路富集分析;(3) 多样本间功能差异比较。

代码示例:

# R语言处理emapper结果
library(tidyverse)

# 读取注释结果
emapper <- read_tsv("sample1_emapper.emapper.annotations",
                    comment = "##",
                    col_names = TRUE)

# === COG分类统计与可视化 ===
cog_categories <- c(
  "J" = "Translation", "A" = "RNA processing",
  "K" = "Transcription", "L" = "Replication",
  "B" = "Chromatin", "D" = "Cell cycle",
  "Y" = "Nuclear structure", "V" = "Defense mechanisms",
  "T" = "Signal transduction", "M" = "Cell wall",
  "N" = "Cell motility", "Z" = "Cytoskeleton",
  "W" = "Extracellular structures", "U" = "Intracellular trafficking",
  "O" = "PTM/chaperones", "X" = "Mobilome",
  "C" = "Energy production", "G" = "Carbohydrate metabolism",
  "E" = "Amino acid metabolism", "F" = "Nucleotide metabolism",
  "H" = "Coenzyme metabolism", "I" = "Lipid metabolism",
  "P" = "Inorganic ion transport", "Q" = "Secondary metabolites",
  "R" = "General function", "S" = "Function unknown"
)

# 提取并统计COG
cog_data <- emapper %>%
  filter(COG_category != "-") %>%
  mutate(COG_split = strsplit(COG_category, "")) %>%
  unnest(COG_split) %>%
  count(COG_split) %>%
  mutate(description = cog_categories[COG_split])

# 画图
ggplot(cog_data, aes(x = reorder(COG_split, -n), y = n, fill = COG_split)) +
  geom_bar(stat = "identity") +
  labs(x = "COG Category", y = "Gene Count",
       title = "COG Functional Classification") +
  theme_minimal() +
  theme(legend.position = "none")

# === KEGG通路分析 ===
# 提取KO编号
ko_list <- emapper %>%
  filter(KEGG_ko != "-") %>%
  separate_rows(KEGG_ko, sep = ",") %>%
  mutate(KEGG_ko = str_remove(KEGG_ko, "ko:"))

# 统计各KO出现频次
ko_counts <- ko_list %>%
  count(KEGG_ko, sort = TRUE)

# 使用clusterProfiler做KEGG富集(需要转换)
library(clusterProfiler)
# 将KO映射到pathway
# enrichKEGG需要KEGG gene ID或KO ID

# === 多样本比较 ===
# 假设有多个样本的emapper结果
samples <- c("sample1", "sample2", "sample3")
all_cog <- map_dfr(samples, function(s) {
  read_tsv(paste0(s, "_emapper.emapper.annotations"), comment = "##") %>%
    filter(COG_category != "-") %>%
    mutate(sample = s)
})
# Python处理emapper结果
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

# 读取注释结果
df = pd.read_csv("sample1_emapper.emapper.annotations",
                 sep="\t", comment="#",
                 header=0)

# KEGG模块统计
kegg_modules = df['KEGG_Module'].dropna()
kegg_modules = kegg_modules[kegg_modules != '-']
module_counts = kegg_modules.str.split(',').explode().value_counts().head(20)

# 可视化
fig, ax = plt.subplots(figsize=(10, 6))
module_counts.plot(kind='barh', ax=ax)
ax.set_xlabel('Gene Count')
ax.set_title('Top 20 KEGG Modules')
plt.tight_layout()
plt.savefig('kegg_modules.pdf')

实战命令(可复制)

# ===== 一站式宏基因组功能注释流程 =====

# 1. 从组装结果预测蛋白
prodigal -i final_contigs.fa -a proteins.faa -p meta -f gff -o genes.gff

# 2. 清理序列头
sed 's/ .*//' proteins.faa > proteins_clean.faa

# 3. 运行eggNOG-mapper(DIAMOND模式)
emapper.py -i proteins_clean.faa \
  -m diamond \
  --itype proteins \
  --data_dir /data/eggnog_db/ \
  --tax_scope Bacteria \
  --go_evidence non-electronic \
  --seed_ortholog_evalue 1e-5 \
  --seed_ortholog_score 60 \
  --cpu 32 \
  --output metagenome_func \
  --output_dir ./emapper_results/ \
  --temp_dir /tmp/emapper_tmp/ \
  --override

# 4. 统计注释率
echo "Total proteins: $(grep -c '>' proteins_clean.faa)"
echo "Annotated: $(grep -v '^#' emapper_results/metagenome_func.emapper.annotations | wc -l)"

# 5. 提取各功能分类
# COG
grep -v '^#' emapper_results/metagenome_func.emapper.annotations | \
  awk -F'\t' '$7!="-"' | cut -f1,7 > cog_assignments.tsv

# KEGG KO
grep -v '^#' emapper_results/metagenome_func.emapper.annotations | \
  awk -F'\t' '$12!="-"' | cut -f1,12 > kegg_ko_assignments.tsv

# GO
grep -v '^#' emapper_results/metagenome_func.emapper.annotations | \
  awk -F'\t' '$10!="-"' | cut -f1,10 > go_assignments.tsv

# PFAM
grep -v '^#' emapper_results/metagenome_func.emapper.annotations | \
  awk -F'\t' '$21!="-"' | cut -f1,21 > pfam_assignments.tsv

# 6. 可视化(使用R或Python脚本处理上述TSV文件)

面试常问点

Q1: eggNOG和COG/KOG有什么关系?

A: COG最初是NCBI基于原核生物基因组构建的直系同源基因簇;KOG是真核版本。eggNOG是COG/KOG的扩展和更新,覆盖更多物种(5000+),使用更先进的系统发育方法构建OG,且提供多层级分类学分辨率的OG。eggNOG v5.0兼容原COG分类字母体系。最新的eggNOG v7(2025年发布)采用全新的系统发育、结构域驱动方法构建OG,覆盖12535个物种。

Q2: eggNOG-mapper的搜索模式如何选择?

A: DIAMOND模式:默认推荐,速度快、灵敏度好,适合大多数场景尤其宏基因组。MMseqs2模式:比DIAMOND更快但略微降低灵敏度。HMMer模式:灵敏度最高但最慢,适合远缘同源检测或特定分类群的精确注释。

Q3: --tax_scope参数的作用和建议?

A: 限制搜索范围在特定分类学层级内。作用:(1) 加速搜索(数据库子集更小);(2) 提高注释准确性(避免跨域的错误匹配)。建议:宏基因组如果确定是细菌为主用BacteriaProkaryota;未知组成则用默认(auto);环境样本混合真核原核时用root

Q4: 如何评估注释质量?

A: (1) 注释率:通常宏基因组蛋白40-70%能被注释;(2) E-value分布:多数应<1e-10;(3) 与其他注释工具对比(如InterProScan/KEGG官方KAAS)一致性;(4) 已知marker基因的注释是否正确;(5) COG类别分布是否合理(S类"未知功能"通常占比最高)。

Q5: eggNOG-mapper vs InterProScan vs KEGG GhostKOALA的优劣?

A: eggNOG-mapper:速度快,一步给出多维注释(COG/KEGG/GO/PFAM),适合大规模数据。InterProScan:最全面的域注释(整合PFAM/TIGRFAM/CDD等),但慢。GhostKOALA:KEGG官方工具,KO注释最权威,但有序列数限制且只给KEGG注释。最佳实践是组合使用。

Q6: 如何处理eggNOG-mapper注释率低的问题?

A: (1) 检查输入是否为蛋白质序列(核苷酸灵敏度低);(2) 降低evalue阈值(如1e-3)但要注意假阳性;(3) 放宽tax_scope(如从genus改到phylum或root);(4) 对未注释蛋白补充InterProScan域注释;(5) 检查是否有大量短片段(<60aa通常难注释)。

Q7: 如何将eggNOG-mapper结果用于比较宏基因组学?

A: (1) 用KEGG KO构建功能丰度表:KO×样本矩阵;(2) 各样本独立注释后合并统计;(3) 归一化方法:相对丰度或TPM/RPKM(结合定量工具如Salmon/CoverM);(4) 下游用LEfSe/MaAsLin2做组间差异功能分析。

Q8: eggNOG-mapper能注释的非蛋白功能有哪些?

A: 除了COG/KEGG/GO,还输出:(1) CAZy(碳水化合物活性酶)—— 适合分析降解能力;(2) EC number(酶分类);(3) PFAM域;(4) KEGG Module(代谢模块完整性);(5) BiGG反应(代谢建模用);(6) Preferred_name(通用基因名)。


易错点

1. 使用核苷酸序列作为输入但未指定--itype CDS

问题: 默认输入类型是蛋白质,核苷酸序列匹配会出错或效率极低。 正确做法: 使用蛋白质序列(推荐),或明确指定--itype CDS(会自动翻译)。

2. 数据库版本与软件版本不匹配

问题: emapper 2.1.x需要对应v5.0数据库;旧数据库会报错。 正确做法: 更新软件后重新下载数据库:download_eggnog_data.py -D -y

3. 未设置--temp_dir导致/tmp空间不足

问题: DIAMOND搜索产生大量临时文件,默认写/tmp容易爆。 正确做法: 指定大容量临时目录:--temp_dir /scratch/tmp/

4. 并行处理后结果合并遗漏header

问题: 拆分跑后简单cat合并,导致多个header行混在数据中。 正确做法: 只保留第一个文件的header:head -n 5 part1.annotations > merged.annotations; for f in part*.annotations; do grep -v "^#" $f >> merged.annotations; done

5. COG分类列包含多字母未正确拆分

问题: 一个蛋白可能属于多个COG类别(如"KL"表示转录+复制),直接统计会漏算。 正确做法: 将多字母COG拆分为单字母后逐个统计(见上文R代码)。

6. 忽略--query_cover和--subject_cover参数

问题: 默认覆盖率阈值可能过低,导致部分匹配被当作全长同源。 正确做法: 对于高质量注释设置--query_cover 50 --subject_cover 50;探索性分析可放宽。

7. 混淆KEGG_ko和KEGG_Pathway列

问题: KEGG_ko是KO编号(功能直系同源),KEGG_Pathway是通路编号,一对多映射。 正确做法: 先获取KO列表,再通过KEGG API或KEGG Mapper映射到通路并做富集分析。


补充知识

eggNOG-mapper与其他注释工具对比

工具速度注释维度适用场景
eggNOG-mapperCOG/KEGG/GO/PFAM/CAZy宏基因组批量注释
InterProScan所有域数据库精确域结构注释
GhostKOALAKEGG only权威KEGG注释
DRAM代谢聚焦MAG功能评估
Prokka基因名/EC基因组快速注释
dbCANCAZy only碳水化合物酶专项

高级用法

  1. 自定义HMM数据库:可以添加自己的HMM profile进行专项搜索
  2. 增量注释:新序列只搜索未注释部分,复用已有结果
  3. 与KEGG Mapper集成:将KO列表提交 KEGG Mapper 可视化通路覆盖
  4. MAG注释:对binning后的MAG单独注释,评估代谢完整性

注释结果深度利用

  • 代谢通路完整性评估:使用KEGG Module Completeness判断某通路是否完整存在于样本中
  • CAZy分析:碳水化合物降解潜力评估(与dbCAN交叉验证)
  • 抗性基因/毒力因子:eggNOG注释中description字段可检索相关关键词,但专项分析推荐用CARD/VFDB

本教程覆盖了eggNOG-mapper从安装到结果解读的全流程,适合宏基因组功能注释初学者和进阶用户参考。