| name | bio-metabolomics-normalization-qc |
| description | Quality control and normalization for metabolomics data. Covers QC-based correction, batch effect removal, and data transformation methods. Use when correcting technical variation in metabolomics data before statistical analysis. |
| tool_type | r |
| primary_tool | MetaboAnalystR |
Metabolomics Normalization and QC
Load and Inspect Data
library(tidyverse)
library(pcaMethods)
data <- read.csv('feature_table.csv', row.names = 1)
sample_info <- read.csv('sample_info.csv')
qc_samples <- sample_info$sample_name[sample_info$sample_type == 'QC']
bio_samples <- sample_info$sample_name[sample_info$sample_type != 'QC']
data_qc <- data[qc_samples, ]
data_bio <- data[bio_samples, ]
missing_pct <- colMeans(is.na(data)) * 100
cat('Features with >50% missing:', sum(missing_pct > 50), '\n')
QC-Based Normalization (QC-RSC)
library(statTarget)
qc_rsc_normalize <- function(data, sample_info) {
injection_order <- sample_info$injection_order
is_qc <- sample_info$sample_type == 'QC'
normalized <- data
for (feature in colnames(data)) {
qc_values <- data[is_qc, feature]
qc_order <- injection_order[is_qc]
fit <- loess(qc_values ~ qc_order, span = 0.75)
predicted <- predict(fit, injection_order)
median_val <- median(qc_values, na.rm
normalized feature data feature predicted median_val
normalized
data_corrected qc_rsc_normalizedata sample_info
Total Ion Current (TIC) Normalization
tic_normalize <- function(data) {
row_sums <- rowSums(data, na.rm = TRUE)
normalized <- data / row_sums * median(row_sums)
return(normalized)
}
data_tic <- tic_normalize(data)
Probabilistic Quotient Normalization (PQN)
pqn_normalize <- function(data) {
reference <- apply(data, 2, median, na.rm = TRUE)
quotients <- data / reference
factors <- apply(quotients, 1, median, na.rm = TRUE)
normalized <- data / factors
return(normalized)
}
data_pqn <- pqn_normalize(data)
Batch Correction (ComBat)
library(sva)
batch <- sample_info$batch
mod <- model.matrix(~ sample_info$group)
data_log <- log2(data + 1)
data_combat <- ComBat(dat = t(data_log), batch = batch, mod = mod)
data_combat <- t(data_combat)
Missing Value Handling
filter_missing <- function(data, max_missing = 0.2, by_group = TRUE, groups = NULL) {
if (by_group && !is.null(groups)) {
keep <- sapply(colnames(data), function(f) {
any(sapply(unique(groups), function(g) {
group_data <- data[groups == g, f]
mean(is.na(group_data)) <= max_missing
keep colMeansdata max_missing
data keep
data_filtered filter_missingdata max_missing by_group
groups sample_infogroup
libraryimpute
data_imputed impute.knnas.matrixdata_filtered k data
min_impute data
data_imp data
col colnamesdata
min_val data col na.rm
data_impdata_imp col col min_val
data_imp
Data Transformation
data_log <- log2(data + 1)
pareto_scale <- function(data) {
centered <- scale(data, center = TRUE, scale = FALSE)
scaled <- centered / sqrt(apply(data, 2, sd, na.rm = TRUE))
return(scaled)
}
data_pareto <- pareto_scale(data_log)
data_auto <- scale(data_log)
QC Assessment
qc_rsd <- function(data, qc_samples) {
qc_data <- data[qc_samples, ]
rsd <- apply(qc_data, 2, function(x) sd(x, na.rm = TRUE) / mean(x, na.rm = TRUE) * 100)
return(rsd)
}
rsd_before <- qc_rsd(data, qc_samples)
rsd_after <- qc_rsd(data_corrected, qc_samples)
cat('Features with RSD <30% before:', sum(rsd_before < 30, na.rm = TRUE)
cat rsd_after na.rm
pca_before prcomptna.omitdata scale.
pca_after prcomptna.omitdata_corrected scale.
parmfrow
plotpca_beforerotation col ifelserownamespca_beforerotation qc_samples
main pch
plotpca_afterrotation col ifelserownamespca_afterrotation qc_samples
main pch
Quality Report
generate_qc_report <- function(data, sample_info) {
qc_samples <- sample_info$sample_name[sample_info$sample_type == 'QC']
report <- list(
n_features = ncol(data),
n_samples = nrow(data),
n_qc = length(qc_samples),
missing_pct = mean(is.na(data)) * 100,
qc_rsd_median = median(qc_rsd(data, qc_samples), na.rm = TRUE),
features_rsd_lt30 = sum(qc_rsd(data, qc_samples) < na.rm
cat
name report
catsprintf name reportname
report
report generate_qc_reportdata_corrected sample_info
Related Skills
- xcms-preprocessing - Generate feature table
- statistical-analysis - Downstream analysis
- differential-expression/batch-correction - Similar concepts