代谢组学数据分析¶
一句话概述:代谢组学通过LC-MS/GC-MS检测生物样本中的小分子代谢物,MetaboAnalyst 6.0(2024-2026)是最主流的一站式分析平台,MetaboAnalystR 4.0提供R语言编程接口,XCMS是经典的原始数据处理工具。
核心知识点速览¶
| 概念 | 白话解释 |
|---|---|
| 代谢物 | 生命活动产生的小分子(<1500 Da),如氨基酸、脂肪酸、糖 |
| 靶向代谢组 | 预先知道要测什么代谢物,定量准确但范围有限 |
| 非靶向代谢组 | 不限定范围,尽可能检测所有代谢物(发现型研究) |
| LC-MS | 液相色谱-质谱联用,最常用的代谢组检测平台 |
| GC-MS | 气相色谱-质谱联用,适合挥发性/小极性代谢物 |
| Feature | 一个m/z + 保留时间的组合,代表一个可能的代谢物信号 |
| Peak picking | 从原始数据中识别色谱峰的过程 |
| XCMS | 经典的LC-MS数据处理R包 |
| MetaboAnalyst | 最流行的代谢组学在线分析平台 |
| 代谢通路分析 | 把差异代谢物映射到生化通路上 |
一、代谢组学基础¶
1.1 实验设计¶
代谢组学实验类型:
靶向代谢组学(Targeted):
- 预先选定50-500个已知代谢物
- 使用标准品建立定量方法
- 定量准确(绝对定量)
- 适合验证性研究
非靶向代谢组学(Untargeted):
- 不预设目标,检测所有可检测的代谢物
- 通常检测到1000-10000个features
- 半定量(相对定量)
- 适合发现性研究
实验设计要点:
1. 样本量:每组≥6个生物学重复(推荐≥10)
2. QC样本:混合所有样本的等量混合物,每5-10个样本间插入一个QC
3. 空白对照:溶剂空白,排除背景干扰
4. 随机化:样本注射顺序随机化,避免批次效应
1.2 数据类型¶
代谢组学数据的三种输入形式:
1. 原始数据(.mzML/.mzXML/.raw)
→ 需要XCMS/MZmine/MS-DIAL处理
→ 峰提取 → 对齐 → 缺失值填补 → 特征表
2. 特征表(Feature Table)
→ 行=features(代谢物特征),列=样本
→ 可直接用MetaboAnalyst分析
3. 浓度表(Concentration Table)
→ 靶向代谢组学的结果
→ 已知代谢物名称和绝对浓度
→ 直接统计分析
二、XCMS原始数据处理¶
2.1 安装和数据读取¶
# 安装XCMS
BiocManager::install("xcms") # 安装
library(xcms) # 加载
# 读取原始数据(mzML格式)
# 将.raw文件转换为mzML(用MSConvert/ProteoWizard)
raw_files <- list.files("mzml_files/",
pattern = "*.mzML",
full.names = TRUE) # 列出所有mzML文件
# 读取数据
raw_data <- readMSData(
files = raw_files,
mode = "onDisk" # 磁盘模式(节省内存)
)
# 查看数据信息
raw_data # 对象摘要
table(msLevel(raw_data)) # MS1和MS2扫描数
2.2 峰提取和对齐¶
# 1. 峰提取(Peak Detection)——CentWave方法
cwp <- CentWaveParam(
peakwidth = c(5, 30), # 峰宽范围(秒)
ppm = 15, # m/z容差(ppm)
snthresh = 10, # 信噪比阈值
noise = 1000, # 噪声水平
prefilter = c(3, 1000) # 至少3个扫描超过1000强度
)
xdata <- findChromPeaks(raw_data, param = cwp) # 提取色谱峰
cat("检测到峰数量:", nrow(chromPeaks(xdata)), "\n")
# 2. 保留时间校正(RT Alignment)
# 校正不同样本间的保留时间漂移
ogp <- ObiwarpParam(
binSize = 0.6 # m/z分箱大小
)
xdata <- adjustRtime(xdata, param = ogp) # 保留时间校正
# 可视化校正效果
plotAdjustedRtime(xdata) # 校正前后的保留时间偏移
# 3. 峰对应(Peak Correspondence)
# 把不同样本中的相同峰"对齐"到同一个feature
pdp <- PeakDensityParam(
sampleGroups = xdata$group, # 样本分组信息
bw = 5, # 带宽(秒)
minFraction = 0.5, # 至少50%的样本中出现
binSize = 0.025 # m/z分箱大小
)
xdata <- groupChromPeaks(xdata, param = pdp) # 峰对应
# 4. 缺失值填补(Gap Filling)
xdata <- fillChromPeaks(xdata) # 用原始数据回填缺失值
# 5. 提取特征表
feature_table <- featureValues(xdata, value = "into") # 峰面积
feature_defs <- featureDefinitions(xdata) # 特征定义(mz, rt)
# 导出为CSV
write.csv(feature_table, "feature_table.csv") # 导出
2.3 MetaboAnalystR 4.0处理¶
# MetaboAnalystR 4.0是MetaboAnalyst的R包版本
# 统一了从原始数据处理到功能解读的完整流程
# 安装
# install.packages("MetaboAnalystR")
library(MetaboAnalystR)
# 方法1:从原始mzML数据开始
# MetaboAnalystR 4.0内置了auto-optimized峰检测
mSet <- PerformDataProcessing(
rawfiles = list.files("mzml_files/", full.names = TRUE), # 原始文件
param_optimization = TRUE # 自动优化参数(推荐)
)
# MetaboAnalystR 4.0 vs XCMS:
# - 真实峰数量增加109.1%
# - 总峰数量仅增加6.79%(噪声少)
# - 自动参数优化,不需要手动调参
# 方法2:从特征表开始
mSet <- InitDataObjects("conc", "stat", FALSE) # 初始化
mSet <- Read.TextData(mSet, "feature_table.csv", # 读取数据
"colu", "disc") # 列格式,离散分组
mSet <- SanityCheckData(mSet) # 数据检查
mSet <- ReplaceMin(mSet) # 缺失值用最小值替代
mSet <- FilterVariable(mSet, "iqr", "F", 25) # IQR过滤(去低变异特征)
mSet <- PreparePrenormData(mSet) # 准备归一化
mSet <- Normalization(mSet, "MedianNorm", # 中位数归一化
"LogNorm", "AutoNorm") # log转换+自动缩放
三、MetaboAnalyst 6.0在线分析¶
3.1 数据上传和预处理¶
MetaboAnalyst 6.0(https://www.metaboanalyst.ca)
2024-2026年更新:
- 支持MS2数据处理和注释(新增)
- 因果分析模块(孟德尔随机化)
- 剂量-响应分析模块
- 扩展到~130个物种
- GSEA和mummichog式富集(2026年5月新增)
- 增强的PCA(2026年1月,支持大数据)
- R 4.5.2版本升级(2025年12月)
支持的数据格式:
1. 浓度表(行=样本,列=代谢物)
2. 峰强度表(行=样本,列=m/z_RT)
3. 光谱箱(NMR数据)
4. MS峰列表
数据预处理选项:
- 缺失值:最小值替代/KNN/中位数/0
- 过滤:IQR/标准差/变异系数
- 归一化:总量/中位数/参考样本
- 转换:log/平方根/立方根
- 缩放:自动缩放/Pareto/范围缩放
3.2 统计分析¶
# 在R中模拟MetaboAnalyst的分析流程
# 1. PCA(主成分分析)——无监督
library(FactoMineR)
library(factoextra)
pca_result <- PCA(t(feature_table_norm), graph = FALSE) # 转置后PCA
fviz_pca_ind(pca_result,
col.ind = sample_groups, # 按分组着色
addEllipses = TRUE, # 添加置信椭圆
palette = c("red", "blue"), # 颜色
legend.title = "Group") # 图例标题
# 2. PLS-DA(偏最小二乘判别分析)——有监督
library(mixOmics)
plsda_result <- plsda(
X = t(feature_table_norm), # 特征矩阵
Y = sample_groups, # 分组标签
ncomp = 3 # 3个成分
)
plotIndiv(plsda_result, comp = c(1, 2), # 画前2个成分
group = sample_groups, # 按组着色
ind.names = FALSE, # 不显示样本名
legend = TRUE, # 显示图例
title = "PLS-DA Score Plot")
# VIP分数(Variable Importance in Projection)
vip_scores <- vip(plsda_result) # 计算VIP
vip_important <- vip_scores[vip_scores[, 1] > 1, ] # VIP > 1的变量
cat("VIP > 1的特征数:", nrow(vip_important), "\n")
# 3. 差异代谢物分析
# t检验/Wilcoxon检验/ANOVA
library(tidyverse)
# 每个feature做t检验
pvalues <- apply(feature_table_norm, 1, function(x) {
t.test(x[group == "Disease"], x[group == "Control"])$p.value # t检验
})
fdr <- p.adjust(pvalues, method = "BH") # FDR校正
# 计算Fold Change
fc <- apply(feature_table_norm, 1, function(x) {
mean(x[group == "Disease"]) - mean(x[group == "Control"]) # log2差值
})
# 差异代谢物
diff_metabolites <- data.frame(
feature = names(pvalues),
pvalue = pvalues,
FDR = fdr,
log2FC = fc
)
sig_metabolites <- diff_metabolites %>%
filter(FDR < 0.05 & abs(log2FC) > 1) # 显著差异代谢物
cat("显著差异代谢物:", nrow(sig_metabolites), "\n")
# 4. 火山图
ggplot(diff_metabolites, aes(x = log2FC, y = -log10(FDR))) +
geom_point(aes(color = FDR < 0.05 & abs(log2FC) > 1), size = 1) + # 着色
scale_color_manual(values = c("grey", "red")) + # 灰色/红色
geom_hline(yintercept = -log10(0.05), linetype = "dashed") + # P值线
geom_vline(xintercept = c(-1, 1), linetype = "dashed") + # FC线
labs(title = "Volcano Plot", x = "log2(Fold Change)", y = "-log10(FDR)") +
theme_minimal()
3.3 代谢物鉴定¶
# 非靶向代谢组学的关键步骤:把m/z值对应到具体代谢物
# 方法1:精确质量搜索
# 用m/z值在HMDB/KEGG/PubChem中搜索可能的代谢物
# MetaboAnalyst的MS Peaks to Paths模块
# 方法2:MS2谱图匹配(MetaboAnalyst 6.0新功能)
# 将实验MS2谱与参考数据库(GNPS/MassBank/NIST)比对
# 鉴定等级(Metabolomics Standards Initiative, MSI):
# Level 1: 与标准品比对确认(m/z + RT + MS2)
# Level 2: 与数据库MS2谱匹配(无标准品)
# Level 3: 仅基于精确质量推测
# Level 4: 未知的特征
# R中的MS2匹配示例
library(CompoundDb)
# 读取MS2数据库
# db <- CompDb("MassBank_human.sqlite")
# 搜索匹配
# matches <- matchSpectra(query_spectra, db, mzTol = 10)
3.4 通路分析¶
# 代谢通路分析——把差异代谢物映射到KEGG通路
# 方法1:MetaboAnalyst的Pathway Analysis
# 使用MetaboAnalystR
mSet <- InitDataObjects("conc", "pathinteg", FALSE)
mSet <- SetMetabolomeFilter(mSet, FALSE)
mSet <- SetCurrentMsetLib(mSet, "pathway", 2) # 设置通路库
# 通路分析(ORA + 拓扑分析)
mSet <- Setup.MapData(mSet, sig_metabolite_names) # 设置代谢物列表
mSet <- CrossReferencing(mSet, "name") # 名称匹配
mSet <- CreateMappingResultTable(mSet) # 创建映射结果
mSet <- SetKEGG.PathLib(mSet, "hsa") # 人类KEGG通路
mSet <- SetMetabolomeFilter(mSet, FALSE)
mSet <- CalculateOraScore(mSet, "rbc", "hyperg") # ORA分析
# 方法2:mummichog算法(不需要预先鉴定代谢物)
# 直接从m/z列表推断通路活性
# 2026年MetaboAnalyst新增了GSEA支持
常见报错与解决¶
| 报错信息 | 原因 | 解决方案 |
|---|---|---|
XCMS: no peaks found | 参数不匹配数据类型 | 调整peakwidth和ppm参数 |
MetaboAnalyst: format error | 数据格式不符 | 确认行=样本,列=代谢物 |
Too many missing values | 数据稀疏 | 降低minFraction或更换填补方法 |
PLS-DA: overfitting | 样本太少变量太多 | 增加样本量,使用VIP过滤 |
Pathway: no mapping | 代谢物名称不匹配 | 使用HMDB ID或标准化学名 |
Normalization: negative values | log转换前有零值 | 先替换零值为最小正值 |
速查表¶
# 代谢组学分析流程
原始数据(.mzML) → XCMS/MetaboAnalystR峰提取
→ 保留时间校正 → 峰对齐 → 缺失值填补
→ 归一化(中位数+log+自动缩放)
→ PCA/PLS-DA → 差异分析(t检验+FDR)
→ 代谢物鉴定(MS2匹配) → 通路分析(KEGG)
# XCMS关键参数(CentWave)
peakwidth: c(5,30)(窗口宽度,秒)
ppm: 10-25(质量精度)
snthresh: 5-10(信噪比)
prefilter: c(3,1000)(最少扫描和强度)
bw: 5-10(对齐带宽)
# MetaboAnalyst 6.0功能模块
Statistical Analysis: 单变量/多变量统计
Enrichment Analysis: 代谢物集富集分析
Pathway Analysis: KEGG通路分析(ORA+拓扑)
Biomarker Analysis: ROC曲线+交叉验证
Causal Analysis: 孟德尔随机化(2024新增)
Dose-Response: 剂量-响应分析(2024新增)
MS2 Annotation: MS2谱图注释(2024新增)
# 差异代谢物筛选标准
VIP > 1(PLS-DA重要性)
FDR < 0.05(t检验/Wilcoxon)
|log2FC| > 1(倍数变化)
推荐三者结合使用
# 代谢物鉴定等级(MSI)
Level 1: 标准品确认(最高)
Level 2: 数据库MS2匹配
Level 3: 精确质量推测
Level 4: 未知特征(最低)
面试高频问题¶
Q1:靶向和非靶向代谢组学的区别?¶
答:靶向代谢组学预先选定一组已知代谢物(通常50-500个),使用标准品建立定量方法,可以做绝对定量(ng/mL),精确度高但范围有限,适合验证性研究。非靶向代谢组学不预设目标,尽量检测所有可检测的代谢物(通常1000-10000个features),只能做相对定量,适合发现性研究。实际项目中常用"非靶向发现+靶向验证"的两步策略。
Q2:XCMS的CentWave方法原理是什么?¶
答:CentWave是XCMS中最常用的峰提取算法,基于连续小波变换(Continuous Wavelet Transform)。核心思路:①在质荷比(m/z)维度上用ppm参数定义ROI(Region of Interest),即m/z相近的点聚为一组;②在保留时间维度上用小波变换检测色谱峰——小波可以匹配不同宽度的峰形;③通过信噪比阈值和预过滤参数去除噪声峰。关键参数peakwidth定义期望的峰宽范围,ppm定义m/z容差。
Q3:代谢组学数据为什么需要归一化?¶
答:归一化目的是消除技术变异。代谢组学数据受多种技术因素影响:①样本间总信号差异(不同注射量/提取效率)——用总量归一化或中位数归一化;②数据偏态分布——用log转换使其近似正态;③代谢物间浓度差异巨大(某些代谢物高几个数量级)——用自动缩放(Auto scaling)或Pareto缩放使所有代谢物权重相当。推荐组合:中位数归一化 + log转换 + 自动缩放。
Q4:MetaboAnalyst 6.0有什么新功能?¶
答:2024年NAR发表的MetaboAnalyst 6.0主要新增:①MS2数据处理和注释——支持MS2谱图匹配,基于GNPS/MassBank等参考库进行碎片级注释;②因果分析——用孟德尔随机化估计代谢物与表型的因果关系;③剂量-响应分析——适合药理学研究;④扩展了物种支持(~130个物种)。2026年最新更新还加入了GSEA式代谢通路富集分析、改进的PCA大数据支持、调节性FC和t统计量。
Q5:如何评估代谢组学分析结果的可靠性?¶
答:五个层面:①QC样本聚集——PCA图上QC样本应紧密聚集在中心,代表技术重复性好;②PLS-DA交叉验证——做置换检验(permutation test, n=200),p值<0.05且R²/Q²合理才不是过拟合;③差异代谢物验证——用ROC曲线评估区分能力(AUC>0.8),用独立验证集确认;④代谢物鉴定等级——尽量达到MSI Level 1(标准品确认),至少Level 2(MS2匹配);⑤通路一致性——差异代谢物应该聚集在有生物学意义的通路上,而非随机分布。