Key Points
Introduction to multi-omics
- Multi-omics data contains several data types measured from the same samples. Each data type looks at the samples from a different angle.
- A table of taxa tells who is there, but not what the bacteria do or how the host responds. Multi-omics links the microbiome to its functions, its metabolites and the host, and points towards mechanisms.
- Each data type is generated with its own method, and needs its own preparation. Microbiome counts are compositional; metabolites and biomarkers are not.
- Tables computed from the same reads, such as taxa and pathways, are related by construction.
- Multi-omics studies need matched samples, groups mixed across batches, and enough samples with all data types.
- Exploratory methods test whether the data types are related, unsupervised methods find shared patterns, and supervised methods predict an outcome from all data types.
MultiAssayExperiment and the study data
- The HintikkaXO data has three data types from 40 rats: microbiota, metabolites and host biomarkers. The rats were fed a high-fat or a low-fat diet, with or without the prebiotic XOS.
- A
MultiAssayExperimentholds several experiments (here three TreeSEs), one shared table of sample information (colData()) and asampleMap()that links them. -
[[picks one experiment, and$accesses the sample information.getWithColData()returns an experiment together with the sample information. -
upsetSamples()shows which samples have which data types, andintersectColumns()keeps the samples that have all of them. - Subsetting by samples keeps all experiments in sync.
subsetByRow()subsets the features of each experiment. -
sampleMap()links each column (colname) of each experiment to a subject (primary) incolData(). - Each data type needs its own preparation: we agglomerate, filter and rclr-transform the compositional microbiota, replace values below the detection limit and log-transform the metabolites, and keep the biomarkers as they are.
Exploratory methods
- Exploratory integration goes from the big picture to the details: global association, feature vs data type, and feature vs feature.
-
getMantel()tests whether two data types are related overall;getMiRKAT()finds the features of one data type that relate to the other as a whole. -
getPairwiseAssociation()calculates the association of every pair of features;subsetByRow()keeps the result small enough to plot. - The Mantel test and MiRKAT are permutation or kernel tests: they compare similarities between samples instead of single features.
- A shared factor, such as the diet, creates associations between data
types. Check associations within each group (
group.by). Associations are hypotheses, not proof that a bacterium produces a metabolite.
Unsupervised methods
- Unsupervised integration methods find the main patterns that several data types share, without knowing the study groups.
- Use rclr with
impute = FALSE, so that the integration methods handle the zeros themselves. - Joint RPCA (
addJointRPCA()) draws one map of the samples from two or more data types;plotJointRPCA()shows the samples and the features that drive the map. - MOFA is a factor model: a few hidden factors, shared by all data types or specific to one, explain the data. Standardize the features, and ask for few factors when there are few samples.
-
plot_variance_explained()shows how much of each data type each factor explains, andplot_top_weights()the features that drive it. - Joint RPCA and MOFA show the shared patterns in different ways; in our data they agree.
- In our study, the main shared pattern is the fat in the diet. Smaller effects, such as XOS, can be hidden by larger ones.
Supervised methods
- Supervised integration predicts an outcome from several data types. Early fusion joins the tables, late fusion combines the predictions of separate models, and intermediate fusion combines what separate models learned.
-
IntegratedLearner()trains models on aMultiAssayExperimentand reports cross-validated AUCs for each data type and for early and late fusion, plus the weight of each data type. - DIABLO (
block.splsda()) selects a few features from each data type that together tell the groups apart and are correlated with each other. - Always evaluate a supervised model with cross-validation. Combining data types does not create a signal that is not in the data.
Summary
- Exploratory methods test whether data types are related, unsupervised methods find shared patterns, and supervised methods predict an outcome.
- Choose the group of methods by the research question, and look for results that are consistent across methods.
- Integrating data types does not create a signal that is not in the data.