| 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 |
Targeted Metabolomics Analysis
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
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