跳转至

代谢通路富集分析(KEGG/MetPA)


一句话说明

代谢通路富集分析就是"看你找到的差异代谢物是不是集中在某几条代谢通路上"——如果某条通路里的代谢物变化特别多,说明这条通路可能是关键的生物学机制,就像发现犯罪分子都来自同一个社区。


核心知识点

要点1:富集分析基本原理

  • 过表示分析(ORA):用Fisher精确检验或超几何分布检验,看差异代谢物在某通路中的比例是否显著高于随机
  • 定量富集分析(QEA):不预设阈值,用所有代谢物的浓度变化进行富集,类似GSEA的思路
  • 拓扑分析:考虑代谢物在通路中的位置(枢纽代谢物的权重更高)

要点2:常用数据库与工具

  • KEGG:最经典的代谢通路数据库,覆盖全面,面试必知
  • MetPA(MetaboAnalyst Pathway Analysis):整合ORA+拓扑分析,在线一键操作
  • Reactome:侧重人类生化反应通路
  • SMPDB:小分子通路数据库,含疾病相关通路
  • Mummichog:直接用m/z做通路分析,不需要先鉴定代谢物

要点3:MetaboAnalyst在线平台

  • 网址:https://www.metaboanalyst.ca(免费、最常用)
  • 输入:代谢物名称/HMDB ID列表 + 浓度数据
  • 输出:通路富集气泡图(横轴=通路影响值,纵轴=-log10(p))
  • 关键参数:物种选择、通路数据库选择(KEGG/SMPDB)、p值校正方法

要点4:结果解读

  • p值:富集显著性,经FDR校正后<0.05认为显著
  • Pathway Impact:拓扑分析得到的通路影响值(0-1),越高说明涉及的枢纽代谢物越多
  • 气泡图解读:右上角的气泡是最值得关注的通路(既显著又影响大)
  • 注意事项:通路分析结果高度依赖代谢物的鉴定准确性

实战代码

# === 使用Python进行代谢通路富集分析 ===
import pandas as pd
from scipy.stats import fisher_exact
import numpy as np

# 1. 准备数据
# 差异代谢物列表(已映射到KEGG compound ID)
diff_metabolites = ["C00031", "C00036", "C00042", "C00074", "C00149"]  # 差异代谢物KEGG ID
# 背景代谢物列表(所有检测到的代谢物)
all_metabolites = ["C00031", "C00036", "C00042", "C00074", "C00149",
                   "C00022", "C00024", "C00158", "C00311", "C00417",
                   "C00026", "C00122", "C00091", "C00044", "C00035"]

# 2. 定义KEGG通路及其包含的代谢物
pathways = {
    "TCA cycle": ["C00036", "C00042", "C00074", "C00149", "C00158", "C00311", "C00026", "C00122", "C00091"],
    "Glycolysis": ["C00031", "C00022", "C00024", "C00074", "C00036"],
    "Amino acid metabolism": ["C00044", "C00035", "C00417"]
}

# 3. 对每条通路做Fisher精确检验
results = []
n_total = len(all_metabolites)  # 背景代谢物总数
n_diff = len(diff_metabolites)   # 差异代谢物总数

for pathway_name, pathway_mets in pathways.items():
    # 构建2x2列联表
    pathway_in_bg = len(set(pathway_mets) & set(all_metabolites))  # 通路中属于背景的
    diff_in_pathway = len(set(diff_metabolites) & set(pathway_mets))  # 差异且在通路中
    diff_not_pathway = n_diff - diff_in_pathway  # 差异但不在通路中
    not_diff_in_pathway = pathway_in_bg - diff_in_pathway  # 不差异但在通路中
    not_diff_not_pathway = n_total - n_diff - not_diff_in_pathway  # 不差异也不在通路中

    table = [[diff_in_pathway, diff_not_pathway],
             [not_diff_in_pathway, not_diff_not_pathway]]
    odds_ratio, p_value = fisher_exact(table, alternative="greater")  # Fisher精确检验

    results.append({
        "Pathway": pathway_name,
        "Hits": diff_in_pathway,
        "Total": pathway_in_bg,
        "P_value": p_value
    })

# 4. 输出结果
df_results = pd.DataFrame(results).sort_values("P_value")  # 按p值排序
print(df_results.to_string(index=False))
# === 使用MetaboAnalystR做通路分析 ===
library(MetaboAnalystR)  # MetaboAnalyst的R版本

# 1. 初始化分析对象
mSet <- InitDataObjects("conc", "pathora", FALSE)  # 浓度数据,通路ORA分析

# 2. 设置代谢物列表
cmpd_list <- c("Glucose", "Pyruvate", "Citrate", "Succinate", "Fumarate")
mSet <- Setup.MapData(mSet, cmpd_list)  # 设置代谢物
mSet <- CrossReferencing(mSet, "name")  # 名称匹配到KEGG ID

# 3. 运行通路分析
mSet <- SetKEGG.PathLib(mSet, "hsa")  # 选择人类KEGG通路
mSet <- SetMetabolomeFilter(mSet, FALSE)  # 不过滤
mSet <- CalculateOraScore(mSet, "rbc", "hyperg")  # ORA + 超几何检验

面试常问点

Q1: 代谢通路富集分析和基因富集分析(GSEA)有什么区别?

参考答案:原理是类似的,都是看差异分子是否集中在某些功能通路中。但代谢组有几个特殊挑战:一是代谢物数量少(几百vs几万基因),统计功效更低;二是一个代谢物可能参与很多通路,通路间重叠严重;三是代谢物鉴定本身就有不确定性。所以代谢通路分析结果要更谨慎解读,最好结合拓扑分析看代谢物在通路中的位置。

Q2: MetaboAnalyst的通路影响值(Impact)怎么理解?

参考答案:Impact值是通过通路拓扑分析计算的,范围0-1。它考虑了代谢物在通路中的"重要程度"——如果你的差异代谢物都是通路的枢纽节点(连接很多反应的代谢物),Impact就高;如果只是通路末端的代谢物,Impact就低。所以即使p值显著,Impact很低也可能不是关键通路。


速查卡片

问题一句话答案
ORA用什么统计检验?Fisher精确检验或超几何分布检验
MetaboAnalyst网址?https://www.metaboanalyst.ca
通路气泡图怎么看?横轴=影响值,纵轴=-log10(p),右上角的最重要
Mummichog的特点?直接用m/z做通路分析,不需要先鉴定代谢物
FDR校正用什么方法?BH(Benjamini-Hochberg)方法最常用
KEGG vs Reactome?KEGG覆盖物种广,Reactome对人类通路更细致