KEGG通路分析详解
一句话概述:KEGG(Kyoto Encyclopedia of Genes and Genomes)是整合了基因组、通路、疾病、药物等信息的综合数据库,KEGG通路分析是将基因映射到代谢和信号通路图上,揭示基因功能的关键方法。
核心知识点速查表
| 概念 | 说明 |
|---|
| KEGG | 京都基因与基因组百科全书(白话:基因功能的"百度地图") |
| KEGG Pathway | 代谢/信号通路图(白话:细胞里的"流水线图") |
| KO(KEGG Orthology) | KEGG直系同源编号,连接基因与通路的桥梁 |
| Module | 通路中的功能模块(比pathway更精细的单位) |
| KEGG BRITE | 层级分类体系(酶、转录因子等) |
| KAAS | KEGG Automatic Annotation Server |
| hsa/mmu/ko | 物种前缀:hsa=人,mmu=小鼠,ko=通用 |
一、KEGG注释方法
1.1 在线KAAS注释
# === KAAS在线注释(推荐小数据集) ===
# 访问: https://www.genome.jp/tools/kaas/
# 上传蛋白质或核酸序列
# 选择物种参考集(推荐: representative set)
# 选择比对方式: BBH(双向最佳比对) 或 SBH(单向最佳比对)
# 结果包含KO编号分配
1.2 使用KofamScan本地注释
# === KofamScan:KEGG官方推荐的本地KO注释工具 ===
# 基于HMM profile,比BLAST更准确
# 安装
conda install -c bioconda kofamscan
# 下载KOfam数据库
wget https://www.genome.jp/ftp/db/kofam/ko_list.gz # KO列表
wget https://www.genome.jp/ftp/db/kofam/profiles.tar.gz # HMM profiles
gunzip ko_list.gz # 解压
tar xzf profiles.tar.gz # 解压
# 运行KofamScan
exec_annotation \
-o kofam_results.txt \ # 输出文件
-p profiles/ \ # HMM profile目录
-k ko_list \ # KO列表文件
--cpu 16 \ # CPU线程数
-f mapper \ # 输出格式(mapper格式便于后续分析)
proteins.fasta # 输入蛋白质序列
# 结果格式示例(mapper格式):
# gene001 K00001 # gene001被分配到K00001(酒精脱氢酶)
# gene002 K00002 # gene002被分配到K00002
1.3 使用eggNOG-mapper注释KEGG
# === eggNOG-mapper同时提供GO和KEGG注释 ===
emapper.py \
-i proteins.fasta \ # 输入蛋白质
--data_dir eggnog_db/ \ # 数据库
--output eggnog_kegg \ # 输出前缀
--cpu 16 \
-m diamond
# 从结果中提取KEGG注释
# eggnog_kegg.emapper.annotations 文件中包含KEGG_ko和KEGG_Pathway列
awk -F'\t' 'NR>4 && $12!="-" {print $1, $12}' eggnog_kegg.emapper.annotations \
> gene2ko.txt # 提取基因到KO的映射
二、KEGG通路富集分析
2.1 R语言clusterProfiler
# === 模式生物KEGG富集 ===
library(clusterProfiler)
# 准备基因列表(需要ENTREZID)
gene_list <- c("7157", "675", "672", "5925", "4609") # 示例基因
# KEGG富集分析
ekegg <- enrichKEGG(
gene = gene_list, # 差异基因(ENTREZID)
organism = "hsa", # 物种代码(人=hsa,鼠=mmu)
keyType = "ncbi-geneid", # ID类型
pAdjustMethod = "BH", # FDR校正
pvalueCutoff = 0.05, # p值阈值
qvalueCutoff = 0.05 # q值阈值
)
# 查看结果
head(as.data.frame(ekegg))
# 可视化
dotplot(ekegg, showCategory=15) # 点图
barplot(ekegg, showCategory=15) # 柱状图
cnetplot(ekegg, showCategory=5) # 网络图
2.2 KEGG GSEA
# === KEGG GSEA分析 ===
# 准备排序的基因列表
geneList <- sort(gene_rank$logFC, decreasing=TRUE) # 按logFC排序
names(geneList) <- gene_rank$ENTREZID # 基因ID
# GSEA
gsea_kegg <- gseKEGG(
geneList = geneList, # 排序的基因列表
organism = "hsa", # 物种
pAdjustMethod = "BH", # FDR校正
pvalueCutoff = 0.05 # 阈值
)
# 可视化
gseaplot2(gsea_kegg, geneSetID=1:3) # GSEA曲线
ridgeplot(gsea_kegg) # 山脊图
2.3 非模式生物KEGG富集
# === 非模式生物:自定义KEGG富集 ===
# 第1步:准备KO到基因的映射(从KofamScan/eggNOG结果)
ko2gene <- read.table("gene2ko.txt",
col.names=c("gene", "KO"))
term2gene <- ko2gene[, c("KO", "gene")] # KO在前,gene在后
# 第2步:准备KO到通路的映射
# 从KEGG API获取
library(KEGGREST)
pathways <- keggLink("pathway", "ko") # 获取KO-pathway映射
ko2path <- data.frame(
KO = gsub("ko:", "", names(pathways)), # KO编号
pathway = gsub("path:", "", pathways) # 通路编号
)
# 第3步:构建pathway到gene的映射
path2gene <- merge(ko2path, ko2gene, by="KO")[, c("pathway", "gene")]
# 第4步:富集分析
ekegg_custom <- enricher(
gene = diff_genes, # 差异基因
TERM2GENE = path2gene, # 通路-基因映射
pvalueCutoff = 0.05
)
dotplot(ekegg_custom, showCategory=20)
三、KEGG通路可视化
3.1 pathview绘制通路图
# === pathview:将差异基因标记到KEGG通路图上 ===
library(pathview)
# 准备数据:基因名 + logFC值
gene_data <- gene_rank$logFC # logFC值
names(gene_data) <- gene_rank$ENTREZID # 基因ID
# 绘制特定通路图
pathview(
gene.data = gene_data, # 基因表达数据
pathway.id = "hsa04110", # 通路ID(细胞周期)
species = "hsa", # 物种
gene.idtype = "entrez", # ID类型
limit = list(gene=2), # 颜色范围限制
bins = list(gene=20), # 颜色分档数
out.suffix = "cell_cycle" # 输出文件后缀
)
# 输出: hsa04110.cell_cycle.png(通路图上基因被着色标记)
3.2 ggkegg现代可视化
# === ggkegg:基于ggplot2的KEGG通路可视化 ===
# install.packages("ggkegg") 或 BiocManager::install("ggkegg")
library(ggkegg)
# 获取通路信息
pathway <- pathway("hsa04110") # 获取细胞周期通路
# 可视化
ggraph(pathway) + # 用ggraph绘图
geom_edge_link() + # 边
geom_node_rect() + # 节点(矩形)
theme_void() # 无背景
四、KEGG数据库实用操作
# === 用KEGGREST包查询KEGG数据库 ===
library(KEGGREST)
# 搜索通路
keggFind("pathway", "cancer") # 搜索含"cancer"的通路
keggFind("pathway", "microbiome") # 搜索微生物组相关通路
# 获取通路信息
keggGet("hsa04110") # 获取细胞周期通路详情
# 获取物种代码
keggList("organism") # 列出所有物种代码
# 获取KO信息
keggGet("K00001") # 查看K00001的详情
# === KEGG API命令行查询 ===
# 列出人类所有通路
curl "https://rest.kegg.jp/list/pathway/hsa"
# 获取通路中的基因
curl "https://rest.kegg.jp/link/hsa/hsa04110"
# 获取KO的定义
curl "https://rest.kegg.jp/get/ko:K00001"
# 下载通路图
curl "https://rest.kegg.jp/get/hsa04110/image" -o hsa04110.png
五、面试高频考点
Q1: KEGG和GO的区别?
| GO | KEGG |
|---|
| 内容 | 基因功能的标准化描述 | 代谢/信号通路图 |
| 结构 | DAG(有向无环图) | 通路图(带反应关系) |
| 侧重 | 功能分类 | 通路和反应网络 |
| 适用 | 所有基因 | 有KO注释的基因 |
| 白话 | 给基因贴标签 | 画基因参与的"流水线" |
Q2: KO编号有什么用?
- KO是连接基因和通路的桥梁
- 一个KO代表一个功能等价的基因组(跨物种保守)
- 基因→KO→通路,是KEGG注释的核心链路
- 在宏基因组中,KO可以跨物种比较功能
Q3: 宏基因组中怎么做KEGG分析?
- 用HUMAnN3直接从reads获取通路丰度
- 或用eggNOG-mapper/KofamScan注释预测基因的KO
- 统计各通路的基因丰度
- 用LEfSe或MaAsLin2比较组间差异通路
常见报错与解决
| 报错 | 原因 | 解决方案 |
|---|
KEGG API timeout | 网络问题 | 重试或使用本地数据库 |
No gene mapped | ID类型不对 | 用bitr_kegg()转换ID |
organism not found | 物种代码错误 | 用keggList("organism")查 |
pathview下载失败 | KEGG服务器限流 | 加Sys.sleep(2)延迟 |
KEGG收费了 | 学术版仍可免费使用 | 用学术网络或KofamScan本地 |
速查表
# === KEGG分析速查 ===
library(clusterProfiler)
# ORA富集
ekegg <- enrichKEGG(gene=gene_list, organism="hsa")
dotplot(ekegg)
# GSEA
gsea_kegg <- gseKEGG(geneList=sorted_genes, organism="hsa")
gseaplot2(gsea_kegg, geneSetID=1:3)
# 通路图
library(pathview)
pathview(gene.data=gene_data, pathway.id="hsa04110", species="hsa")
# 非模式生物
# KofamScan注释 → gene2ko → enricher()自定义富集
# 常用物种代码: hsa(人) mmu(鼠) ath(拟南芥) dme(果蝇) sce(酵母) eco(大肠杆菌)