代谢通路富集分析(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对人类通路更细致 |