multi-omics-integration/integration-design/SKILL.md
Chooses a bulk multi-omics integration strategy before any tool runs by mapping the biological question (subtype discovery, shared axis of variation, predictive signature, pairwise correlation) to a method class, naming the sample correspondence (paired-vertical, horizontal, mosaic, diagonal), enforcing the n<<p discipline that makes a held-out cohort the endpoint instead of in-cohort cross-validation, and running the per-view variance-imbalance diagnostic. Covers the early/mixed/intermediate/late taxonomy, why vertical and horizontal integration are different problems, and why a shared factor dominated by one omic is not integration. Use when deciding which integration method fits a question, whether data is paired or mosaic, supervised or unsupervised, or how to validate an integrated result. For unsupervised factors see mofa-integration; for supervised signatures see mixomics-analysis; for stratification see similarity-network; for single-cell see single-cell/multimodal-integration.
npx skillsauth add GPTomics/bioSkills bio-multi-omics-integration-designInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Reference examples tested with: MultiAssayExperiment 1.36+, SummarizedExperiment 1.40+.
Before using code patterns, verify installed versions match. If versions differ:
packageVersion('<pkg>') then ?function_name to verify parametersIf code throws ImportError, AttributeError, or TypeError, introspect the installed package and adapt the example to match the actual API rather than retrying.
The tool versions that matter most are MOFA2 and mixOmics, whose APIs have moved across releases; this skill routes to those tool skills rather than calling them, so the binding version here is MultiAssayExperiment (the container in which the paired-vs-mosaic decision is made).
"How should I integrate these omics?" -> Map the biological question and the sample correspondence to a method class BEFORE running a tool - because at tens of samples and 10^5-10^6 features a spurious cross-omic signal is the default outcome, not the surprise.
MultiAssayExperiment, then choose MOFA2 (shared factors) / mixOmics (signature) / SNF (subtypes) by questionScope: the integration decision itself - method selection, correspondence (paired/horizontal/mosaic/diagonal), supervised-vs-unsupervised mapping, the n<<p discipline, and the variance-imbalance diagnostic. Running the chosen tool -> mofa-integration, mixomics-analysis, similarity-network. Cross-omic preprocessing -> data-harmonization. Single-cell multimodal -> single-cell/multimodal-integration. Horizontal same-feature meta-analysis -> differential-expression/batch-correction.
A typical bulk cohort has n = 30-300 samples and 10^4-10^6 features per omic, so after stacking blocks n is smaller than p by three to four orders of magnitude. In that regime an integrated signature that has not been validated out-of-sample is overwhelmingly noise that fit the training samples. The deliverable is never "the integrated signature" - it is question-matched structure that survives three gates, each of which a common failure violates:
Organize the analysis around defending these three gates, not around picking a favorite tool.
A method is a point in a 3D space, not a single name. Stating where a method sits on each axis prevents the category's two deepest errors (horizontal/vertical confusion and concatenation at n<<p).
| Axis | Values | What it decides | |------|--------|-----------------| | Stage - WHEN blocks combine (Ritchie 2015, Picard 2021) | early (concatenate then model), mixed (transform each block then combine), intermediate (jointly model blocks into shared + specific factors), late (model each omic, combine results) | early is worst at n<<p and variance imbalance; intermediate joint-latent (MOFA/JIVE/iCluster) is the discovery sweet spot; late is robust to missing blocks but drops feature-level cross-talk | | Correspondence - WHAT is tied together (Argelaguet 2021) | vertical (diff omics, same samples - THIS category), horizontal (same features, diff cohorts - meta-analysis), mosaic (partial overlap), diagonal (no shared axis - single-cell) | conflating horizontal and vertical is the deepest category error; only vertical and mosaic belong here | | Supervision - WHETHER an outcome drives it | unsupervised (discover subtypes/factors), supervised (predict/discriminate a label) | unsupervised plus then-correlate-with-outcome is hypothesis-generating, NOT a validated predictor |
MOFA = intermediate, vertical, unsupervised. DIABLO = intermediate, vertical, supervised. SNF = mixed/transformation, vertical, unsupervised. ComBat-across-cohorts = horizontal, unsupervised harmonization (routes OUT to differential-expression/batch-correction).
| Tool / class | Citation | Stage / supervision | When |
|--------------|----------|---------------------|------|
| MOFA2 | Argelaguet 2018 Mol Syst Biol 14:e8124; Argelaguet 2020 Genome Biol 21:111 | intermediate, unsupervised | shared vs view-specific factors; tolerant of missing omics-per-sample; the default factor model -> mofa-integration |
| mixOmics DIABLO (block.splsda) | Singh 2019 Bioinformatics 35:3055; Rohart 2017 PLoS Comput Biol 13:e1005752 | intermediate, supervised | sparse cross-omic signature that DISCRIMINATES known groups -> mixomics-analysis |
| mixOmics sPLS (spls) | Rohart 2017 PLoS Comput Biol 13:e1005752 | intermediate, unsupervised | covariance-maximizing feature pairs between TWO blocks -> mixomics-analysis |
| mixOmics MINT (mint.splsda) | Rohart 2017 BMC Bioinformatics 18:128 | horizontal | SAME omic across multiple STUDIES (study as a known effect) - not cross-omic |
| SNF (SNFtool) | Wang 2014 Nat Methods 11:333 | mixed/transformation, unsupervised | patient stratification; feature count buys no votes; robust as complexity grows -> similarity-network |
| iCluster / iClusterPlus / moCluster | Shen 2009 Bioinformatics 25:2906; Meng 2016 J Proteome Res 15:755 | intermediate, unsupervised | ONE joint-latent clustering (vs reconciling K separate clusterings); subtype discovery |
| JIVE | Lock 2013 Ann Appl Stat 7:523 | intermediate, unsupervised | explicit joint + individual + noise decomposition (how much signal is cross-omic) |
| MFA / mixKernel | Mariette 2018 Bioinformatics 34:1009 | mixed | block weighting / kernel fusion to stop one omic dominating |
| Scenario | Recommended | Why | |----------|-------------|-----| | Different omics on the SAME samples, no phenotype, find shared axes | MOFA2 | unsupervised factor model; variance decomposition; native missing-block handling -> mofa-integration | | Different omics on the same samples, want patient SUBTYPES | SNF + spectral clustering (or iCluster) | transformation-stage; robust to high p and a noisy omic -> similarity-network | | Have a class label, want a cross-omic signature that discriminates it | mixOmics DIABLO + held-out cohort | supervised sparse multi-block PLS-DA -> mixomics-analysis | | Just two omics, want correlated feature pairs | mixOmics sPLS | sparse PLS for a block pair -> mixomics-analysis | | Quantify how much variation is joint vs omic-specific | JIVE (or the MOFA variance table) | explicit joint/individual split | | SAME omic across multiple studies/cohorts | -> differential-expression/batch-correction or mixOmics MINT | horizontal integration / meta-analysis, NOT cross-omic | | Mosaic cohort (some samples missing an omic) | MOFA2 (models the missingness) | intersecting to complete cases wastes scarce n -> data-harmonization | | Single-cell CITE-seq / 10x Multiome / unpaired diagonal | -> single-cell/multimodal-integration | per-cell generative models; n is large; different paradigm | | Per-omic DE then overlap the hit lists | -> differential-expression, methylation-analysis, proteomics | that is late integration by intersection, not joint modeling | | Validate a discovered subtype against outcome | -> clinical-biostatistics/survival-analysis | survival / KM / Cox lives there |
Default when uncertain: assemble a MultiAssayExperiment, confirm vertical paired (or mosaic) correspondence, run MOFA2 for an unsupervised map and read its per-view variance-explained table, then escalate to a supervised (DIABLO) or stratification (SNF) tool only if the question demands it.
Goal: Decide whether the data is a job for this category at all, and whether to model the missingness or intersect to complete cases.
Approach: Assemble the blocks into a MultiAssayExperiment (it coordinates assays, a sample map, and colData), then read off whether samples are fully paired, mosaic, or actually horizontal. Only vertical-paired and mosaic belong here.
library(MultiAssayExperiment)
mae <- MultiAssayExperiment(experiments=ExperimentList(rna=rna_mat, prot=prot_mat, methyl=methyl_mat),
colData=clinical)
upsetSamples(mae) # visualize which samples have which omics (mosaic structure)
table(complete.cases(mae)) # how many samples have EVERY omic
paired <- intersectColumns(mae) # complete-case fallback - counts the n it would cost
If complete.cases keeps most samples, complete-case methods (mixOmics, SNF) are fine. If a large fraction is mosaic, prefer MOFA2 (it models missing-view samples in its likelihood) over intersecting, because at n<<p discarding incomplete samples is expensive and imputing a whole block fabricates data (data-harmonization owns that decision).
Goal: Detect, before trusting any shared factor, whether one omic is set to dominate the integration purely because it has more features or larger scale.
Approach: After per-feature scaling, compare each block's total variance and feature count; a block contributing the overwhelming majority of stacked variance will hijack the shared latent space. The definitive check is the per-view variance-explained table that MOFA2 reports after fitting - if every factor loads on one view, equalize the blocks (MFA weighting, per-block keepX, or move to SNF) and refit.
block_var <- sapply(assays_list, function(x) sum(apply(x, 1, var))) # total variance per block
share <- block_var / sum(block_var)
share # any block >> others = imbalance risk
A block holding most of the stacked variance is a red flag that concatenation-style integration will re-discover it. This is the single best honesty check in the category; never skip the post-fit per-view variance read-out.
The held-out cohort is the endpoint, not in-cohort cross-validation. Three rules follow from n<<p:
perf/tune.* take nrepeat (10-50) - use it. Generic CV/overfitting theory lives in machine-learning/model-validation.Trigger: running MOFA/DIABLO/SNF on same-feature, multi-cohort data ("integrate my three RNA-seq studies"). Mechanism: the shared latent is indexed by sample and has nothing to align across feature-identical cohorts. Symptom: the tool runs and the top factors track cohort/run, not biology. Fix: recognize this as horizontal integration; use MINT, ComBat/sva, or differential-expression/batch-correction.
Trigger: reporting a DIABLO panel or a MOFA-factor-vs-outcome correlation from one cohort. Mechanism: at n<<p thousands of cross-omic feature pairs clear any threshold under the null; in-cohort CV is optimistically biased. Symptom: a beautiful signature that fails to replicate. Fix: hold out an independent cohort; frame an unvalidated finding as hypothesis-generating, never as a biomarker.
Trigger: concatenating blocks of very different feature counts/scales without equalization. Mechanism: the high-feature/high-variance omic casts the most votes for the shared factors. Symptom: every shared factor loads almost entirely on one view. Fix: read the per-view variance-explained table; equalize via MFA weighting / per-block keepX / per-feature z-scoring, or use SNF where each omic is one n x n network.
Trigger: using a tool whose output does not answer the question (e.g. SNF clusters reported with "driver features"). Mechanism: SNF selects no features, MOFA is unsupervised, DIABLO needs a label. Symptom: claims the method cannot support (SNF drivers without a post-hoc per-omic test; MOFA factors called predictive). Fix: map question -> class first (decision tree); do post-hoc per-omic differential analysis to find SNF subtype drivers.
Trigger: omics generated on different platforms/labs/dates, interpreted without a technical check. Mechanism: the samples that ran together in every assay form a shared technical axis. Symptom: the top shared factor tracks run date / plate / site better than phenotype. Fix: correlate top factors against technical covariates before interpreting; correct per omic or model batch as a covariate (data-harmonization), watching for over-correction.
Trigger: intersectColumns on a mosaic cohort before integrating. Mechanism: complete-case intersection drops every sample missing any omic. Symptom: n halves and power collapses. Fix: prefer MOFA2's native missing-view handling; reserve intersection for when mosaicism is minor.
| Threshold | Source | Rationale |
|-----------|--------|-----------|
| n<<p by ~3-4 orders of magnitude is the default regime | Subramanian 2020 Bioinform Biol Insights 14 | tens of samples, 10^4-10^6 features; dictates regularized/sparse methods and held-out validation |
| Repeated CV nrepeat 10-50 for any tuning at small n | mixOmics docs; n<<p variance | a single CV run at n~40 is noise; repetition stabilizes the estimate |
| Per-view variance-explained dominance flag: one view >~80% of every shared factor | Argelaguet 2018 Mol Syst Biol 14:e8124 (per-view variance decomposition) | a factor dominated by one view is view-specific structure, not integration |
| Drop MOFA factors below ~1-2% variance explained in every view | Argelaguet 2018 Mol Syst Biol 14:e8124 | low-variance factors are noise/over-parameterization |
| Held-out independent cohort for any reported biomarker/subtype | Subramanian 2020 Bioinform Biol Insights 14 | in-cohort CV at n<<p is optimistically biased; replication is the endpoint |
| Cross-check the headline with a second method class | Cantini 2021 Nat Commun 12:124; Tini 2019 Brief Bioinform 20:1269; Pierre-Jean 2020 Brief Bioinform 21:2011 | no single best method and methods diverge; a real result should survive a second class (e.g. a factor model and a fusion clustering) |
| Error / symptom | Cause | Solution | |-----------------|-------|----------| | Tool runs on multi-cohort data but factors are all batch | horizontal data in a vertical method | use MINT / ComBat; this is meta-analysis, not cross-omic integration | | n drops sharply after assembling the object | complete-case intersection on a mosaic cohort | use MOFA2 missing-view handling; intersect only if mosaicism is minor | | Shared factors explain mostly one omic | variance imbalance (feature count / scale) | equalize blocks (MFA / per-block keepX / z-score) or use SNF | | Signature does not replicate in a new cohort | reported from in-cohort CV at n<<p | hold out an independent cohort before claiming a biomarker | | Two methods give different subtypes | method-dependent result (benchmarks rank methods differently because each optimizes a different criterion - robustness vs clustering recovery vs feature selection) | report which method and why; cross-check; no universal best method |
tools
End-to-end CLIP-seq pipeline from FASTQ to ENCODE-compliant binding sites, single-nucleotide crosslink maps, annotation, motifs, and (optionally) differential binding. Use when running the full Yeo lab eCLIP / iCLIP / iCLIP2 / iCLIP3 / irCLIP / PAR-CLIP analysis with SMInput control, protocol-specific UMI extraction, ENCODE STAR parameters, CLIPper or Skipper peak calling with stringent log2 FC and -log10 p thresholds, IDR rescue and self-consistency QC, and downstream motif registration with mCross or PEKA.
development
Detect, date, and contextualize whole-genome duplication (WGD / paleopolyploidy) events using wgd v2 (Chen et al 2024), KsRates (Sensalari 2022 substitution-rate-corrected Ks dating), DupGen_finder (Qiao 2019), MAPS (Li 2018 phylogenomic), POInT (Conant 2008 ordered-block), SLEDGe (2024 ML-based), Whale.jl (Bayesian DL+WGD), and synteny-anchored paranome construction. Use when identifying ancient polyploidy from Ks distributions and synteny block analysis, positioning WGD events relative to speciation, distinguishing tandem from segmental from WGD duplications, dating the 2R/3R vertebrate / fish / salmonid WGDs, building paranome and Ks-age mixture models, applying KsRates substitution-rate correction across lineages, or testing alternative biased-fractionation / dosage-balance models post-WGD.
tools
Build whole-genome alignments using Progressive Cactus (Armstrong 2020 reference-free clade-level WGA), Minigraph-Cactus (Hickey 2024 pangenome-aware), LASTZ chain/net (UCSC pipeline), MUMmer4 (Marçais 2018 pairwise), minimap2 -x asm5/10/20 (Li 2018 fast pairwise), AnchorWave (Song 2022 WGD-aware), and Mauve / progressiveMauve (bacterial). Operates the HAL toolkit (Hickey 2013) for downstream extraction including halSynteny, halLiftover, halBranchMutations, and hal2maf. Use when constructing multi-species alignments for comparative-annotation projection (TOGA), synteny detection, conservation analyses (phyloP / PhastCons), or pangenome graph construction; selecting between reference-free (Cactus) and reference-anchored (LASTZ chains/nets) approaches; tuning sensitivity for closely vs distantly related genomes; or producing HAL files for genome-wide downstream tools.
development
Detect syntenic blocks and structural rearrangements between genomes using MCScanX (Wang 2012), JCVI/MCScan (Tang 2008 Python), GENESPACE (Lovell 2022) for orthology-anchored riparian visualization, SyRI for structural variation, AnchorWave for sequence-level synteny, i-ADHoRe 3.0 for highly diverged species, SynNet for synteny networks, and ntSynt for multi-genome macrosynteny. Use when identifying collinear gene blocks across species, distinguishing macrosynteny from microsynteny, detecting inversions/translocations/duplications, anchoring orthology in WGD lineages, producing publication riparian plots, computing synteny block age via Ks (cross-references whole-genome-duplication), or running synteny-aware ortholog inference in polyploids.