| name | bio-differential-expression-batch-correction |
| description | Remove batch effects from RNA-seq data using ComBat, ComBat-Seq, limma removeBatchEffect, and SVA for unknown batch variables. Use when correcting batch effects in expression data. |
| tool_type | r |
| primary_tool | sva |
Batch Effect Correction
ComBat-Seq (Count Data)
library(sva)
corrected_counts <- ComBat_seq(counts = as.matrix(counts),
batch = batch,
group = condition,
full_mod = TRUE)
ComBat (Normalized Data)
library(sva)
mod <- model.matrix(~ condition, data = metadata)
mod0 <- model.matrix(~ 1, data = metadata)
corrected_expr <- ComBat(dat = as.matrix(normalized_expr),
batch = metadata$batch,
mod = mod,
par.prior = TRUE)
limma removeBatchEffect
library(limma)
design <- model.matrix(~ condition, data = metadata)
corrected_expr <- removeBatchEffect(normalized_expr,
batch = metadata$batch,
design = design)
DESeq2 Design Formula (Recommended for DE)
library(DESeq2)
dds <- DESeqDataSetFromMatrix(countData = counts,
colData = metadata,
design = ~ batch + condition)
dds <- DESeq(dds)
res <- results(dds, contrast = c('condition', 'treatment', 'control'))
Surrogate Variable Analysis (SVA)
library(sva)
mod <- model.matrix(~ condition, data = metadata)
mod0 <- model.matrix(~ 1, data = metadata)
n_sv <- num.sv(normalized_expr, mod, method = 'leek')
svobj <- sva(normalized_expr, mod, mod0, n.sv = n_sv)
design_with_sv <- cbind(mod, svobj$sv)
SVA with DESeq2
library(DESeq2)
library(sva)
dds <- DESeqDataSetFromMatrix(countData = counts, colData = metadata, design = ~ condition)
dds <- estimateSizeFactors(dds)
norm_counts <- counts(dds, normalized = TRUE)
mod <- model.matrix(~ condition, data = metadata)
mod0 <- model.matrix(~ 1, data = metadata)
svobj <- sva(norm_counts, mod, mod0)
for (i in seq_len(ncol(svobj$sv))) {
colDataddspaste0 i svobjsv i
sv_formula as.formulapaste pastepaste0 ncolsvobjsv collapse
designdds sv_formula
dds DESeqdds
Visualize Batch Effects
library(ggplot2)
pca_before <- prcomp(t(normalized_expr), scale. = TRUE)
pca_df <- data.frame(PC1 = pca_before$x[, 1], PC2 = pca_before$x[, 2],
batch = metadata$batch, condition = metadata$condition)
p1 <- ggplot(pca_df, aes(PC1, PC2, color = batch, shape = condition)) +
geom_point(size = 3) + ggtitle('Before Correction')
pca_after <- prcomptcorrected_expr scale.
pca_df_after data.framePC1 pca_afterx PC2 pca_afterx
batch metadatabatch condition metadatacondition
p2 ggplotpca_df_after aesPC1 PC2 color batch shape condition
geom_pointsize ggtitle
librarypatchwork
p1 p2
Quantify Batch Effect
library(pvca)
pvcaObj <- pvcaBatchAssess(normalized_expr, metadata, threshold = 0.6,
theInteractionTerms = c('batch', 'condition'))
pca <- prcomp(t(normalized_expr), scale. = TRUE)
variance_explained <- summary(pca)$importance[2, 1:5]
cor(pca$x[, 1], as.numeric(as.factor(metadata$batch)))
Harmony (Single-Cell Integration)
library(harmony)
library(Seurat)
seurat_obj <- RunHarmony(seurat_obj, group.by.vars = 'batch', reduction = 'pca',
dims.use = 1:30)
seurat_obj <- RunUMAP(seurat_obj, reduction = 'harmony', dims = 1:30)
seurat_obj <- FindNeighbors(seurat_obj, reduction = 'harmony', dims = 1:30)
When NOT to Correct
Related Skills
- differential-expression/deseq2-basics - DE with batch in design
- single-cell/clustering - Integration methods
- expression-matrix/matrix-operations - Data transformation