Harmonization is the seam between the per-omic categories and the integration-method skills. It takes one already-normalized matrix per omic and emits a comparable, sample-matched set of blocks that MOFA2, mixOmics, or SNF can consume. It exists because a shared-latent integrator is blind to what an omic is: it sees one stacked matrix and spends its first factors on whichever block has the largest raw variance, so the transform, scaling, batch, and missing-value choices made here silently determine the integration result.
This skill owns the CROSS-omic decisions (which transform per omic, per-view versus per-feature scaling, the batch strategy, missing-data triage, the container). The DEEP normalization of any single omic (DESeq2 VST internals, methylation noob/BMIQ, proteomics VSN, metabolomics drift correction, compositional CLR theory) lives in that omic's own category and is cross-referenced, not re-derived here.
BiocManager::install(c('MultiAssayExperiment', 'SummarizedExperiment', 'sva', 'limma'))
install.packages('imputeLCMD') # MNAR-aware proteomics/metabolomics imputation
Conceptual prerequisites and notes: - Each omic must already be per-omic normalized in its own category before harmonization (raw counts, raw beta values, or un-normalized intensities should not reach this skill). - The blocks must share a sample axis; the MultiAssayExperiment sampleMap makes that linkage a structural invariant rather than string-matching. - Two corrections happen in order: the per-omic variance-stabilizing transform (makes each block roughly Gaussian and homoscedastic) THEN per-view scaling (equalizes block contribution). Scaling a heteroscedastic block does not make it homoscedastic. - Matrix orientation differs downstream: Bioconductor is samples-in-columns, while mixOmics and AnnData/MuData are samples-in-rows. Transpose on every cross-language hop.
Tell your AI agent what you want to do: - "Get my RNA, protein, and methylation blocks onto a common footing for MOFA2" - "Which transform should each of my omics get before integration?" - "Equalize my blocks so the 850k-CpG methylation does not dominate the factors" - "Correct batch across my omics without deleting biology" - "My proteomics is 30% missing below detection - how should I impute it?"
"I have RNA-seq counts, proteomics intensities, and 450k methylation on the same 60 samples. Apply the right transform to each block, then scale them so no single omic dominates the shared factors, and tell me which block was at risk of dominating."
"My omics were generated in two batches. Should I run ComBat per omic before integrating, or model batch as a covariate inside the integration? First check whether batch is confounded with my case/control variable."
"My proteomics block has values missing below the detection limit and some sporadic gaps. Impute them by the right mechanism, and decide what to do about the 12 samples that have no proteomics at all."
"Assemble my three omics into a MultiAssayExperiment, tell me how many samples have all three assays, and decide whether to intersect to complete cases or keep the mosaic structure for MOFA2."