| name | bio-metabolomics-xcms-preprocessing |
| description | XCMS3 workflow for LC-MS/MS metabolomics preprocessing. Covers peak detection, retention time alignment, correspondence (grouping), and gap filling. Use when processing raw LC-MS data into a feature table for untargeted metabolomics. |
| tool_type | r |
| primary_tool | xcms |
XCMS Metabolomics Preprocessing
Requires Bioconductor 3.18+ with xcms 4.0+ and MSnbase 2.28+.
Load Raw Data
library(xcms)
library(MSnbase)
raw_files <- list.files('raw_data', pattern = '\\.(mzML|mzXML)$', full.names = TRUE)
raw_data <- readMSData(raw_files, mode = 'onDisk')
raw_data
table(msLevel(raw_data))
Define Sample Groups
sample_info <- data.frame(
sample_name = basename(raw_files),
sample_group = c(rep('Control', 5), rep('Treatment', 5), rep('QC', 3)),
injection_order = 1:length(raw_files)
)
pData(raw_data) <- sample_info
Peak Detection (Centroided)
cwp <- CentWaveParam(
peakwidth = c(5, 30),
ppm = 15,
snthresh = 10,
prefilter = c(3, 1000),
mzdiff = 0.01,
noise = 1000,
integrate = 1
)
xdata <- findChromPeaks(raw_data, param = cwp)
head(chromPeaks(xdata))
cat( nrowchromPeaksxdata
Peak Detection (Profile Data)
mfp <- MatchedFilterParam(
binSize = 0.1,
fwhm = 30,
snthresh = 10,
step = 0.1,
mzdiff = 0.8
)
xdata_profile <- findChromPeaks(raw_data, param = mfp)
Retention Time Alignment
obp <- ObiwarpParam(
binSize = 0.5,
response = 1,
distFun = 'cor_opt',
gapInit = 0.3,
gapExtend = 2.4
)
xdata <- adjustRtime(xdata, param = obp)
plotAdjustedRtime(xdata)
Peak Correspondence (Grouping)
pdp <- PeakDensityParam(
sampleGroups = pData(xdata)$sample_group,
bw = 5,
minFraction = 0.5,
minSamples = 1,
binSize = 0.025
)
xdata <- groupChromPeaks(xdata, param = pdp)
featureDefinitions(xdata)
cat('Features:', nrow(featureDefinitions(xdata)), '\n')
Gap Filling
fpp <- ChromPeakAreaParam()
xdata <- fillChromPeaks(xdata, param = fpp)
fpp2 <- FillChromPeaksParam(
expandMz = 0,
expandRt = 0,
ppm = 0
)
Extract Feature Table
feature_values <- featureValues(xdata, method = 'maxint', value = 'into')
feature_defs <- featureDefinitions(xdata)
feature_defs <- as.data.frame(feature_defs)
feature_defs$feature_id <- rownames(feature_defs)
feature_table <- cbind(feature_defs[, c('feature_id', 'mzmed', 'rtmed')], feature_values)
rownames(feature_table) <- feature_table$feature_id
write.csv(feature_table, 'feature_table.csv', row.names = FALSE)
Quality Control
tic <- chromatogram(raw_data, aggregationFun = 'sum')
plot(tic)
peak_counts <- table(chromPeaks(xdata)[, 'sample'])
barplot(peak_counts, main = 'Peaks per sample')
par(mfrow = c(1, 2))
plotAdjustedRtime(xdata, col = pData(xdata)$sample_group)
library(pcaMethods)
log_values <- log2(feature_values + 1)
log_values[is.na(log_values)] <-
pca pcatlog_values nPcs method
plotPcspca col as.factorpDataxdatasample_group
CAMERA Annotation (Isotopes/Adducts)
library(CAMERA)
xsa <- xsAnnotate(as(xdata, 'xcmsSet'))
xsa <- groupFWHM(xsa, perfwhm = 0.6)
xsa <- findIsotopes(xsa, mzabs = 0.01, ppm = 10)
xsa <- findAdducts(xsa, polarity = 'positive')
camera_results <- getPeaklist(xsa)
Export for MetaboAnalyst
export_data <- t(feature_values)
colnames(export_data) <- paste0('M', round(feature_defs$mzmed, 4), 'T', round(feature_defs$rtmed, 1))
export_df <- data.frame(Sample = rownames(export_data), Group = pData(xdata)$sample_group, export_data)
write.csv(export_df, 'metaboanalyst_input.csv', row.names = FALSE)
Related Skills
- metabolite-annotation - Identify metabolites
- normalization-qc - Normalize feature table
- statistical-analysis - Differential analysis