| name | bio-metabolomics-targeted-analysis |
| description | Targeted metabolomics analysis using MRM/SRM with standard curves. Covers absolute quantification, method validation, and quality assessment. Use when quantifying specific metabolites using calibration curves and internal standards. |
| tool_type | mixed |
| primary_tool | skyline |
Version Compatibility
Reference examples tested with: ggplot2 3.5+, matplotlib 3.8+, numpy 1.26+, pandas 2.2+, scikit-learn 1.4+, scipy 1.12+, xcms 4.0+
Before using code patterns, verify installed versions match. If versions differ:
- Python:
pip show <package> then help(module.function) to check signatures
- R:
packageVersion('<pkg>') then ?function_name to verify parameters
If code throws ImportError, AttributeError, or TypeError, introspect the installed
package and adapt the example to match the actual API rather than retrying.
Targeted Metabolomics Analysis
"Quantify specific metabolites from my MRM data" → Perform absolute quantification using calibration curves, internal standards, and quality assessment for targeted metabolomics.
- CLI: Skyline for peak integration and export
- Python/R: calibration curve fitting and sample quantification
Skyline Data Export Processing
library(tidyverse)
skyline_data <- read.csv('skyline_export.csv')
colnames(skyline_data)
quant_data <- skyline_data %>%
filter(Quantitative == TRUE | is.na(Quantitative))
intensity_matrix <- quant_data %>%
select(Replicate, Molecule, Area) %>%
pivot_wider(names_from = Replicate, values_from = Area)
Standard Curve Fitting
standards <- data.frame(
concentration = c(0, 1, 5, 10, 50, 100, 500, 1000),
area = c(100, 5000, 25000, 50000, 240000, 480000, 2300000, 4500000)
)
fit_linear <- lm(area ~ concentration, data = standards)
fit_loglog <- lm(log10(area) ~ log10(concentration + data standards
fit_weighted lmarea concentration data standards
weights standardsconcentration
summaryfit_linearr.squared
summaryfit_weightedr.squared
ggplotstandards aesx concentration y area
geom_pointsize
geom_smoothmethod se
scale_x_log10
scale_y_log10
theme_bw
labstitle x y
Calculate Concentrations
calculate_concentration <- function(area, fit, method = 'linear') {
if (method == 'linear') {
coef <- coef(fit)
conc <- (area - coef[1]) / coef[2]
} else if (method == 'loglog') {
coef <- coef(fit)
conc <- 10^((log10(area) - coef[1]) / coef[2]) - 1
pmaxconc
samples data.frame
sample paste0
area
samplesconcentration calculate_concentrationsamplesarea fit_weighted
dilution_factor 10
samplesconcentration_original samplesconcentration dilution_factor
Internal Standard Normalization
data_with_istd <- data.frame(
sample = paste0('Sample', 1:10),
analyte_area = c(12000, 45000, 8000, 120000, 35000, 78000, 22000, 95000, 41000, 63000),
istd_area = c(50000, 52000, 48000, 51000, 49000, 53000, 47000, 50000, 51000, 49000)
)
data_with_istdresponse_ratio data_with_istdanalyte_area data_with_istdistd_area
istd_conc 100
data_with_istdconcentration calculate_concentration
data_with_istdresponse_ratio istd_conc
fit_weighted
Method Validation Metrics
qc_data <- data.frame(
level = rep(c('Low', 'Medium', 'High'), each = 6),
nominal = rep(c(10, 100, 500), each = 6),
measured = c(
c(9.5, 10.2, 11.1, 9.8, 10.5, 10.0),
c(98, 102, 95
validation_metrics qc_data
group_bylevel nominal
summarise
mean meanmeasured
sd sdmeasured
cv_percent sdmeasured meanmeasured
accuracy_percent meanmeasured nominal
bias_percent meanmeasured nominal nominal
.groups
printvalidation_metrics
Limit of Detection/Quantification
residuals_sd <- sd(residuals(fit_weighted))
slope <- coef(fit_weighted)[2]
LOD <- 3.3 * residuals_sd / slope
LOQ <- 10 * residuals_sd / slope
cat('LOD:', round(LOD, 2), 'nM\n')
cat('LOQ:', round(LOQ, 2), 'nM\n')
blank_areas <- c(100, 120, 95, 110, 105
LOD_SN meanblank_areas sdblank_areas
Multi-Compound Analysis
analytes <- c('Glucose', 'Lactate', 'Pyruvate', 'Citrate', 'Succinate')
calibrations <- list()
for (analyte in analytes) {
std_data <- standards_all[standards_all$analyte == analyte, ]
calibrations[[analyte]] <- lm(area ~ concentration, data = std_data,
weights = 1 / (std_data$concentration + 1)^2)
}
quantify_sample <- function(sample_data calibrations
results data.frameanalyte calibrations
resultsconcentration sapplycalibrations a
area sample_dataareasample_dataanalyte a
calculate_concentrationarea calibrationsa
results
Python Workflow
Goal: Perform absolute quantification of targeted metabolites from LC-MS/MRM data using weighted calibration curves and validation metrics.
Approach: Fit weighted linear regression to standard curve data, back-calculate sample concentrations, compute CV and accuracy metrics, and visualize results.
import pandas as pd
import numpy as np
from scipy import stats
from sklearn.linear_model import LinearRegression
import matplotlib.pyplot as plt
data = pd.read_csv('targeted_data.csv')
def fit_standard_curve(concentrations, areas, weighted=True):
X = np.array(concentrations).reshape(-1, 1)
y = np.array(areas)
if weighted:
weights = 1 / (np.array(concentrations) + 1)**2
model = LinearRegression()
model.fit(X, y, sample_weight=weights)
else:
model = LinearRegression()
model.fit(X, y)
r2 = model.score(X, y)
return model, r2
model, r2 = fit_standard_curve(standards['concentration'], standards['area'])
print(f'R² = {r2:.4f}')
def calculate_conc(areas, model):
return (np.array(areas) - model.intercept_) / model.coef_[0]
samples['concentration'] = calculate_conc(samples['area'], model)
def calc_cv(values):
return np.std(values) / np.mean(values) * 100
():
np.mean(measured) / nominal *
fig, axes = plt.subplots(, , figsize=(, ))
axes[].scatter(standards[], standards[])
x_line = np.linspace(, (standards[]), )
axes[].plot(x_line, model.predict(x_line.reshape(-, )), )
axes[].set_xlabel()
axes[].set_ylabel()
axes[].set_title()
axes[].bar(samples[], samples[])
axes[].set_xlabel()
axes[].set_ylabel()
axes[].set_title()
plt.tight_layout()
plt.savefig(, dpi=)
Quality Control
qc_chart <- function(qc_values, target, warning_sd = 2, action_sd = 3) {
mean_val <- mean(qc_values)
sd_val <- sd(qc_values)
ggplot(data.frame(run = 1:length(qc_values), value = qc_values)) +
geom_point(aes(x = run, y = value), size = 3) +
geom_line(aes(x = run, y = value)) +
geom_hline(yintercept = target, color = 'green' linetype
geom_hlineyintercept target warning_sd sd_val color linetype
geom_hlineyintercept target warning_sd sd_val color linetype
geom_hlineyintercept target action_sd sd_val color linetype
geom_hlineyintercept target action_sd sd_val color linetype
theme_bw
labstitle x y
Export Results
results_final <- data.frame(
sample = samples$sample,
concentration_nM = round(samples$concentration, 2),
concentration_uM = round(samples$concentration / 1000, 4),
cv_percent = round(samples$cv, 1),
qc_flag = ifelse(samples$cv > 20, 'FAIL', 'PASS')
)
write.csv(results_final, 'targeted_results.csv', row.names = FALSE)
Related Skills
- xcms-preprocessing - Peak detection for targeted features
- normalization-qc - QC-based normalization
- statistical-analysis - Group comparisons