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 MultiAssayExperiment holds several experiments (here three TreeSEs), one shared table of sample information (colData()) and a sampleMap() 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, and intersectColumns() 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) in colData().
  • 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, and plot_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 a MultiAssayExperiment and 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.