IntegratedLearner

Introduction

This vignette is a practical tutorial for binary, multiclass, continuous, and survival outcome workflows in IntegratedLearner.

IntegratedLearner is designed for multi-omics studies where each assay layer can carry complementary signal and where users want a unified interface for per-layer modeling, early fusion, and late fusion. This makes the package a natural fit for Bioconductor workflows built around MultiAssayExperiment, SummarizedExperiment, and curated assay containers.

Within the Bioconductor ecosystem, the package is intended to sit after assay assembly and harmonization, and before downstream interpretation. IntegratedLearner focuses on supervised multi-omics prediction/integration rather than general container management or unsupervised integration.

How this fits in a Bioconductor workflow

In a standard Bioconductor analysis, you would typically import or construct assay-level data, store those assays in a MultiAssayExperiment, inspect the object with standard accessors, fit IntegratedLearner(), and then carry predictions, layer weights, and feature-level summaries into downstream interpretation or visualization steps.

Workflow at a Glance

A compact workflow is:

  1. Construct aligned assays in MultiAssayExperiment.
  2. Inspect experiments and metadata with experiments(), assay(), colData(), and sampleMap().
  3. Fit single-layer and fused predictive models with IntegratedLearner().
  4. Feed predictions, layer weights, and feature summaries into downstream Bioconductor interpretation workflows.

Compared with packages that primarily focus on assay containers, preprocessing, or narrower outcome families, IntegratedLearner is centered on the modeling layer itself: it provides a common interface for continuous, binary, multiclass, and survival prediction while remaining compatible with standard Bioconductor data structures. In that sense, it is intended to complement upstream Bioconductor tools rather than replace them.

The goal is to show a complete end-to-end pattern you can adapt to your own multi-omics study:

  1. Build correctly formatted training/validation inputs.
  2. Fit per-layer, stacked, and concatenated learners.
  3. Interpret model outputs (AUC, accuracy, balanced accuracy, R2, survival discrimination curves, layer weights, and feature signals).

IntegratedLearner supports two integration paradigms:

  • Early fusion: concatenated features across layers.
  • Late fusion: layer-specific models combined by a meta-learner.

Optional feature selection workflow used in this vignette:

  1. Filtering first (filter_method, filter_pct) on training features.
  2. Screening second (run_screening = TRUE, screen_pct) in a fold-safe manner:
    • selected on fold-training only,
    • applied to fold-validation,
    • repeated for each fold,
    • repeated once on full training data for final model fit.

Installation

Install the release version from Bioconductor with:

if (!requireNamespace("BiocManager", quietly = TRUE)) {
  install.packages("BiocManager")
}
BiocManager::install("IntegratedLearner")

For the development version, use:

BiocManager::install("himelmallick/IntegratedLearner")

Load Packages

# Main package
library(IntegratedLearner)

# Tutorial dependencies
library(dplyr)
library(ggplot2)
library(SuperLearner)
library(caret)
library(cowplot)
library(bayesplot)
library(S4Vectors)
library(SummarizedExperiment)
library(MultiAssayExperiment)
library(survival)
if (use_sl_bart) {
  library(bartMachine)
}

Input Data Contract

This vignette uses MultiAssayExperiment throughout and treats MAE as the primary user-facing entry point. The older PCL input mode is still supported for backward compatibility, but the recommended workflow is to stay inside standard Bioconductor containers for data inspection and model handoff.

For IntegratedLearner, each MAE example should satisfy:

  • each omics layer is stored as a separate experiment, typically a SummarizedExperiment
  • samples are aligned across experiments through MAE colData
  • the outcome column lives in top-level colData
  • the subject identifier column also lives in top-level colData

For survival workflows, colData should contain time and event columns (with event coded as 0/1). You can also keep a convenience survival column such as Y or outcome_surv as a Surv(time, event) object.

You can keep your own column names and map them in the wrapper:

fit <- IntegratedLearner(
  MAE_train = mae_train,
  outcome_col = "disease_status",
  subject_id_col = "participant_id",
  family = stats::binomial()
)

Automatic coercion in the wrapper:

  • family = gaussian(): outcome is coerced to numeric (errors if conversion fails).
  • binary family = binomial(): two classes are mapped internally to {0,1}.
  • multiclass family = binomial(): class labels are retained.

Standard Bioconductor Accessors

IntegratedLearner is intended to plug into a standard Bioconductor workflow, not replace one. In practice, users should continue to inspect and manipulate their inputs with the usual MultiAssayExperiment and SummarizedExperiment accessors before modeling:

data("PRISM_MAE", package = "IntegratedLearner")

mae_example <- PRISM_MAE

# Top-level sample annotations used by IntegratedLearner
head(as.data.frame(S4Vectors::DataFrame(MultiAssayExperiment::colData(mae_example)))[, 1:4])
#>        Diagnosis dysbiosis_score Y subjectID
#> G35127        CD       0.9341207 1    G35127
#> G35128        CD       0.5962602 1    G35128
#> G35152        CD       0.9505732 1    G35152
#> G36347        CD       0.9966957 1    G36347
#> G36348        CD       0.8475403 1    G36348
#> G36349        CD       0.9569372 1    G36349

# Available experiments/layers in the MAE
names(MultiAssayExperiment::experiments(mae_example))
#> [1] "species"     "metabolites"

# Pull one layer as a SummarizedExperiment
se_example <- MultiAssayExperiment::experiments(mae_example)[[1]]
class(se_example)
#> [1] "SummarizedExperiment"
#> attr(,"package")
#> [1] "SummarizedExperiment"

# Standard assay extraction from the layer
assay_names <- SummarizedExperiment::assayNames(se_example)
assay_names
#> [1] "abundance"
head(SummarizedExperiment::assay(se_example, assay_names[1]))
#>                                G35127      G35128      G35152       G36347
#> Granulicella_unclassified -0.05253649 -0.05127158 -0.06133085  0.004887447
#> Actinomyces_graevenitzii   1.04668500 -1.32629194 -1.51654615 -3.247989324
#> Actinomyces_johnsonii     -0.70327678 -0.41575776 -0.29326475 -0.314361595
#> Actinomyces_massiliensis  -0.56808952  0.14722099  0.05660884 -1.077235688
#> Actinomyces_naeslundii    -0.49546119 -0.15921604 -0.03146485 -0.354377267
#> Actinomyces_odontolyticus -2.60071428 -2.10648484 -3.10982881 -3.846828858
#>                                 G36348      G36349      G36350      G36351
#> Granulicella_unclassified -0.006164066 -0.06068187  0.01958055 -0.00291914
#> Actinomyces_graevenitzii  -0.717183019 -1.50427168 -1.68488463 -0.65581069
#> Actinomyces_johnsonii     -0.340485318 -0.30116753 -0.33870436 -0.37999919
#> Actinomyces_massiliensis  -0.159240362  0.06245478 -0.50807364 -0.13001064
#> Actinomyces_naeslundii    -0.139758576 -0.03970686 -0.27103949 -0.18096864
#> Actinomyces_odontolyticus -2.238237450 -0.22407833 -2.10747316  7.10740921
#>                                G36352       G36353      G36354      G36355
#> Granulicella_unclassified -0.05776143 -0.007104484 -0.02798171 -0.04964912
#> Actinomyces_graevenitzii  -1.44903659 -2.227858510 -1.16809841  0.28934691
#> Actinomyces_johnsonii     -0.33673001 -0.631955729 -0.69300749 -0.43551469
#> Actinomyces_massiliensis   4.12202564 -0.871627902 -0.47895003  0.16183585
#> Actinomyces_naeslundii    -0.07679592 -0.480124737 -0.41065892 -0.17982107
#> Actinomyces_odontolyticus -2.75380353 -2.700100958 -2.34537624 -1.94465517
#>                                 G36356      G36357      G36358      G36359
#> Granulicella_unclassified  0.001299263 -0.01103146  0.01730911 -0.07698314
#> Actinomyces_graevenitzii  -0.576026671 -0.80924151 -1.72784526 -1.85085413
#> Actinomyces_johnsonii     -0.431367226 -0.28121451 -0.31104465 -0.72086328
#> Actinomyces_massiliensis  -0.092011992 -0.20308495 -0.52853445 -0.20756435
#> Actinomyces_naeslundii    -0.234541714 -0.07794349 -0.24219244 -0.38066431
#> Actinomyces_odontolyticus -1.493820959 -2.72372647 -2.33403470 -2.60201484
#>                                 G36360     G36361       G36362      G36363
#> Granulicella_unclassified -0.005839574 0.01800834  0.009845776 -0.05970839
#> Actinomyces_graevenitzii  -0.711045786 4.42949600 -1.869001603 -1.48585999
#> Actinomyces_johnsonii     -0.344436706 8.47614049 -0.220162746 -0.31302169
#> Actinomyces_massiliensis  -0.156317389 8.86079698 -0.595762822  0.07122370
#> Actinomyces_naeslundii    -0.143879582 6.12525018 -0.147409306 -0.05206988
#> Actinomyces_odontolyticus -2.205871516 7.27449295  4.629397782  4.99684820
#>                                G36365       G36366       G36367      G36368
#> Granulicella_unclassified -0.06295331 -0.004217111 -0.005806513 -0.06003288
#> Actinomyces_graevenitzii  -1.54723231 -0.680359624  1.168632075 -1.49199722
#> Actinomyces_johnsonii     -0.27350782 -0.364193642 -0.647761278 -0.30907030
#> Actinomyces_massiliensis   0.04199397 -0.141702527 -0.859936012  0.06830073
#> Actinomyces_naeslundii    -0.01085982 -0.164484612 -0.496608761 -0.04794888
#> Actinomyces_odontolyticus -3.27165848 -2.044041844 -2.570637221  2.90391516
#>                                G36369      G36370       G36371       G36372
#> Granulicella_unclassified -0.05224506 -0.01694897 -0.004866096 -0.063277806
#> Actinomyces_graevenitzii  -1.34470364 -0.95943251 -0.692634089 -1.553369545
#> Actinomyces_johnsonii     -0.40390360 -0.82735466 -0.356290867 -0.269556429
#> Actinomyces_massiliensis   0.13845207 -0.37956896 -0.147548472  0.039071002
#> Actinomyces_naeslundii    -0.14685302 -0.55077312 -0.156242600 -0.006738816
#> Actinomyces_odontolyticus -2.20358264 -1.24493447  0.791680370  2.332149272
#>                                G36374       G36375      G36378      G36379
#> Granulicella_unclassified -0.06789735  0.009196791  0.01860708 -0.04142710
#> Actinomyces_graevenitzii  -1.67901162 -1.881276067 -1.70329633 -2.59471794
#> Actinomyces_johnsonii     -0.83150213 -0.212259971 -0.32685020 -0.22035883
#> Actinomyces_massiliensis  -0.12572112 -0.601608767 -0.51684256 -0.34483795
#> Actinomyces_naeslundii    -0.49605247 -0.139167294 -0.25867647 -0.08856765
#> Actinomyces_odontolyticus -1.69576868 -3.143183056  6.35613318 -3.56165133
#>                                G36380      G36381      G36382      G36383
#> Granulicella_unclassified -0.04110260 -0.05224506  0.03593207 -0.05938389
#> Actinomyces_graevenitzii   4.94228519  6.48054316 -1.45023842 -1.47972275
#> Actinomyces_johnsonii     -0.22431021 -0.40390360 -0.38312005 -0.31697308
#> Actinomyces_massiliensis  -0.34191498  0.13845207 -0.92963674  0.07414667
#> Actinomyces_naeslundii    -0.09268866 -0.14685302 -0.35199511 -0.05619089
#> Actinomyces_odontolyticus -3.52928540 -2.20358264 -2.94417212 -2.91563320
#>                                G36384      G36385      G36386      G36387
#> Granulicella_unclassified -0.02150616 -0.01135595 -0.05873491 -0.02904613
#> Actinomyces_graevenitzii  -2.29256218 -0.81537874 -1.46744829 -2.47343934
#> Actinomyces_johnsonii     -0.30823977 -0.27726312 -0.32487585 -0.83462299
#> Actinomyces_massiliensis  -0.73424835 -0.20600792  0.07999262 -0.92534723
#> Actinomyces_naeslundii    -0.21485434 -0.07382248 -0.06443290 -0.66707895
#> Actinomyces_odontolyticus -4.04232502  3.86252714 -2.85090133 -2.72536270
#>                                G36389      G36390      G36392      G36394
#> Granulicella_unclassified  0.02814425  0.01633563 -0.02116737 -0.07503618
#> Actinomyces_graevenitzii  -1.59753200 -1.74625695 -1.03921653 -1.81403073
#> Actinomyces_johnsonii     -0.28828676 -0.29919049 -0.77598663  5.27878701
#> Actinomyces_massiliensis  -0.99978808 -0.53730337 -0.41756761 -0.19002652
#> Actinomyces_naeslundii    -0.25309097 -0.22982943 -0.49720004  2.51945997
#> Actinomyces_odontolyticus -3.72095455 -2.43113250  3.65622523  6.23559551
#>                                G36395      G36396      G48777      G48780
#> Granulicella_unclassified  0.01958055 -0.02580121 -0.06133085 -0.05776143
#> Actinomyces_graevenitzii   3.91094074 -2.41206702 -0.43401430  1.28416581
#> Actinomyces_johnsonii     -0.33870436 -0.87413686 -0.29326475  6.10453778
#> Actinomyces_massiliensis  -0.50807364 -0.89611750  0.05660884  2.67421984
#> Actinomyces_naeslundii    -0.27103949 -0.70828901 -0.03146485 -0.07679592
#> Actinomyces_odontolyticus -2.10747316  4.91222115  1.64870221  5.85895296
#>                                G48781        G48783      G48784      G48786
#> Granulicella_unclassified  0.02087852 -0.0006476922 -0.05675489  0.03171367
#> Actinomyces_graevenitzii  -1.66033570 -0.6128500661  1.96124137  5.51434470
#> Actinomyces_johnsonii     -0.35450991  2.0687611082 -0.65190875 -0.33175202
#> Actinomyces_massiliensis  -0.49638175 -0.1095498280 -0.60608817 -0.96763539
#> Actinomyces_naeslundii    -0.28752351 -0.2098156784  1.24942852 -0.29842203
#> Actinomyces_odontolyticus -1.97800942 -1.6880165658  2.93588947  3.91180455
#>                                 G48787      G48789      G48790      G48791
#> Granulicella_unclassified -0.005515081 -0.01103146 -0.01070696 -0.01070696
#> Actinomyces_graevenitzii  -0.704908554  4.39332806  2.07609172 -0.80310427
#> Actinomyces_johnsonii     -0.348388093 -0.28121451 -0.28516590 -0.28516590
#> Actinomyces_massiliensis  -0.153394417 -0.20308495 -0.20016198 -0.20016198
#> Actinomyces_naeslundii    -0.148000588 -0.07794349 -0.08206449 -0.08206449
#> Actinomyces_odontolyticus -2.173505582  3.96560227  5.71608938  1.57677340
#>                                G48792      G48793       G48794      G48795
#> Granulicella_unclassified -0.01103146 -0.01038247 -0.008760007 -0.02604906
#> Actinomyces_graevenitzii  -0.80924151 -0.79696704 -0.766280879  4.07521830
#> Actinomyces_johnsonii      6.92682253 -0.28911728 -0.308874220 -0.25292035
#> Actinomyces_massiliensis  -0.20308495 -0.19723901 -0.182624143 -0.77516997
#> Actinomyces_naeslundii    -0.07794349 -0.08618550 -0.106790529 -0.15716026
#> Actinomyces_odontolyticus -2.72372647 -2.65899460 -2.497164926  1.93283843
#>                                G48796       G48798      G48799     G48802
#> Granulicella_unclassified  0.01601114 -0.008111022  0.02282548 -0.0090845
#> Actinomyces_graevenitzii  -0.75239419  3.214224126  2.84358630 -0.7724181
#> Actinomyces_johnsonii     -0.29523910 -0.316776995 -0.37821824 -0.3049228
#> Actinomyces_massiliensis  -0.54022634 -0.176778198 -0.47884392 -0.1855471
#> Actinomyces_naeslundii    -0.22570842 -0.115032540 -0.31224955 -0.1026695
#> Actinomyces_odontolyticus -2.46349843  3.057708089  3.01664333  3.4824312
#>                                G48804       G48805      G48806      G48807
#> Granulicella_unclassified  0.01893157  0.006326602 -0.05321854 -0.01297841
#> Actinomyces_graevenitzii  -1.69715909 -2.048447396  8.79860850  2.71750390
#> Actinomyces_johnsonii     -0.33080159 -0.640808932 -0.39204943 -0.25750619
#> Actinomyces_massiliensis  -0.51391959 -1.319497754  0.12968315 -0.22062279
#> Actinomyces_naeslundii    -0.26279747 -0.523991309 -0.13449000 -0.05321745
#> Actinomyces_odontolyticus  1.52083872 -3.828093337 -2.30068045  3.32493041
#>                                G48808      G48810      G48812      G48814
#> Granulicella_unclassified -0.01005798 -0.04110260 -0.02650044  0.02752833
#> Actinomyces_graevenitzii   4.35102026  3.96964561  1.92658333  1.55278289
#> Actinomyces_johnsonii     -0.29306867 -0.22431021 -0.40212264 -0.58370856
#> Actinomyces_massiliensis  -0.19431603 -0.34191498 -0.21038121  1.49469774
#> Actinomyces_naeslundii    -0.09030650 -0.09268866 -0.27813393 -0.59757813
#> Actinomyces_odontolyticus  1.96683686  3.67370141  6.32296792  3.39267094
#>                                G48815       G48817      G48819       G48820
#> Granulicella_unclassified -0.05419201  0.002921726  0.04577656  0.007624573
#> Actinomyces_graevenitzii  -1.38152703 -0.545340509  2.34867916 -2.023898466
#> Actinomyces_johnsonii     -0.38019527 -0.451124162 -0.18772112 -0.656614481
#> Actinomyces_massiliensis   0.12091423 -0.077397130  1.96581859 -1.307805863
#> Actinomyces_naeslundii    -0.12212698 -0.255146744 -0.28134673 -0.540475333
#> Actinomyces_odontolyticus -2.39777825 -1.331991287  2.74634317  0.348781581
#>                                 G48821        G48822      G48823        G48826
#> Granulicella_unclassified -0.008435515 -0.0003231996  1.76377322 -0.0009721848
#> Actinomyces_graevenitzii   3.291973864  6.2483293085 -1.46744829 -0.6189872986
#> Actinomyces_johnsonii      2.229733223 -0.4116102892 -0.32487585 -0.4037075146
#> Actinomyces_massiliensis   0.885925692  0.8933731446  0.07999262 -0.1124728006
#> Actinomyces_naeslundii    -0.110911535 -0.2139366844 -0.06443290 -0.2056946724
#> Actinomyces_odontolyticus  5.007733793  5.4681324015 -1.11390082  4.8903973023
#>                                 G48827      G48831      G48832     G48836
#> Granulicella_unclassified -0.063277806 -0.01103146 -0.05321854  0.0258728
#> Actinomyces_graevenitzii  -1.553369545 -0.80924151 -1.36311534  4.0891743
#> Actinomyces_johnsonii     -0.269556429 -0.28121451  3.35116173 -0.2606270
#> Actinomyces_massiliensis   0.039071002 -0.20308495  0.12968315  1.3085295
#> Actinomyces_naeslundii    -0.006738816 -0.07794349 -0.13449000  0.7757561
#> Actinomyces_odontolyticus  3.712401655 -2.72372647 -1.30068045 -1.8098504
#>                                 G48838     G48839      G48840      G48841
#> Granulicella_unclassified  0.006925342  0.9223679 -0.05707939 -0.03683396
#> Actinomyces_graevenitzii  -1.924236695 -0.8213358  3.92099183  3.02140896
#> Actinomyces_johnsonii     -0.184600260 -0.7129605  6.23945313 -0.73978969
#> Actinomyces_massiliensis  -0.622069575 -0.2134103  3.86113030 -0.99549857
#> Actinomyces_naeslundii    -0.110320252 -0.3724223  3.41760737 -0.56817481
#> Actinomyces_odontolyticus  3.955778233  1.6931378  8.39745649 -3.50214512
#>                                G48842      G72670      G72671      G72672
#> Granulicella_unclassified -0.01232943 -0.06262882 -0.01297841 -0.04272507
#> Actinomyces_graevenitzii   4.05319320 -1.54109508 -0.84606490 -0.42135433
#> Actinomyces_johnsonii      6.20258541 -0.27745920 -0.25750619 -0.20455328
#> Actinomyces_massiliensis   4.93831575  0.04491695 -0.22062279 -0.35652984
#> Actinomyces_naeslundii     2.52663443 -0.01498083 -0.05321745 -0.07208363
#> Actinomyces_odontolyticus  3.61065451  2.69300925 -2.91792207  1.72841300
#>                                G72673      G72674      G72675      G72676
#> Granulicella_unclassified  0.01276621 -0.06165534 -0.01759795 -0.02475108
#> Actinomyces_graevenitzii   1.29841674  5.74354939 -0.97170697 -2.35393450
#> Actinomyces_johnsonii     -0.25572523  0.71068664 -0.81945188 -0.26872590
#> Actinomyces_massiliensis  -0.56945607  0.05368586 -0.38541491 -0.76347808
#> Actinomyces_naeslundii    -0.18449836  3.19559594 -0.54253111 -0.17364429
#> Actinomyces_odontolyticus -2.78715778  2.40625530 -1.30966634  2.26918195
#>                                G72677      G72678      G72679       G72680
#> Granulicella_unclassified -0.04207608 -0.05905940 -0.02960418 -0.008726947
#> Actinomyces_graevenitzii  -2.60699241 -1.47358552  3.40721271  4.650455876
#> Actinomyces_johnsonii     -0.21245605 -0.32092446 -0.67325056 -0.612198792
#> Actinomyces_massiliensis  -0.35068390  0.07706965 -0.49356489  2.287404745
#> Actinomyces_naeslundii    -0.08032564 -0.06031189 -0.39005389 -0.459519707
#> Actinomyces_odontolyticus -3.62638320 -2.88326727 -2.50720591 -2.861930630
#>                                G72681      G72682      G72683      G72684
#> Granulicella_unclassified -0.06295331 -0.04867564  0.02120302 -0.04040337
#> Actinomyces_graevenitzii   2.19187324 -1.27719408  1.12921192 -2.68824248
#> Actinomyces_johnsonii     -0.27350782 -0.44736886 -0.35846130 -0.69632443
#> Actinomyces_massiliensis   0.04199397  0.17060477 -0.49345878 -1.02765127
#> Actinomyces_naeslundii    -0.01085982 -0.19218409  4.29854609 -0.52284374
#> Actinomyces_odontolyticus  2.76693068  3.91372245 -1.94564348  2.19493040
#>                                G72685      G72686       G72687        G72688
#> Granulicella_unclassified -0.07763212 -0.02506128 -0.009375932  1.293047e-06
#> Actinomyces_graevenitzii   5.47669458 -1.11286332 -2.270819137 -6.005756e-01
#> Actinomyces_johnsonii     -0.71296051 -0.72856998 -0.604296018 -4.155617e-01
#> Actinomyces_massiliensis  -0.21341030 -0.45264328 -0.892088710 -1.037039e-01
#> Actinomyces_naeslundii    -0.37242229 -0.44774797 -0.451277695 -2.180577e-01
#> Actinomyces_odontolyticus  3.56077819 -2.05408283 -2.926662499 -1.623285e+00
#>                                G72689      G72690     G72691       G72692
#> Granulicella_unclassified -0.07795662  0.02314997 0.02055403 -0.007104484
#> Actinomyces_graevenitzii  -1.86926582 -1.61737507 4.61147184 -2.227858510
#> Actinomyces_johnsonii     -0.70900912 -0.38216962 8.82237644 -0.631955729
#> Actinomyces_massiliensis  -0.21633327 -0.47592095 5.13125652 -0.871627902
#> Actinomyces_naeslundii    -0.36830129 -0.31637055 1.63645976 -0.480124737
#> Actinomyces_odontolyticus  2.98644355 -1.75144788 9.83577984 -2.700100958
#>                                G72693      G72694       G72695       G72696
#> Granulicella_unclassified -0.02747391 -0.02650044  0.001299263  0.009521283
#> Actinomyces_graevenitzii   4.96992615 -2.31240525 -0.576026671 -1.875138835
#> Actinomyces_johnsonii     -0.39026848 -0.40212264 -0.431367226 -0.216211358
#> Actinomyces_massiliensis  -0.21915013 -0.21038121 -0.092011992 -0.598685794
#> Actinomyces_naeslundii    -0.26577091 -0.27813393 -0.234541714 -0.143288300
#> Actinomyces_odontolyticus -2.16991615 -2.07281835 -1.493820959  1.322187876
#>                                 G72697      G72698      G72699       G72701
#> Granulicella_unclassified  0.009845776 -0.06230433 -0.05094709  0.003570712
#> Actinomyces_graevenitzii  -1.869001603 -1.53495785 -1.32015471 -0.533066044
#> Actinomyces_johnsonii     -0.220162746 -0.28141059 -0.41970914 -0.459026936
#> Actinomyces_massiliensis  -0.595762822  0.04783992  0.15014396 -0.071551184
#> Actinomyces_naeslundii    -0.147409306 -0.01910183 -0.16333704 -0.263388756
#> Actinomyces_odontolyticus  2.214319598 -3.20692661 -2.07411891  7.835787130
#>                                G72702       G72703      G72704      G72705
#> Granulicella_unclassified -0.02700824  0.009845776 -0.02742367  0.02444794
#> Actinomyces_graevenitzii  -1.14968672 -1.869001603 -2.44275318 -1.59282614
#> Actinomyces_johnsonii     -0.70486165 -0.220162746 -0.85437992 -0.39797517
#> Actinomyces_massiliensis  -0.47018111 -0.595762822 -0.91073236 -0.46422906
#> Actinomyces_naeslundii    -0.42302194 -0.147409306 -0.68768398 -0.33285458
#> Actinomyces_odontolyticus -2.24827843 -3.078451187 -2.56353302 -1.62198414
#>                               G72706      G72708      G72709      G72710
#> Granulicella_unclassified  0.0130907 -0.07698314  0.01893157  0.02282548
#> Actinomyces_graevenitzii  -1.8076293  4.61528535  2.40557677 -1.62351230
#> Actinomyces_johnsonii     -0.2596766 -0.72086328 -0.33080159 -0.37821824
#> Actinomyces_massiliensis  -0.5665331 -0.20756435 -0.51391959 -0.47884392
#> Actinomyces_naeslundii    -0.1886194 -0.38066431 -0.26279747 -0.31224955
#> Actinomyces_odontolyticus -2.7547918 -2.60201484 -2.17220502  2.61815782
#>                                G72711     G72712      G72713       G72714
#> Granulicella_unclassified  0.01114375  0.0218520 -0.05094709 -0.001945663
#> Actinomyces_graevenitzii  -0.20402204 -1.6419240 -1.32015471  5.192483408
#> Actinomyces_johnsonii     -0.23596829 -0.3663641 -0.41970914 -0.391853353
#> Actinomyces_massiliensis   5.67000638 -0.4876128  0.15014396 -0.121241718
#> Actinomyces_naeslundii    -0.16389333 -0.2998865 -0.16333704  4.319849522
#> Actinomyces_odontolyticus  5.05774842 -1.8809116 -2.07411891 -1.817480303
#>                                G72715      G72716      G72717      G72718
#> Granulicella_unclassified  0.00584216 -0.01038247 -0.01038247 -0.01330290
#> Actinomyces_graevenitzii  -0.49010542 -0.79696704 -0.79696704 -0.85220213
#> Actinomyces_johnsonii     -0.48668665 -0.28911728 -0.28911728 -0.25355480
#> Actinomyces_massiliensis  -0.05109038 -0.19723901 -0.19723901 -0.22354576
#> Actinomyces_naeslundii    -0.29223580 -0.08618550 -0.08618550 -0.04909644
#> Actinomyces_odontolyticus -1.04069788 -2.65899460 -0.26939485 -2.95028801
#>                                G72719      G72720      G72721      G72722
#> Granulicella_unclassified -0.01265392 -0.01200493 -0.01330290 -0.01330290
#> Actinomyces_graevenitzii  -0.83992767  5.15631919 -0.85220213 -0.85220213
#> Actinomyces_johnsonii     -0.26145757 -0.26936035 -0.25355480 -0.25355480
#> Actinomyces_massiliensis  -0.21769981 -0.21185387 -0.22354576 -0.22354576
#> Actinomyces_naeslundii    -0.05733846 -0.06558047 -0.04909644 -0.04909644
#> Actinomyces_odontolyticus  0.58258159  4.26804118 -2.95028801  2.32194955
#>                                G72723      G72724       G72725      G72726
#> Granulicella_unclassified -0.01232943 -0.01232943 -0.006488559 -0.01103146
#> Actinomyces_graevenitzii  -0.83379044 -0.83379044 -0.723320251 -0.80924151
#> Actinomyces_johnsonii     -0.26540896 -0.26540896 -0.336533931 -0.28121451
#> Actinomyces_massiliensis  -0.21477684 -0.21477684 -0.162163335 -0.20308495
#> Actinomyces_naeslundii    -0.06145946 -0.06145946 -0.135637570 -0.07794349
#> Actinomyces_odontolyticus -2.85319020  2.05198151 -2.270603385 -2.72372647
#>                                G72727      G72728      G72729      G72730
#> Granulicella_unclassified -0.01297841 -0.01330290 -0.01297841 -0.01232943
#> Actinomyces_graevenitzii  -0.84606490 -0.85220213 -0.84606490 -0.83379044
#> Actinomyces_johnsonii     -0.25750619 -0.25355480 -0.25750619 -0.26540896
#> Actinomyces_massiliensis  -0.22062279 -0.22354576 -0.22062279 -0.21477684
#> Actinomyces_naeslundii    -0.05321745 -0.04909644 -0.05321745 -0.06145946
#> Actinomyces_odontolyticus -2.91792207  1.23056949 -2.91792207  3.54596978
#>                                G72731       G72732      G72733      G72734
#> Granulicella_unclassified -0.01265392 -0.006813052 -0.01297841 -0.01297841
#> Actinomyces_graevenitzii  -0.83992767 -0.729457484 -0.84606490 -0.84606490
#> Actinomyces_johnsonii     -0.26145757 -0.332582544 -0.25750619 -0.25750619
#> Actinomyces_massiliensis  -0.21769981 -0.165086307 -0.22062279 -0.22062279
#> Actinomyces_naeslundii    -0.05733846 -0.131516564 -0.05321745 -0.05321745
#> Actinomyces_odontolyticus  2.04674580 -2.302969319 -2.91792207 -2.91792207
#>                                G72735        G72736      G72737
#> Granulicella_unclassified -0.01297841  0.0009747709 -0.01362740
#> Actinomyces_graevenitzii  -0.84606490 -0.5821639036 -0.85833937
#> Actinomyces_johnsonii     -0.25750619 -0.4274158382 -0.24960341
#> Actinomyces_massiliensis  -0.22062279 -0.0949349651 -0.22646873
#> Actinomyces_naeslundii    -0.05321745 -0.2304207083 -0.04497544
#> Actinomyces_odontolyticus  0.19754404 -1.5261868938  0.13542465

# MAE sample-to-assay mapping
head(MultiAssayExperiment::sampleMap(mae_example))
#> DataFrame with 6 rows and 3 columns
#>      assay     primary     colname
#>   <factor> <character> <character>
#> 1  species      G35127      G35127
#> 2  species      G35128      G35128
#> 3  species      G35152      G35152
#> 4  species      G36347      G36347
#> 5  species      G36348      G36348
#> 6  species      G36349      G36349

This is the expected Bioconductor pipeline pattern:

  1. Build assay-level objects as SummarizedExperiment instances.
  2. Combine them into a MultiAssayExperiment.
  3. Store outcome and subject identifiers in top-level colData.
  4. Pass the MAE into IntegratedLearner() for layer-wise, early-fusion, and late-fusion modeling.

Minimal MAE Workflow Example

The shortest end-to-end pattern starts from packaged MAE data, uses standard Bioconductor accessors for inspection, and then fits IntegratedLearner().

data("PRISM_MAE", package = "IntegratedLearner")

mae_min <- PRISM_MAE

names(MultiAssayExperiment::experiments(mae_min))
#> [1] "species"     "metabolites"
head(as.data.frame(S4Vectors::DataFrame(MultiAssayExperiment::colData(mae_min)))[, 1:4])
#>        Diagnosis dysbiosis_score Y subjectID
#> G35127        CD       0.9341207 1    G35127
#> G35128        CD       0.5962602 1    G35128
#> G35152        CD       0.9505732 1    G35152
#> G36347        CD       0.9966957 1    G36347
#> G36348        CD       0.8475403 1    G36348
#> G36349        CD       0.9569372 1    G36349
head(MultiAssayExperiment::sampleMap(mae_min))
#> DataFrame with 6 rows and 3 columns
#>      assay     primary     colname
#>   <factor> <character> <character>
#> 1  species      G35127      G35127
#> 2  species      G35128      G35128
#> 3  species      G35152      G35152
#> 4  species      G36347      G36347
#> 5  species      G36348      G36348
#> 6  species      G36349      G36349

se_min <- MultiAssayExperiment::experiments(mae_min)[[1]]
SummarizedExperiment::assayNames(se_min)
#> [1] "abundance"
dim(SummarizedExperiment::assay(se_min, SummarizedExperiment::assayNames(se_min)[1]))
#> [1] 340 155

fit_min <- IntegratedLearner(
  MAE_train = mae_min,
  experiment = names(MultiAssayExperiment::experiments(mae_min))[1:2],
  assay.type = rep("abundance", 2),
  folds = 2,
  base_learner = "SL.mean",
  run_stacked = FALSE,
  run_concat = FALSE,
  print_learner = FALSE,
  family = stats::binomial()
)

names(fit_min)
#>  [1] "model_fits"                         "SL_fits"                           
#>  [3] "X_train_layers"                     "Y_train"                           
#>  [5] "yhat.train"                         "base_learner"                      
#>  [7] "meta_learner"                       "base_screener"                     
#>  [9] "base_screener_used"                 "screening_used"                    
#> [11] "run_concat"                         "run_stacked"                       
#> [13] "drop_poor_performing_layers"        "fusion_layers_retained"            
#> [15] "fusion_layers_removed"              "fusion_layer_scores"               
#> [17] "fusion_layer_metric"                "fusion_layer_threshold"            
#> [19] "family"                             "feature.names"                     
#> [21] "test"                               "AUC.train"                         
#> [23] "accuracy.train"                     "balanced_accuracy.train"           
#> [25] "metrics.train"                      "feature_importance_signed"         
#> [27] "feature_importance_signed_by_layer" "folds"                             
#> [29] "cvControl"                          "time"                              
#> [31] "input_mode"                         "column_map"

Parameter Reference (Conbin, Multiclass, and Survival)

Common Wrapper Parameters (IntegratedLearner)

Parameter Default Applies to Description
MAE_train, MAE_valid NULL all MAE-mode inputs (training and optional validation).
PCL_train, PCL_valid NULL all Legacy tabular inputs retained for backward compatibility, but not used in this vignette.
experiment NULL MAE mode Selected MAE experiment names/indices; defaults to all experiments.
assay.type NULL MAE mode Assay names per selected experiment.
outcome_col "Y" all Outcome column name in MAE colData (or tabular sample metadata, if using PCL mode).
subject_id_col "subjectID" all Subject identifier column name in MAE colData (or tabular sample metadata, if using PCL mode).
na.rm FALSE all Drop features with missing values after extraction/prep.
folds 5 all Outer CV folds.
seed 1234 all Reproducibility seed.
base_learner "sl_bart" all Base learner. Standard SuperLearner learners still use SL.* IDs for continuous/binary, while IntegratedLearner wrappers use snake_case IDs such as sl_bart; multiclass uses native IDs (for example randomforest, xgboost, mbart), and survival runs should use a supported surv.* ID.
filter_method NULL all Optional feature filtering method: "prevalence" or "variance".
filter_pct NULL all Optional retention percentage in (0,100] for filtering.
run_screening FALSE all Enable supervised screening.
screen_pct NULL all Retention percentage in (0,100] for screening. Required when screening is enabled.
prevalence_pct NULL all Deprecated alias for prevalence filtering (filter_method = "prevalence").
drop_poor_performing_layers FALSE continuous, binary, survival If TRUE, removes layers with poor single-layer performance from early and late fusion only (AUC < 0.5 for binary, R² < 0.5 for continuous, C-index < 0.5 for survival). Single-layer results are still retained.
verbose FALSE all Print progress.
family gaussian() all Non-survival: gaussian()/binomial(). Multiclass is auto-detected when family = binomial() and outcome has more than two classes. Survival is auto-detected from metadata or family.
... — all Passed to the selected backend (IL_conbin or ILsurv).

Conbin-Specific Parameters (Continuous/Binary Path)

Parameter Default Description
base_screener "All" Deprecated compatibility parameter. Prefer run_screening + screen_pct.
meta_learner "sl_nnls_auc" Stacked meta learner for late fusion.
run_stacked TRUE Enables late-fusion stacked model.
run_concat TRUE Enables early-fusion concatenated model.
print_learner TRUE Prints fit summary.
refit.stack FALSE Refit stacked learner on full data for final predictions.

Multiclass-Specific Parameters (Native Multiclass Path)

Parameter Default Description
base_learner "glmnet" Native multiclass learner per layer and for concatenated fit. Supported: glmnet, randomforest, ranger, xgboost, mbart, multinom.
meta_learner "glmnet" Native multiclass learner used for stacked fusion.
base_screener "All" Deprecated compatibility parameter. Prefer run_screening + screen_pct.
run_stacked TRUE Enables late-fusion stacked multiclass model.
run_concat TRUE Enables early-fusion concatenated multiclass model.
folds 5 Subject-level CV folds for OOF multiclass probabilities.
run_screening, screen_pct FALSE, NULL Fold-safe multiclass screening (glmnet-based) after optional filtering.

Survival-Specific Parameters (via ...)

Parameter Default Description
do_early_fusion TRUE Train an early-fusion survival model on all features.
t_vec, t_vec_probs NULL, quantiles Time grid used in COX-style weighting summaries.
layer_score "sum" Aggregation of cumulative hazard increments (sum, mean, l2).
weight_lambda 0.02 Regularization strength for COX weighting optimizer.
weight_penalty "l2_to_uniform" or "entropy" Penalty used while learning survival late-fusion weights.
weight_cap 1.0 Optional cap on individual layer weights.
optim_maxit_cox 4000 Max iterations for COX weighting optimization.
optim_maxit_ibs 300 Max iterations for IBS weighting optimization.
ibs_shrink_to_uniform 0 Shrink IBS weights toward uniform blend.

Supported Models and Fusion Modules

Supported Models

Path Supported base models
Continuous/Binary (IL_conbin) Any SuperLearner-compatible learner available in your R session. Package wrappers include sl_bart, sl_lasso, sl_enet, sl_glmnet2, and sl_horseshoe, while standard SuperLearner learners such as SL.glm and SL.randomForest keep their original SL.* names.
Multiclass (IL_multiclass) Native multiclass learner IDs: glmnet, randomforest, ranger, xgboost, mbart, multinom.
Survival (ILsurv) Built-in survival learner IDs: surv.coxph, surv.glmnet, surv.ranger, surv.ranger.extratrees, surv.ranger.maxstat, surv.ranger.C, surv.rfsrc, surv.coxboost, surv.gbm, surv.xgboost.cox, surv.xgboost.aft, surv.mboost, surv.bart.

Supported Fusion Outputs

Path Single-layer Early fusion Late fusion
Continuous/Binary Yes run_concat = TRUE run_stacked = TRUE with meta_learner
Multiclass Yes run_concat = TRUE run_stacked = TRUE with native multiclass meta_learner
Survival Yes (train_out$single) do_early_fusion = TRUE Weighted layer blending with both IBS and COX outputs returned

Output Reference: What You Get and How to Access It

This section summarizes the outputs produced by each integration method and where to find weights/importance values.

Conbin Outputs (Binary/Continuous)

Method What it returns Where to access
Single-layer (per omics layer) Layer-specific predictions and metrics fit$yhat.train[, layer_name], fit$yhat.test[, layer_name] (if validation), fit$AUC.train / fit$AUC.test, fit$accuracy.train / fit$accuracy.test, fit$balanced_accuracy.train / fit$balanced_accuracy.test (binomial), fit$R2.train / fit$R2.test (gaussian)
Early fusion (concatenated) One model on all features concatenated Enable with run_concat = TRUE; outputs in fit$yhat.train[, "concatenated"], fit$model_fits$model_concat, fit$SL_fits$SL_fit_concat
Late fusion (stacked) Meta-model over layer-level predictions Enable with run_stacked = TRUE; outputs in fit$yhat.train[, "stacked"], fit$model_fits$model_stacked, fit$SL_fits$SL_fit_stacked
Layer weights (stacked) Relative contribution of each layer in late fusion fit$weights (available when meta_learner = "sl_nnls_auc" and run_stacked = TRUE)
Binary metric table Per-model AUC, accuracy, and balanced accuracy fit$metrics.train and fit$metrics.test (if validation provided)

Multiclass Outputs

Method What it returns Where to access
Single-layer (per omics layer) Layer-wise multiclass probability and class predictions fit$prob.train[[layer_name]], fit$class.train[, layer_name], plus validation analogs fit$prob.test[[layer_name]], fit$class.test[, layer_name]
Early fusion (concatenated) One multiclass model on concatenated features Enable with run_concat = TRUE; outputs in fit$prob.train$concatenated, fit$class.train[, "concatenated"], fit$model_fits$model_concat
Late fusion (stacked) Multiclass meta-model over OOF layer probabilities Enable with run_stacked = TRUE; outputs in fit$prob.train$stacked, fit$class.train[, "stacked"], fit$model_fits$model_stacked
Multiclass performance metrics Accuracy, balanced accuracy, one-vs-rest AUC, and log-loss fit$metrics.train and fit$metrics.test (if validation provided)
Feature-selection metadata Filtering/screening settings used in fit fit$filter_method, fit$filter_pct, fit$prevalence_pct, fit$screening_used, fit$screen_method, fit$screen_pct
Screened feature sets Features retained by fold-safe screening fit$selected_features_by_layer, fit$selected_features_concat

Survival Outputs (Single/Early/Late)

Method Training outputs Validation outputs
Single-layer fit$train_out$single$metrics, fit$train_out$single$train_risk fit$valid_out$single$valid_cindex, fit$valid_out$single$valid_auc, fit$valid_out$single$valid_risk
Early fusion fit$train_out$early$train_cindex, fit$train_out$early$train_auc, fit$train_out$early$train_risk fit$valid_out$early$valid_cindex, fit$valid_out$early$valid_auc, fit$valid_out$early$valid_risk
Late fusion fit$train_out$late$IBS and fit$train_out$late$COX, each containing weights, C-index, time-dependent AUC, and risks fit$valid_out$late$IBS and fit$valid_out$late$COX, with the analogous validation metrics
Survival plotting payload fit$surv_plot_data$train fit$surv_plot_data$valid

Importance Outputs (Conbin, Multiclass, and Survival)

Importance type Where to access Notes
Conbin signed global feature importance fit$feature_importance_signed Always returned for non-survival fits; named numeric vector sorted by effect magnitude/sign.
Conbin signed per-layer importance fit$feature_importance_signed_by_layer List split by featureType.
Multiclass signed global feature importance fit$feature_importance_global Global score aggregated across multiclass contrasts.
Multiclass signed importance by class fit$feature_importance_signed_by_class List with one signed vector per class.
Multiclass signed importance by layer and class fit$feature_importance_signed_by_layer_by_class Nested list by layer then class.
Survival early-fusion combined importance fit$train_out$early$combined_importance Available when do_early_fusion = TRUE.
Survival late-fusion combined importance fit$train_out$late$IBS$combined_importance or fit$train_out$late$COX$combined_importance Weighted signed importance; names are prefixed like layer::feature.
BART-specific layer importance (optional) bartMachine::investigate_var_importance(fit$model_fits$model_layers[[layer]], plot = FALSE) Only for BART-based conbin fits (base_learner = "sl_bart").

Quick Access Snippets

# ---- Conbin: weights + top features ----
fit$weights
head(fit$feature_importance_signed, 20)
names(fit$feature_importance_signed_by_layer)
head(fit$feature_importance_signed_by_layer[[1]], 20)

# ---- Multiclass: metrics + class probabilities + importance ----
fit_mc$metrics.train
fit_mc$metrics.test
head(fit_mc$class.train)
head(fit_mc$class.test)
head(fit_mc$prob.train$stacked)
head(fit_mc$feature_importance_global, 20)
head(fit_mc$feature_importance_signed_by_class[[1]], 20)

# ---- Survival: late-fusion weights + top combined features ----
fit_surv$train_out$late$IBS$weights
fit_surv$train_out$late$COX$weights
head(fit_surv$train_out$late$IBS$combined_importance, 20)
head(fit_surv$train_out$late$COX$combined_importance, 20)

# ---- Survival: inspect all fusion branches ----
fit_surv$train_out$single
fit_surv$train_out$early
fit_surv$train_out$late

Example 1: Binary Outcome (IBD Classification)

This section uses the packaged PRISM and NLIBD MultiAssayExperiment fixtures for classifying IBD status.

Step 1: Load and Inspect Training and Validation Data

data("PRISM_MAE", package = "IntegratedLearner")
data("NLIBD_MAE", package = "IntegratedLearner")
mae_train <- PRISM_MAE
mae_valid <- NLIBD_MAE

head(MultiAssayExperiment::colData(mae_train))
#> DataFrame with 6 rows and 4 columns
#>          Diagnosis dysbiosis_score         Y   subjectID
#>        <character>       <numeric> <numeric> <character>
#> G35127          CD        0.934121         1      G35127
#> G35128          CD        0.596260         1      G35128
#> G35152          CD        0.950573         1      G35152
#> G36347          CD        0.996696         1      G36347
#> G36348          CD        0.847540         1      G36348
#> G36349          CD        0.956937         1      G36349
names(MultiAssayExperiment::experiments(mae_train))
#> [1] "species"     "metabolites"
table(MultiAssayExperiment::colData(mae_train)$Y)
#> 
#>   0   1 
#>  34 121

Step 2: Inspect Layer Assays

vapply(
  MultiAssayExperiment::experiments(mae_train),
  function(se) nrow(SummarizedExperiment::assay(se, "abundance")),
  integer(1)
)
#>     species metabolites 
#>         340        1500

Step 3: Fit the Model

IntegratedLearner fits one model per layer (base_learner) and then combines layer-level predictions with a meta-learner (meta_learner).

fit <- IntegratedLearner(
  MAE_train = mae_train,
  MAE_valid = mae_valid,
  folds = 2,
  base_learner = "SL.randomForest",
  meta_learner = "sl_nnls_auc",
  filter_method = "prevalence",
  filter_pct = 40,
  run_screening = TRUE,
  screen_pct = 30,
  verbose = TRUE,
  family = binomial()
)
#> IntegratedLearner: using all experiments in mae_train: species, metabolites
#> IntegratedLearner: default assay.type per experiment: species -> abundance, metabolites -> abundance
#> Feature filter (prevalence ranking, top 40.00% per layer): kept 736/1840 features. Layer breakdown: species=136/340, metabolites=600/1500.
#> Running base model for layer 1...
#> Number of covariates in screen.il.glmnet is: 180
#> CV SL.randomForest_screen.il.glmnet
#> Number of covariates in screen.il.glmnet is: 180
#> CV SL.randomForest_screen.il.glmnet
#> Non-Negative least squares convergence: TRUE
#> full SL.randomForest_screen.il.glmnet
#> Running base model for layer 2...
#> Number of covariates in screen.il.glmnet is: 41
#> CV SL.randomForest_screen.il.glmnet
#> Number of covariates in screen.il.glmnet is: 41
#> CV SL.randomForest_screen.il.glmnet
#> Non-Negative least squares convergence: TRUE
#> full SL.randomForest_screen.il.glmnet
#> Running stacked model...
#> Number of covariates in All is: 2
#> CV sl_nnls_auc_All
#> Number of covariates in All is: 2
#> CV sl_nnls_auc_All
#> Non-Negative least squares convergence: TRUE
#> full sl_nnls_auc_All
#> Running concatenated model...
#> Number of covariates in screen.il.glmnet is: 221
#> CV SL.randomForest_screen.il.glmnet
#> Number of covariates in screen.il.glmnet is: 221
#> CV SL.randomForest_screen.il.glmnet
#> Non-Negative least squares convergence: TRUE
#> full SL.randomForest_screen.il.glmnet
#> Time for model fit : 0.063 minutes 
#> ========================================
#> Model fit for individual layers: SL.randomForest 
#> Model fit for stacked layer: sl_nnls_auc 
#> Model fit for concatenated layer: SL.randomForest 
#> ========================================
#> AUC metric for training data: 
#> Individual layers: 
#> metabolites     species 
#>       0.853       0.961 
#> ======================
#> Stacked model:0.96 
#> ======================
#> Concatenated model:0.968 
#> ======================
#> ========================================
#> AUC metric for test data: 
#> Individual layers: 
#> metabolites     species 
#>       0.714       0.557 
#> ======================
#> Stacked model:0.585 
#> ======================
#> Concatenated model:0.698 
#> ======================
#> ========================================
#> Weights for individual layers predictions in IntegratedLearner: 
#> metabolites     species 
#>        0.13        0.87 
#> ========================================

Step 4: Inspect and Interpret Outputs

Core outputs for binary tasks include:

  • fit$AUC.train and fit$AUC.test: AUC per layer and fusion model.
  • fit$accuracy.train and fit$accuracy.test: thresholded accuracy per layer and fusion model.
  • fit$balanced_accuracy.train and fit$balanced_accuracy.test: balanced accuracy per layer and fusion model.
  • fit$metrics.train and fit$metrics.test: compact metric tables with AUC, accuracy, and balanced accuracy.
  • fit$weights: layer contributions in the stacked model (when sl_nnls_auc is used).
  • fit$yhat.train and fit$yhat.test: predicted probabilities.
fit$AUC.train
#>  metabolites      species      stacked concatenated 
#>        0.853        0.961        0.960        0.968
fit$AUC.test
#>  metabolites      species      stacked concatenated 
#>        0.714        0.557        0.585        0.698
fit$accuracy.train
#>  metabolites      species      stacked concatenated 
#>    0.8387097    0.9096774    0.9161290    0.9096774
fit$balanced_accuracy.train
#>  metabolites      species      stacked concatenated 
#>    0.6429266    0.8575596    0.8511181    0.8575596
fit$metrics.test
#>          model   auc  accuracy balanced_accuracy
#> 1  metabolites 0.714 0.6461538         0.4883721
#> 2      species 0.557 0.6769231         0.5449260
#> 3      stacked 0.585 0.6769231         0.5338266
#> 4 concatenated 0.698 0.6615385         0.5000000
fit$weights
#> metabolites     species 
#>   0.1303845   0.8696155

Plot ROC summaries for train and validation sets:

plot.obj <- IntegratedLearner:::plot.learner(fit)
plot.obj$plot

In this PRISM setting, you can compare which single layer is strongest and whether stacked fusion outperforms both individual layers and simple concatenation.

Example 2: Continuous Outcome (Gestational Age)

This section uses the pregnancy dataset (Ghaemi et al., 2019), converted into MultiAssayExperiment format. Here Y is continuous gestational age.

Step 1: Load and Inspect Data

data("pregnancy_MAE", package = "IntegratedLearner")
mae_train <- pregnancy_MAE

head(MultiAssayExperiment::colData(mae_train))
#> DataFrame with 6 rows and 2 columns
#>                   Y   subjectID
#>           <numeric> <character>
#> PTLG002_1        11     PTLG002
#> PTLG003_1        11     PTLG003
#> PTLG004_1        11     PTLG004
#> PTLG005_1        11     PTLG005
#> PTLG007_1        11     PTLG007
#> PTLG008_1        11     PTLG008
names(MultiAssayExperiment::experiments(mae_train))
#> [1] "CellfreeRNA"     "ImmuneSystem"    "Metabolomics"    "Microbiome"     
#> [5] "PlasmaLuminex"   "PlasmaSomalogic" "SerumLuminex"
length(unique(MultiAssayExperiment::colData(mae_train)$subjectID))
#> [1] 17

Step 2: Fit Continuous Model

For this example, we use BART base learners (sl_bart).

If you hit:

java.lang.UnsupportedClassVersionError ... class file version 65.0 ... recognizes up to 61.0

your Java runtime is older than the version used by your installed bartMachine build (typically Java 17 runtime vs Java 21 bytecode). In that case, either:

  • upgrade Java runtime to 21 and restart R, or
  • use a non-Java learner (example fallback shown below).
options(java.parameters = c("-Xmx6G", "--add-modules=jdk.incubator.vector"))

fit <- IntegratedLearner(
  MAE_train = mae_train,
  folds = 2,
  base_learner = "sl_bart",
  meta_learner = "sl_nnls_auc",
  filter_method = "variance",
  filter_pct = 40,
  run_screening = TRUE,
  screen_pct = 30,
  family = gaussian()
)
#> Time for model fit : 0.494 minutes 
#> ========================================
#> Model fit for individual layers: sl_bart 
#> Model fit for stacked layer: sl_nnls_auc 
#> Model fit for concatenated layer: sl_bart 
#> ========================================
#> R^2 for training data: 
#> Individual layers: 
#>     CellfreeRNA    ImmuneSystem    Metabolomics      Microbiome   PlasmaLuminex 
#>      0.11267605      0.06491549      0.48657670      0.47925176      0.10553609 
#> PlasmaSomalogic    SerumLuminex 
#>      0.73224465      0.00178293 
#> ======================
#> Stacked model:0.7309165 
#> ======================
#> Concatenated model:0.1453968 
#> ======================
#> ========================================
#> Weights for individual layers predictions in IntegratedLearner: 
#>     CellfreeRNA    ImmuneSystem    Metabolomics      Microbiome   PlasmaLuminex 
#>           0.000           0.000           0.000           0.011           0.000 
#> PlasmaSomalogic    SerumLuminex 
#>           0.989           0.000 
#> ========================================

Fallback (non-Java) run:

fit <- IntegratedLearner(
  MAE_train = mae_train,
  folds = 2,
  base_learner = "SL.randomForest",
  meta_learner = "sl_nnls_auc",
  filter_method = "variance",
  filter_pct = 40,
  run_screening = TRUE,
  screen_pct = 30,
  family = gaussian()
)

Step 3: Evaluate Predictive Accuracy

For continuous outcomes, IntegratedLearner reports R2.train (and R2.test if validation is provided).

fit$R2.train
#>     CellfreeRNA    ImmuneSystem    Metabolomics      Microbiome   PlasmaLuminex 
#>      0.11267605      0.06491549      0.48657670      0.47925176      0.10553609 
#> PlasmaSomalogic    SerumLuminex         stacked    concatenated 
#>      0.73224465      0.00178293      0.73091646      0.14539679
plot.obj <- IntegratedLearner:::plot.learner(fit)
plot.obj$plot

Step 4: Uncertainty and Feature-Level Interpretation (BART)

When using sl_bart, you can inspect posterior predictive distributions and derive weighted posterior summaries.

weights <- fit$weights

dataX <- fit$X_train_layers
dataY <- fit$Y_train

post.samples <- vector("list", length(weights))
names(post.samples) <- names(dataX)

for (i in seq_along(post.samples)) {
  post.samples[[i]] <- bartMachine::bart_machine_get_posterior(
    fit$model_fits$model_layers[[i]],
    dataX[[i]]
  )$y_hat_posterior_samples
}
#> Warning in pre_process_new_data(clean_data, bart_machine): The following features were found in records for prediction which were not found in the original training data:
#>     MOB3A, OSBPL8, ATP5I, SSH2, GRB2, AP1S2, HADHA, PARP14, FAM129A, NCK2, HLA.DRA, ARPC5, PRKACB, SIAH2, DAP, STRADB, RPL7AP6, CDC37, SEC14L1, EIF3K, PTEN, DOCK11, CDC42SE1, SYK, TIMP1, IGF2BP3, PSAP, LUC7L3, PARP1, HNRNPR, ABTB1, RNA5SP370, NFATC2, MBP, CBX3, KIF1C, HNRNPH3, LARP1, RNA5SP74, BAZ1A, POLDIP2, LIMD2, SHOC2, AURKAIP1, PRPF6, HLA.DPB1, WAS, QARS, JUND, ANP32E, HINT1, GSN, CLTC, KLF2, RAB10, TBCA, CEBPD, PHF3, CHCHD2, NFKB2, H3F3A, BAZ2A, IQGAP2, HOOK3, CTSB, LCN2, RNA5SP368, RBBP4, ITSN2, EIF3F, ZNF385A, UIMC1, LBH, TAX1BP1, DTX3L, NUP155, APC, DENND4A, RASA3, KLF6, AP3S1, SNHG5, ARL6IP5, N4BP2L2, ANXA11, RP11.475C16.1, UBQLN1, NCOA3, HIST1H2BD, NLRC5, NIN, UQCRC1, MYD88, COL1A2, HERC1, MCUR1, RPS27L, SASH3, NDST1, HBD, ZNF106, ZNF154, LPCAT3, CLCN3, ZNF747, ARID2, CTRC, LIG1, CCDC181, ADRA2B, RP11.319G6.1, SUMO2, RP11.89H19.1, ATP6V1F, DUX4L26, EME1, SP110, ABCA3, ATXN3, ABI1, LURAP1L, CTA.212A2.3, SYNPO2, PRPF40A, XPO1, CNTROB, PCM1, RP11.255B23.1, UQCC2, EEF1A1P6, FBRS, NEMF, GATAD2A, ZCCHC9, CALD1, AIM2, STK24, ATP5G2, RUNX1T1, RPL23AP74, TOMM7, PECAM1, NDUFS3, EIF4H, ELK4, TMCC1, ZNF271P, UBAP2L, APOL6, RPL39P3, ILF3, POLR3G, BTG1, EHD1, FAM107A, RPL10P3, GABARAP, CUL4A, CST3, UBXN6, SSH1, NOP56, MAP3K1, QKI, RNU1.13P, X5.Sep, TSEN15, ARHGAP25, TPT1P4, SCARNA13, TBL1XR1, STAT3, HECTD4, DDX11L10, TREML1, WHSC1L1, MAP3K5, IMPDH2, GUCY1B3, TRIM22, MORF4L1, RYBP, RNU1.89P, UBE2L6, PRRC2B, BAG1, AC074289.1, X2.Sep, HMGA1, AFF1, GLS, FRMD4B, SPX, ILK, CSNK1G1, MTCO3P12, FBXO9, ACRBP, CAPN15, CTNNBL1, RNA5SP325, DYSF, RAB2B, PPP1CA, TPI1, C11orf58, APLF, ERG, EIF5, SUPT16H, MAP4, DYNC1H1, ACVR2A, RN7SL493P, MAF1, PTK2B, AP2B1, CHD6, GMFG, SRSF6, CSNK1A1, GNA13, RALY, PIM1, SUSD1, RNU5B.1, SMC1A, COMMD6, BTK, ASH1L, ABCC3, JAK2, CANX, RPL23AP7, ISCA1, ANXA5, SIN3A, TMEM40, UHMK1, NET1, VAPB, RAC1, MLH3, XRCC6, PLEKHA2, AP2A1, EPS15, RPS11P5, BAZ1B, HDAC5, SLC44A2, RPL10AP6, SNORD89, EPSTI1, DCUN1D1, PDS5A, MLX, CAPN1, USP9X, USP34, DNM2, YPEL3, GNAQ, HIST1H4C, TCF25, TMOD3, KIAA0930, CALCOCO2, EFCAB13, PTPN11, SUPT6H, MAP7D1, CD300E, DBNL, ARHGAP10, NUDT3, WDFY4, PRELID1, THOC2, BASP1, EIF4EBP2, GRINA, SQSTM1, SRSF11, PARK7, NCOA2, HCK, MTND1P23, CENPF, RBMX, USP7, COX6B1, GRK6, MPEG1, OGFR, ZFP36L2, VTI1B, PPP4C, COL6A3, ASH2L, FGR, ASCC2, SDCBP, ATP2A3, ADRBK2, HLA.DPA1, CAT, PPIG, SYNE1, BECN1, RREB1, ABCC4, UBALD2, ARL8B, FAM101B, HIGD1A, SEC31A, MINK1, SLC25A3, RAB37, TBCEL, MIER1, JAK3, PDCD10, FURIN, RBM3, SSFA2, MKNK2, FAM104A, PLCB2, TNFAIP2, GCA, ETFA, APBB1IP, MTND5P11, STK40, DNAJB6, ZFR, KHDRBS1, SRCAP, SNRNP200, C19orf53, DPYSL2, RNF111, AGO2, UACA, RANBP9, CNTRL, JMJD1C, GPBP1L1, ARHGAP26, FLII, CLIC1, SMG1, STAT6, UBTF, DOCK10, H2AFY, PNN, SP1, C12orf75, EEF1B2P3, DAAM1, MCTP1, BNIP2, DNTTIP2, PRPF8, FCER1G, SUPT5H, HLA.C, NRDC, H1F0, SNRPC, ATP5D, MPZ, CSNK1G3, LYST, COX6C, H1FX, RMND5A, CASP1, UBLCP1, TAB2, PLCG1, GRK5, GIT2, CREB3, SNORA14B, POLR1D, SYF2, CHMP2A, PSME2, LDHA, RABEP1, GLRX5, RN7SL381P, RIC8A, SMOX, RUNX1, WDR60, STAU1, PITPNM1, DBI, ZNF438, TUBB4B, ZNF699, GIMAP6, CALR, ZDHHC14, COX14, PHRF1, NFIL3, ZFP36, SYNCRIP, SERP1, RNF144A.AS1, PSD4, DENND3, DNAJC2, NUP214, HEMK1, S100A12, ARID4B, PABPC4, CAB39, AP003068.23, G3BP2, EIF4G1, ARHGAP17, ABI3, NBPF15, METAP2, PRKDC, SH3TC1, KDM7A, PTBP3, CCT3, NAA60, PKN1, BIRC6, PPP1R15A, SLA, ITGB2, RAP1A, ELOVL7, SENP6, BLOC1S6, ATXN2, VCAN, RAB11FIP1, NCF1, ARPP19, IDH2, CTNNA1, RASGRP2, GP9, PLXDC2, ANXA3, C9orf16, SAFB2, ACAP2, PIK3C3, CELF2, RPL36A, ZBTB20, OAS1, MAP2K2, FAM120A, HGS, HCFC1, EIF4E2, ATP5A1, MFN2, TBC1D1, AGO1, CCDC88C, GNB2, PSIP1, VAMP3, UBE2B, GMPR, LRRFIP2, CCNY, RPL7AP30, FOXP1, ZCCHC6, G6PD, SLK, FAM192A, GOLGB1, PPP1R12C, ZER1, ABLIM1, HSPA4, FBL, BCL6, RSF1, KCTD12, NFAT5, RBM8A, DDX46, FKBP5, PIK3CD, DGKD, SMAD2, ATG3, CTSG, EIF4E, EHD3, PA2G4, HIST1H1B, ZFAS1, EXOC6B, ROCK2, TLE3, SNHG9, SBNO1, RAB8B, CTDSP2, YLPM1, LGALS1, CLIC4, WAPL, MGAT4B, RP11.832N8.1, PPP2CA, CST7, CCNDBP1, TAF3, HECA, MGEA5, MTCO2P12, KCTD20, ARID1B, C7orf73, RPL23AP2, CCT2, SRSF4, DCK, ZNF609, MRPL48, PTK2, MYO18A, FCHSD2, RTCA, EPB41L2, CIC, TANK, LEF1, USP25, TMEM140, C1orf162, ANKRD44, RN7SL7P, DRAP1, KDM5A, IRF8, WDR44, NOLC1, VPS37B, MTCO1P40, HIST1H2AG, RN7SL630P, RPS19P1, UBR4, AZIN1, RPS15AP1, HNRNPA1P48, PRDM2, SLC2A4RG, PHB2, PIK3R1, CIZ1, RTF1, CTB.63M22.1, TRRAP, RNU6ATAC2P, ITFG2, GOLGA4, MTRNR2L9, UBASH3B, DYRK1A, PHF11, NDUFB9, PHF14, ATP5B, MKL1, TMOD1, STARD7, ARHGEF2, RERE, HIST1H2AL, LGALSL, CLINT1, EIF3I, NFIX, PDAP1, VPS13C, CASC4, CARD11, SNIP1, RCAN3, PGK1, NFE2, ACLY, SORL1, CPEB4, NECAP2, MKI67, ZNF91, USP15, LDHB, BICD2, SC22CB.1E7.1, UBE2J1, XRN2, FAM32A, PRCC, TRAM1, RAB4A, G3BP1, TNRC6B, KIAA0513, NFATC3, BBX, GOLIM4, BIRC3, CSNK1G2, TCF3, MITD1, ARF6, CAMP, PLA2G12A, EIF3M, TCERG1, GPATCH4, RANBP1, VDAC3, VAMP8, SAFB, NPM1P27, RP11.244J10.1, UBE2Q1, PTPRC, WIPI1, PSME4, LDLRAP1, GYPB, NDUFA6, RGS2, EIF2AK2, TRIM44, RBL2, VCP, FAM63A, CHMP7, DOCK5, GPSM3, KDM3B, BLVRB, SLC25A5, PLCG2, DNMT3A, SIPA1, OIP5.AS1, ALOX12, STX7, EML4, EXOC3, IGF2BP2, PHKB, U2AF2, FTH1P8, CIRBP, POLR3GL, BCLAF1, XRN1, SPN, SMARCA4, ZMYND8, MTRNR2L4, CARD8, GIT1, GOLGA3, CDKN2D, SRRT, HSPB1, MPP7, PITPNM2, AFF4, TMSB4XP1, SATB1, CCND2, SSB, HELZ, RASSF5, PNISR, TUFM, CAPN2, TGOLN2, IL32, GSTP1, NCF1B, UXT, EFR3A, CPNE2, CD22, DICER1, CYBA, PUM2, NEK1, IL6ST, ASPH, ARHGAP4, UGGT1, MYO1G, HNRNPDL, NUDT4, HIVEP2, FBXO41, TNS3, PANK3, GSTK1, CYTIP, POLR2J, NUTF2, FLNB, SHKBP1, SEPP1, SH3BP2, GBP1, DCTN1, CTA.414D7.1, TSR2, KARS, TACC1, FGFR1OP2, FAM228B, STAT5B, HIBADH, VAV1, UBR2, RP11.20O24.4, CSTA, CASC5, SCUBE1, MAPRE1, PYGL, SETD3, USP47, WDFY1, SNHG6, PSG1, ZMIZ1, COPA, SERPINE1, COMMD4, MDN1, TAF10, PPP4R3B, CHM, COPE, CDK2AP1, TFPI, GMIP, ENDOD1, TJP2, SREK1, MADD, USP22, YY1, CD247, SH2B3, SNHG25, RPL7P9, BROX, SOD1, IKZF3, VPS13A, FGL2, KRT1, NDUFS5, MTSS1, BRD2, RNF115, PSMD8, RNF20, TESPA1, SUZ12, RNU6.14P, HIST1H4E, ATXN2L, RAB1B, XPO7, X11.Sep, SBF2, CBL, EEF1A1P13, CTD.3035D6.1, CBX1, MGLL, EIF4ENIF1, CRBN, RPARP.AS1, PSMD4, SCARNA5, DHX9, HBS1L, PABPN1, RP11.408H1.3, RRP7BP, NPEPL1, SRP68, CTA.243E7.1, UFD1L, FUS, X7.Mar, CYTH4, WDR70, PRKACA, MAST3, STXBP2, RPL13AP7, SAP18, NRBF2, ASAP2, PPP2R1A, CTNND1, C10orf10, CCND1, TNRC6C, HIST1H3G, TTLL5, JARID2, NAPA, JAML, RPRD2, ONECUT3, ANKRD36BP2, PRKCD, PPP4R3A, FUBP1, ZNF652, RELT, FAM126A, PACSIN2, UBE3B, PRRC2A, SENP2, AGTPBP1, SRSF5, C14orf166, SVIP, TROVE2, IGBP1, CNPY3, UNC13D, CDKN1A, PPP6R3, PELP1, PAX8.AS1, RHOG, HSP90B1, KIAA1644, RN7SL280P, SAMD9, TMEM161A, STAB1, EIF2S2, PASK, FCF1, PLCL2, PSENEN, OTUD5, STK38, HLA.DRB1, PEG3, MEIS1, CHST6, RAB29, RP11.36C20.1, RIMS3, GLIPR1, GIMAP1, GUCD1, TAF7, RP11.84C10.4, RRNAD1, DNAJB9, GATB, OSBPL3, NRG1, BRSK2, LRRC7, RHBDL2, AC226118.1, PKHD1, AF013593.1, SMARCE1P1, RSPH4A, OSM, WDR82, SCRT2, RBMX2, CNPY2, ATP6V1E2, KIFC2, CACNG8, BMP2K, BAHCC1, TGFBR1, BTN2A3P, A2M, KLHL36, RNF40, NLK, CNNM2, METTL22, SIDT1, CDC14B, MFSD1, PKNOX1, UEVLD, TIGAR, KHSRP, POLA1, SART1, DNAJC3, CLTA, FMR1, ACTR3B, RP11.632K20.7, ZNF292, RBM6, ARRDC4, HELB, RAP2B, PEA15, LSM14A, APEX1, PHF20L1, MMP8, CCT6A, POLR2L, RAN, PARP4, HNRNPAB, AC090498.1, TSPAN33, IPO5, FNDC3B, PCF11, USP10, STRN3, FXR1, UBE2D2, HIST1H4D, ASXL2, RALB, CARD16, PADI4, ARHGAP9, ORAI2, TBC1D5, FTH1P20, FOXO4, SMC3, OGFRL1, YWHAG, ATP6V1G1, LPP, SSR3, MED13, UBA1, UBXN2A, RP3.417G15.1, TCEA1, GAB2, TRA2B, RPL24P4, PDGFA, PARD3, MAGI2.AS3, CHD8, TADA3, SLA2, CDC27, RPL5P34, IGKC, MDH2, MAP3K2, TCEB1, THEMIS2, ZCCHC7, CCDC175, MGA, RP11.69L16.5, AC098614.2, HIF1A, SNX1, MRPS34, ZCCHC11, COMMD7, DYNLL2, KIAA0430, RIN3, HIST1H4L, RNY4P25, PRR12, OSTF1, SCYL2, ZC3H11A, SUMO3, LRMP, WBP11, ARCN1, AKIRIN2, BIRC2, PHACTR2, NEDD9, HIST1H3C, KXD1, RANBP2, UBE2K, HAX1, MBOAT2, PHACTR4, PSTPIP2, TNFAIP8, UBR5, ATPIF1, ARHGEF6, HTT, CLEC1B, TRAP1, C1orf198, ELK3, PARVG, AC079250.1, R3HDM1, MGRN1, MPRIP, HMG20B, VPS41, UBA2, ZFAND6, RPGR, CRKL, VRK1, TMEM50A, PSMA7, RC3H2, RIT1, PARP8, USP33, USF3, CDYL, U2SURP, FCGR3A, ITCH, BCL2A1, YWHAQ, GON4L, DDX27, SVIL, DNAJC8, BST2, MTMR12, ZN
#> Warning in pre_process_new_data(clean_data, bart_machine): The following features were found in records for prediction which were not found in the original training data:
#>     Gr_MAPKAPK2_LPS100, CD4.Tcells_mem_STAT3_Unstim, mDCs_STAT3_IFNa100, Tbet.CD8.Tcells_naive_STAT3_Unstim, Tbet.CD4.Tcells_mem_STAT3_IL100, pDCs_STAT3_IFNa100, Tbet.CD4.Tcells_mem_STAT3_IFNa100, mDCs_ERK_LPS100, CD4.Tcells_STAT3_Unstim, Tbet.CD8.Tcells_mem_STAT3_Unstim, cMCs_STAT3_IFNa100, mDCs_STAT3_Unstim, CD4.Tcells_naive_STAT3_IL100, M.MDSC_STAT3_IFNa100, CD4.Tcells_mem_STAT3_IL100, CD4.Tcells_STAT3_IL100, pDCs_STAT3_Unstim, CD7.NKcells_STAT3_Unstim, CD8.Tcells_mem_STAT3_Unstim, CD16.CD56.NKcells_STAT3_Unstim, intMCs_MAPKAPK2_Unstim, TCRgd.Tcells_STAT3_Unstim, CD8.Tcells_STAT3_Unstim, CD4.Tcells_mem_STAT3_IFNa100, Tbet.CD4.Tcells_naive_STAT5_IFNa100, M.MDSC_STAT3_Unstim, CD8.Tcells_naive_STAT3_Unstim, cMCs_STAT3_Unstim, intMCs_STAT3_Unstim, CD4.Tcells_naive_STAT3_Unstim, ncMCs_ERK_Unstim, M.MDSC_p38_LPS100, Bcells_STAT3_Unstim, mDCs_STAT1_IL100, CD4.Tcells_STAT3_IFNa100, CD8.Tcells_naive_STAT3_IFNa100, Tregs_STAT3_IL100, ncMCs_STAT3_Unstim, cMCs_STAT1_IL100, mDCs_p38_LPS100, CD45RA.Tregs_STAT3_IL100, CD45RA.Tregs_STAT3_Unstim.1, intMCs_p38_Unstim, Tregs_STAT3_Unstim, Tbet.CD8.Tcells_naive_STAT1_IFNa100, TCRgd.Tcells_STAT3_IFNa100, Tbet.CD8.Tcells_naive_STAT3_IFNa100, Bcells_CREB_Unstim, CD8.Tcells_STAT3_IL100, CD45RA.Tregs_STAT3_IL100.1, ncMCs_STAT3_IL100, M.MDSC_STAT1_IL100, cMCs_p38_LPS100, CD4.Tcells_naive_STAT3_IFNa100, CD8.Tcells_STAT1_IFNa100, CD8.Tcells_STAT3_IFNa100, intMCs_STAT1_IL100, M.MDSC_p38_Unstim, Tbet.CD8.Tcells_mem_STAT3_IFNa100, CD8.Tcells_mem_STAT3_IFNa100, M.MDSC_ERK_IL100, Tbet.CD4.Tcells_naive_STAT5_IL100, ncMCs_CREB_LPS100, CD8.Tcells_naive_STAT1_IL100, Tbet.CD4.Tcells_mem_STAT1_IFNa100, cMCs_ERK_IL100, CD45RA.Tregs_STAT3_IFNa100.1, intMCs_CREB_LPS100, ncMCs_ERK_IL100, TCRgd.Tcells_STAT1_IFNa100, Tbet.CD4.Tcells_naive_STAT5_Unstim, Tregs_STAT3_IFNa100, intMCs_NFkB_LPS100, cMCs_p38_Unstim
#>   These features will be ignored during prediction.
#> Warning in pre_process_new_data(clean_data, bart_machine): The following features were found in records for prediction which were not found in the original training data:
#>     Benzenearsonic.acid, PC.16.0.22.6.4Z.7Z.10Z.13Z.16Z.19Z...PC.16.1.9Z..22.5.4Z.7Z.10Z.13Z.16Z...PC.16.1.9Z..22.5.7Z.10Z.13Z.16Z.19Z...PC.18.1.11Z..20.5.5Z.8Z.11Z.14Z.17Z...PC.18.1.9Z..20.5.5Z.8Z.11Z.14Z.17Z...PC.18.2.9Z.12Z..20.4.5Z.8Z.11Z.14Z...PC.18.2.9Z.12Z..20.4.8Z.11Z.14Z.17Z...PC.18.3.6Z.9Z.12Z..20.3.5Z.8Z.11Z...PC.18.3.6Z.9Z.12Z..20.3.8Z.11Z.14Z...PC.18.3.9Z.12Z.15Z..20.3.5Z.8Z.11Z...PC.18.3.9Z.12Z.15Z..20.3.8Z.11Z.14Z...PC.18.4.6Z.9Z.12Z.15Z..20.2.11Z.14Z...PC.20.2.11Z.14Z..18.4.6Z.9Z.12Z.15Z...PC.20.3.5Z.8Z.11Z..18.3.6Z.9Z.12Z...PC.20.3.5Z.8Z.11Z..18.3.9Z.12Z.15Z...PC.20.3.8Z.11Z.14Z..18.3.6Z.9Z.12Z...PC.20.3.8Z.11Z.14Z..18.3.9Z.12Z.15Z...PC.20.4.5Z.8Z.11Z.14Z..18.2.9Z.12Z...PC.20.4.8Z.11Z.14Z.17Z..18.2.9Z.12Z...PC.20.5.5Z.8Z.11Z.14Z.17Z..18.1.11Z...PC.20.5.5Z.8Z.11Z.14Z.17Z..18.1.9Z...PC.22.5.4Z.7Z.10Z.13Z.16Z..16.1.9Z...PC.22.5.7Z.10Z.13Z.16Z.19Z..16.1.9Z...PC.22.6.4Z.7Z.10Z.13Z.16Z.19Z..16.0., Proline.betaine.L.2.Amino.3.methylenehexanoic.acid.3beta.6beta.Dihydroxynortropane.3beta.6beta.Dihydroxynortropane, Oleic.acid.Elaidic.acid.Petroselinic.acid.Vaccenic.acid..Z..13.Octadecenoic.acid.Ethyl.9.hexadecenoate.7.Octadecenoic.acid.10.Octadecenoic.acid.6.Octadecenoic.acid.Petroselaidic.acid.Oleic.Acid..11E..OCTADEC.11.ENOIC.ACID.3, LysoPC.16.0..3, Linoleic.acid.Bovinic.acid.9E.11E.Octadecadienoic.acid.10E.12Z.Octadecadienoic.acid.Linoelaidic.acid.Mangiferic.acid.Linalyl.caprylate.Ethyl.2E.4Z.hexadecadienoate.5.Octadecynoic.acid.Malvalic.acid..10E.12Z..octadeca.10.12.dienoic.acid.11, Hypoxanthine.Allopurinol.1.Pentanesulfenothioic.acid.Ethyl.propyl.disulfide.Ethyl.isopropyl.disulfide.Allopurinol.3h.Pyrazolo.4.3.D.Pyrimidin.7.Ol, PC.18.1.9Z..18.1.9Z....PC.14.0.22.2.13Z.16Z...PC.14.1.9Z..22.1.13Z...PC.16.0.20.2.11Z.14Z...PC.16.1.9Z..20.1.11Z...PC.18.0.18.2.9Z.12Z...PC.18.1.11Z..18.1.11Z...PC.18.1.11Z..18.1.9Z...PC.18.1.9Z..18.1.11Z...PC.18.2.9Z.12Z..18.0..PC.20.1.11Z..16.1.9Z...PC.20.2.11Z.14Z..16.0..PC.22.1.13Z..14.1.9Z...PC.22.2.13Z.16Z..14.0., Allantoin.Allantoin.6, Sodium.uranate, PE.14.0.22.5.4Z.7Z.10Z.13Z.16Z...PE.14.0.22.5.7Z.10Z.13Z.16Z.19Z...PE.14.1.9Z..22.4.7Z.10Z.13Z.16Z...PE.16.0.20.5.5Z.8Z.11Z.14Z.17Z...PE.16.1.9Z..20.4.5Z.8Z.11Z.14Z...PE.16.1.9Z..20.4.8Z.11Z.14Z.17Z...PE.18.1.11Z..18.4.6Z.9Z.12Z.15Z...PE.18.1.9Z..18.4.6Z.9Z.12Z.15Z...PE.18.2.9Z.12Z..18.3.6Z.9Z.12Z...PE.18.2.9Z.12Z..18.3.9Z.12Z.15Z...PE.18.3.6Z.9Z.12Z..18.2.9Z.12Z...PE.18.3.9Z.12Z.15Z..18.2.9Z.12Z...PE.18.4.6Z.9Z.12Z.15Z..18.1.11Z...PE.18.4.6Z.9Z.12Z.15Z..18.1.9Z...PE.20.4.5Z.8Z.11Z.14Z..16.1.9Z...PE.20.4.8Z.11Z.14Z.17Z..16.1.9Z...PE.20.5.5Z.8Z.11Z.14Z.17Z..16.0..PE.22.4.7Z.10Z.13Z.16Z..14.1.9Z...PE.22.5.4Z.7Z.10Z.13Z.16Z..14.0..PE.22.5.7Z.10Z.13Z.16Z.19Z..14.0., Reserpine.Reserpine.1, Sodium.ferulate.L.Xylulose.5.Phosphate.Open.Form.of.2..Deoxy.Ribofuranose.5..Phosphate, Edetic.Acid.Edetic.Acid.1, PC.14.0.20.2.11Z.14Z...PC.14.1.9Z..20.1.11Z...PC.16.0.18.2.9Z.12Z...PC.16.1.9Z..18.1.11Z...PC.16.1.9Z..18.1.9Z...PC.18.1.11Z..16.1.9Z...PC.18.1.9Z..16.1.9Z...PC.18.2.9Z.12Z..16.0..PC.20.1.11Z..14.1.9Z...PC.20.2.11Z.14Z..14.0..PE.15.0.22.2.13Z.16Z...PE.22.2.13Z.16Z..15.0..PE.NMe.18.1.9Z..18.1.9Z...Palmitoyl.Linoleoyl.Phosphatidylcholine.1, Inosine.2..3..cyclic.phosphate..Malathion.Blighinone.2.3.Di.O.methylellagic.acid.2.8.Di.O.methylellagic.acid.Malathion.Malathion.1, Hydroxyzileuton.Zileuton.sulfoxide, PE.16.0.22.6.4Z.7Z.10Z.13Z.16Z.19Z...PE.16.1.9Z..22.5.4Z.7Z.10Z.13Z.16Z...PE.16.1.9Z..22.5.7Z.10Z.13Z.16Z.19Z...PE.18.1.11Z..20.5.5Z.8Z.11Z.14Z.17Z...PE.18.1.9Z..20.5.5Z.8Z.11Z.14Z.17Z...PE.18.2.9Z.12Z..20.4.5Z.8Z.11Z.14Z...PE.18.2.9Z.12Z..20.4.8Z.11Z.14Z.17Z...PE.18.3.6Z.9Z.12Z..20.3.5Z.8Z.11Z...PE.18.3.6Z.9Z.12Z..20.3.8Z.11Z.14Z...PE.18.3.9Z.12Z.15Z..20.3.5Z.8Z.11Z...PE.18.3.9Z.12Z.15Z..20.3.8Z.11Z.14Z...PE.18.4.6Z.9Z.12Z.15Z..20.2.11Z.14Z...PE.20.2.11Z.14Z..18.4.6Z.9Z.12Z.15Z...PE.20.3.5Z.8Z.11Z..18.3.6Z.9Z.12Z...PE.20.3.5Z.8Z.11Z..18.3.9Z.12Z.15Z...PE.20.3.8Z.11Z.14Z..18.3.6Z.9Z.12Z...PE.20.3.8Z.11Z.14Z..18.3.9Z.12Z.15Z...PE.20.4.5Z.8Z.11Z.14Z..18.2.9Z.12Z...PE.20.4.8Z.11Z.14Z.17Z..18.2.9Z.12Z...PE.20.5.5Z.8Z.11Z.14Z.17Z..18.1.11Z...PE.20.5.5Z.8Z.11Z.14Z.17Z..18.1.9Z...PE.22.5.4Z.7Z.10Z.13Z.16Z..16.1.9Z...PE.22.5.7Z.10Z.13Z.16Z.19Z..16.1.9Z...PE.22.6.4Z.7Z.10Z.13Z.16Z.19Z..16.0..1, Risedronate.Risedronate, Betaine.L.Valine.Vaporole.N.Methyl.a.aminoisobutyric.acid.5.Aminopentanoic.acid.Norvaline.Amyl.Nitrite.Norvaline.....Valine.L.Valine.Amyl.Nitrite.N.N.Dimethyl.L.Alanine.2.Amino.Pentanoic.Acid.D.Isovaline.Norvaline, Inosine.2..3..cyclic.phosphate..Malathion.Blighinone.2.3.Di.O.methylellagic.acid.2.8.Di.O.methylellagic.acid.Malathion.Malathion, Tauroursodeoxycholic.acid.Taurodeoxycholic.acid.Taurochenodesoxycholic.acid.Tauroursodeoxycholic.acid.2, LysoPC.18.1.9Z...LysoPC.18.1.11Z...2, Valdecoxib.Valdecoxib, Tiapride, Loratadine.Loratadine.1, Valdecoxib.Valdecoxib.2, Loratadine.Loratadine, Dehydroepiandrosterone.sulfate.Testosterone.sulfate.Epitestosterone.sulfate.dehydroepiandrosterone.sulfate.2, Malaoxon.Rofecoxib, LysoPC.16.0., LysoPC.18.0..LysoPC.0.0.18.0..Platelet.Activating.Factor.2, X2.Methyl.3.ketovaleric.acid.3.Methyl.2.oxovaleric.acid.Ketoleucine.2.Ketohexanoic.acid.Mevalonolactone.3.Oxohexanoic.acid.Adipate.semialdehyde.5.Ethoxy.4.5.dihydro.2.3H.furanone.Ethyl.acetoacetate.Sherry.lactone..4S.6S..3.4.5.6.Tetrahydro.4.hydroxy.6.methyl.2H.pyran.2.one.Acetoin.acetate.Methyl.levulinate.Pantolactone.Ethyl.3.oxobutanoate.2.Oxo.4.Methylpentanoic.Acid.3.Methyl.2.oxovaleric.acid, Citric.acid.Isocitric.acid.D.threo.Isocitric.acid.Diketogulonic.acid.2.3.Diketo.L.gulonate..1R.2R..Isocitric.acid.D.Glucaro.1.4.lactone.Isocitric.Acid.4.Deoxyglucarate.Citric.Acid.1, Edetic.Acid.Edetic.Acid.2, Indoxyl.sulfate.3.SULFOOXY.1H.INDOLE, Rofecoxib, Edetic.Acid.Edetic.Acid.8, Pantetheine.4..phosphate.4..Phosphopantetheine.4, Hypoxanthine.Allopurinol.1.Pentanesulfenothioic.acid.Ethyl.propyl.disulfide.Ethyl.isopropyl.disulfide.Allopurinol.3h.Pyrazolo.4.3.D.Pyrimidin.7.Ol.1, Edetic.Acid.Edetic.Acid.7, X....Epigallocatechin.3.p.coumaroate.3, X.5r.6s.7s.8s..5.Hydroxymethyl.6.7.8.Trihydroxy.Tetrazolo.1.5.a.Piperidine.Nojirimycine.Tetrazole.2, PC.18.1.9Z..18.1.9Z....PC.14.0.22.2.13Z.16Z...PC.14.1.9Z..22.1.13Z...PC.16.0.20.2.11Z.14Z...PC.16.1.9Z..20.1.11Z...PC.18.0.18.2.9Z.12Z...PC.18.1.11Z..18.1.11Z...PC.18.1.11Z..18.1.9Z...PC.18.1.9Z..18.1.11Z...PC.18.2.9Z.12Z..18.0..PC.20.1.11Z..16.1.9Z...PC.20.2.11Z.14Z..16.0..PC.22.1.13Z..14.1.9Z...PC.22.2.13Z.16Z..14.0..1, PC.15.0.18.2.9Z.12Z...PC.18.2.9Z.12Z..15.0..PE.14.0.22.2.13Z.16Z...PE.14.1.9Z..22.1.13Z...PE.16.0.20.2.11Z.14Z...PE.16.1.9Z..20.1.11Z...PE.18.0.18.2.9Z.12Z...PE.18.1.11Z..18.1.11Z...PE.18.1.11Z..18.1.9Z...PE.18.1.9Z..18.1.11Z...PE.18.1.9Z..18.1.9Z...PE.18.2.9Z.12Z..18.0..PE.20.1.11Z..16.1.9Z...PE.20.2.11Z.14Z..16.0..PE.22.1.13Z..14.1.9Z...PE.22.2.13Z.16Z..14.0..3, X2.Methylbutyrylglycine.Isovalerylglycine.Valerylglycine.N.Acetylvaline.3.Dehydrocarnitine.5.Acetamidovalerate.4.Hydroxystachydrine.Turicine.Betonicine.Calystegine.A6.Calystegine.A7.Calystegin.A3.Medicanine.Methyl.5..hydroxymethyl.pyrrolidine.3.carboxylate.1.Amino.2.3.Dihydroxy.5.Hydroxymethyl.Cyclohex.5.Ene.1, PE.20.4.5Z.8Z.11Z.14Z..P.18.1.11Z...PE.20.4.5Z.8Z.11Z.14Z..P.18.1.9Z...PE.20.4.8Z.11Z.14Z.17Z..P.18.1.11Z...PE.20.4.8Z.11Z.14Z.17Z..P.18.1.9Z...PE.20.5.5Z.8Z.11Z.14Z.17Z..P.18.0..PE.22.5.4Z.7Z.10Z.13Z.16Z..P.16.0..PE.22.5.7Z.10Z.13Z.16Z.19Z..P.16.0..PE.P.16.0.22.5.4Z.7Z.10Z.13Z.16Z...PE.P.16.0.22.5.7Z.10Z.13Z.16Z.19Z...PE.P.18.0.20.5.5Z.8Z.11Z.14Z.17Z...PE.P.18.1.11Z..20.4.5Z.8Z.11Z.14Z...PE.P.18.1.11Z..20.4.8Z.11Z.14Z.17Z...PE.P.18.1.9Z..20.4.5Z.8Z.11Z.14Z...PE.P.18.1.9Z..20.4.8Z.11Z.14Z.17Z.., PC.15.0.20.4.5Z.8Z.11Z.14Z...PC.15.0.20.4.8Z.11Z.14Z.17Z...PC.20.4.5Z.8Z.11Z.14Z..15.0..PC.20.4.8Z.11Z.14Z.17Z..15.0..PE.16.0.22.4.7Z.10Z.13Z.16Z...PE.16.1.9Z..20.3.8Z.11Z.14Z...PE.18.0.20.4.5Z.8Z.11Z.14Z...PE.18.0.20.4.8Z.11Z.14Z.17Z...PE.18.1.11Z..20.3.5Z.8Z.11Z...PE.18.1.11Z..20.3.8Z.11Z.14Z...PE.18.1.9Z..20.3.5Z.8Z.11Z...PE.18.1.9Z..20.3.8Z.11Z.14Z...PE.18.2.9Z.12Z..20.2.11Z.14Z...PE.18.3.6Z.9Z.12Z..20.1.11Z...PE.18.3.9Z.12Z.15Z..20.1.11Z...PE.
#> Warning in pre_process_new_data(clean_data, bart_machine): The following features were found in records for prediction which were not found in the original training data:
#>     Stool_Prevotella_7.3, VaginalSwab_Prevotella_7.2, Stool_Ezakiella, Stool_Prevotella_7.2, Stool_Prevotella_7.1, VaginalSwab_Haemophilus, Saliva_Prevotella_7, ToothGum_Prevotella_7, Saliva_Alloprevotella.2, ToothGum_Alloprevotella.2, VaginalSwab_Alloprevotella.2, Saliva_Fusobacterium, ToothGum_Fusobacterium, Stool_Streptococcus.2, Stool_Alloprevotella.2, Saliva_Haemophilus.1, ToothGum_Haemophilus.1, VaginalSwab_Fusobacterium, Saliva_Campylobacter, ToothGum_Campylobacter, VaginalSwab_Campylobacter, Saliva_Prevotella_7.1, ToothGum_Prevotella_7.1, VaginalSwab_Prevotella_7.1, VaginalSwab_Prevotella_7, VaginalSwab_Prevotella_6, Stool_Streptococcus.3, Stool_Veillonella.1, Stool_Fusobacterium, ToothGum_Prevotella_6, Saliva_Prevotella_6, Stool_Leptotrichia, Saliva_Streptococcus.3, ToothGum_Streptococcus.3, VaginalSwab_Streptococcus.3, Stool_Prevotella_6, Saliva_Leptotrichia, ToothGum_Leptotrichia, Saliva_Prevotella.11, ToothGum_Prevotella.11, Stool_Leptotrichia.4, VaginalSwab_Prevotella.11, Stool_Campylobacter, VaginalSwab_Leptotrichia, ToothGum_Bacteroides.7, ToothGum_Prevotella.5, Saliva_Bacteroides.7, VaginalSwab_Bacteroides.7, Saliva_Lactobacillus.11, Saliva_Prevotella.5, Stool_Lactobacillus.11, VaginalSwab_Prevotella.5, VaginalSwab_Lactobacillus.11, ToothGum_Finegoldia, ToothGum_Lactobacillus.11, Saliva_Streptococcus.2, ToothGum_Streptococcus.2, Saliva_Finegoldia, VaginalSwab_Bacteroides.1, VaginalSwab_Haemophilus.1, VaginalSwab_Streptococcus.2, Stool_Bacteroides.7, Stool_Ureaplasma, ToothGum_Prevotella.2, Saliva_Prevotella.2, Stool_Gemella, Stool_NA.4, Saliva_Bacteroides.1, ToothGum_Bacteroides.1, Stool_Granulicatella, Stool_Fusobacterium.1, Saliva_Ureaplasma
#>   These features will be ignored during prediction.
#> Warning in pre_process_new_data(clean_data, bart_machine): The following features were found in records for prediction which were not found in the original training data:
#>     plasma.LEPTIN, plasma.BDNF, plasma.ICAM1, plasma.RESISTIN, plasma.VCAM1, plasma.RANTES, plasma.PAI1, plasma.IL27, plasma.IL23
#>   These features will be ignored during prediction.
#> Warning in pre_process_new_data(clean_data, bart_machine): The following features were found in records for prediction which were not found in the original training data:
#>     ANXA1.1, EPHA1.1, SOD2.1, CXCL13.1, KNG1.1, GRB2.1, SORCS2.1, APOL1.1, HSPD1.1, FN1.1, NAAA.1, LEP.1, MBL2.1, SELE.1, RTN4.1, CST2, FSTL1.1, TNC.1, HAMP.1, PPIF.1, CDH1.1, SPP1.1, IGF2R.1, SERPINF1.1, CLEC4M.1, CCL11, THBS2.1, SRC.1, F5.1, GAPDH.1, PLG.1, LMAN2.1, TPM4.1, APCS.1, FAM3D.1, FGF19.1, C1QA.C1QB..C1QC, PGF.1, C3.5, TGFBI.1, KPNB1.1, CFB.1, GPI.1, AFM.1, APOE.1, PI3.1, CFI.1, C3.4, INHBA.1, FABP3.1, ALDOA.1, EIF4H.1, PDGFRB.1, TNFRSF25.1, AURKA.1, NRCAM.1, SERPINA4.1, CA1.1, SPARC.1, CHI3L1.1, FETUB.1, CCL5.1, CMPK1.1, BST1.1, SH2D1A.1, NPPB.2, KLKB1.1, CASP3.1, LCN2.1, DDR2.1, IL22.1, TGFBR2.1, EGFR.1, FGF2.1, C3.6, OCIAD1.1, CCL19.1, A2M.1, TNFRSF11A.1, SFTPD.1, ENO2.1, TFPI.1, IL2RA.1, ENPP7.1, OLR1.1, SIRPA.1, IL1R1.1, APOM.1, PRSS22.1, MPO.1, GPD1.1, DCTPP1.1, IGFBP1.1, EPHB2.1, EFNB2.1, CST5.1, SNAP25.1, HIST1H3A.1, TEC.1, KIT.1, MRC1.1, PRKCG.1, PPBP.2, PRKCA.1, SELP.1, CTSA.1, PDGFB.1, SPARCL1.1, ECM1.1, IL1R2.1, CTSD.1, ADSL.1, OMD.1, FLRT2.1, FTCD.1, LYPD3.1, TKT.1, NME2.1, IL2, HSP90AB1.1, CD36.1, MMP12.1, ECE1.1, ASAH2.1, PRKACA.1, IL36A.1, NTRK3.1, CD274.1, IDS.1, SERPINA10.1, CCL15, CDH3.1, PPA1.1, DKK1.1, CCL21.1, ASGR1.1, PKM2, AK1.1, NOTCH1.1, MDK.1, CD55.1, VTA1.1, INSR.1, IL6R.1, LAG3.1, LY9.1, APOB.1, CXCL16.1, CRK.1, AGT.1, PPY, CNDP1.1, CDH2.1, GOT1.1, SLPI.1, FSTL3.1, DIABLO.1, MMP13.1, ALCAM.1, IL18R1.1, CHL1.1, WISP1.1, RARRES2.1, LGALS3.1, PRTN3.1, CCL18, LRIG3.1, PLG.2, KLK8.1, RGMA.1, IL22RA2.1, CD109.1, RAC1.1, APP.1, N6AMT1.1, CDH5.1, MYBPC1.1, PIK3CG.1, NCAM1.1, BMP6.1, MET.1, PPP3R1.1
#>   These features will be ignored during prediction.
#> Warning in pre_process_new_data(clean_data, bart_machine): The following features were found in records for prediction which were not found in the original training data:
#>     serum.BDNF, serum.RESISTIN, serum.RANTES, serum.IL7, serum.CD40L, serum.ENA78, serum.MIP1B, serum.IL1A, serum.VEGF
#>   These features will be ignored during prediction.

weighted.post.samples <- Reduce("+", Map("*", post.samples, weights))
rownames(weighted.post.samples) <- rownames(dataX[[1]])
names(dataY) <- rownames(dataX[[1]])

Visualize 68% and 95% credible intervals for observations:

ord_names <- names(sort(rowMeans(weighted.post.samples), decreasing = TRUE))

mcmc_intervals(t(weighted.post.samples), prob = 0.68, prob_outer = 0.95) +
  scale_y_discrete(limits = ord_names) +
  geom_point(aes(x = dataY[ord_names], y = ord_names), shape = 1, size = 3, color = "black") +
  coord_flip() +
  theme_bw() +
  labs(
    x = "Gestational age (in months)",
    y = "Observations"
  ) +
  theme(axis.text.x = element_text(angle = 90, hjust = 1))
#> Scale for y is already present.
#> Adding another scale for y, which will replace the existing scale.

Layer weights and feature-level inclusion proportions can also be examined for biological interpretation.

omicsEye_theme <- function() {
  angle <- 45
  hjust <- 1
  ggplot2::theme_bw() +
    ggplot2::theme(
      axis.text.x = ggplot2::element_text(size = 8, vjust = 1, hjust = hjust, angle = angle),
      axis.text.y = ggplot2::element_text(size = 8, hjust = 1),
      axis.title = ggplot2::element_text(size = 10),
      plot.title = ggplot2::element_text(size = 10),
      plot.subtitle = ggplot2::element_text(size = 8),
      legend.title = ggplot2::element_text(size = 6, face = "bold"),
      legend.text = ggplot2::element_text(size = 7),
      axis.line = ggplot2::element_line(colour = "black", linewidth = 0.25),
      axis.line.x = ggplot2::element_line(colour = "black", linewidth = 0.25),
      axis.line.y = ggplot2::element_line(colour = "black", linewidth = 0.25),
      panel.border = ggplot2::element_blank(),
      panel.grid.major = ggplot2::element_blank(),
      panel.grid.minor = ggplot2::element_blank()
    )
}

safe_var_importance <- function(model, layer_label) {
  tryCatch({
    qq <- bartMachine::investigate_var_importance(model, plot = FALSE)
    df <- cbind.data.frame(qq$avg_var_props, qq$sd_var_props)
    colnames(df) <- c("mean", "sd")
    df$type <- layer_label
    df
  }, error = function(e) {
    warning(sprintf("Skipping variable importance for %s: %s", layer_label, conditionMessage(e)))
    data.frame(mean = numeric(), sd = numeric(), type = character())
  })
}

vimp_stack <- cbind.data.frame(fit$weights)
colnames(vimp_stack) <- "mean"
vimp_stack$sd <- NA
vimp_stack$type <- "stack"

layer_names <- names(fit$model_fits$model_layers)
vimp_layers <- lapply(layer_names, function(layer_nm) {
  safe_var_importance(fit$model_fits$model_layers[[layer_nm]], layer_nm)
})
#> .....
#> .....
#> .....
#> .....
#> .....
#> .....
#> .....

vimp_layers <- vimp_layers[lengths(vimp_layers) > 0]
vimp_top <- do.call(
  rbind,
  lapply(vimp_layers, function(df) head(df[order(-df$mean), , drop = FALSE], 20))
)

VIMP <- as.data.frame(rbind.data.frame(vimp_stack, vimp_top))
VIMP <- tibble::rownames_to_column(VIMP, "ID")

p4 <- VIMP %>%
  dplyr::filter(type == "stack") %>%
  dplyr::arrange(desc(mean)) %>%
  ggplot(aes(y = mean, x = reorder(ID, -mean))) +
  geom_bar(stat = "identity", fill = "darkseagreen") +
  theme_bw() +
  omicsEye_theme() +
  ylab("Layer Weights") +
  xlab("")

p5 <- VIMP %>%
  dplyr::filter(type != "stack") %>%
  dplyr::arrange(mean) %>%
  dplyr::mutate(ID = gsub("_", " ", ID, fixed = TRUE)) %>%
  ggplot(aes(reorder(ID, -mean), mean, fill = type)) +
  facet_wrap(. ~ type, scales = "free") +
  geom_bar(stat = "identity", fill = "lightsalmon") +
  geom_errorbar(aes(ymin = ifelse(mean - sd > 0, mean - sd, 0), ymax = mean + sd),
                width = 0.2,
                position = position_dodge(0.9)) +
  theme_bw() +
  coord_flip() +
  omicsEye_theme() +
  theme(strip.background = element_blank()) +
  ylab("Inclusion proportion") +
  xlab("")
plot_grid(
  p4,
  ncol = 1,
  labels = c("Estimated IntegratedLearner Layer Weights"),
  label_size = 8,
  vjust = 0.1
) + theme(plot.margin = unit(c(0.5, 0.5, 0.5, 0.5), "cm"))

plot_grid(
  p5,
  ncol = 1,
  labels = c("Top Features by Layer (BART Inclusion Proportions)"),
  label_size = 8,
  vjust = 0.1
) + theme(plot.margin = unit(c(0.5, 0.5, 0.5, 0.5), "cm"))

Example 3: Multiclass Outcome (Franzosa MAE with External Validation)

This section shows a full multiclass MAE workflow using packaged local fixtures. Here we keep the original outcome column name (diseaseCat) and subject ID column (sample_id) and pass them through outcome_col and subject_id_col.

data("Franzosa_MAE_train", package = "IntegratedLearner")
data("Franzosa_MAE_valid", package = "IntegratedLearner")

MAE_train <- Franzosa_MAE_train
MAE_valid <- Franzosa_MAE_valid

fit <- IntegratedLearner::IntegratedLearner(
  MAE_train = MAE_train,
  MAE_valid = MAE_valid,
  experiment = c("metabolome", "species"),
  assay.type = c("abundance", "abundance"),
  outcome_col = "diseaseCat",
  subject_id_col = "sample_id",
  family = stats::binomial(),
  base_learner = "glmnet",
  meta_learner = "glmnet",
  run_stacked = TRUE,
  run_concat = TRUE,
  filter_method = "variance",
  filter_pct = 50,
  run_screening = TRUE,
  screen_pct = 25,
  folds = 2,
  verbose = TRUE
)
#> Feature filter (caret variance ranking, top 50.00% per layer): kept 461/922 features. Layer breakdown: metabolome=173/346, species=288/576.
#> Running multiclass base model for layer 1...
#> Warning: from glmnet C++ code (error code -81); Convergence for 81th lambda
#> value not reached after maxit=100000 iterations; solutions for larger lambdas
#> returned
#> Warning: from glmnet C++ code (error code -87); Convergence for 87th lambda
#> value not reached after maxit=100000 iterations; solutions for larger lambdas
#> returned
#> Warning: from glmnet C++ code (error code -76); Convergence for 76th lambda
#> value not reached after maxit=100000 iterations; solutions for larger lambdas
#> returned
#> Warning: from glmnet C++ code (error code -91); Convergence for 91th lambda
#> value not reached after maxit=100000 iterations; solutions for larger lambdas
#> returned
#> Warning: from glmnet C++ code (error code -92); Convergence for 92th lambda
#> value not reached after maxit=100000 iterations; solutions for larger lambdas
#> returned
#> Running multiclass base model for layer 2...
#> Running multiclass stacked model...
#> Running multiclass concatenated model...
#> Time for model fit : 0.115 minutes 
#> ========================================
#> Multiclass model fit with 3 classes
#> Base learner: glmnet 
#> Stacked learner: glmnet 
#> Concatenated learner: glmnet 
#> ========================================
#> Multiclass metrics for training data:
#>          model  accuracy balanced_accuracy       auc   logloss
#> 1   metabolome 0.5419355         0.5550314 0.7172645 0.9844078
#> 2      species 0.4903226         0.4360895 0.6770613 1.2123063
#> 3      stacked 0.5161290         0.4984277 0.6617548 1.0605069
#> 4 concatenated 0.5419355         0.5235849 0.7040199 0.9929088
#> ========================================
#> Multiclass metrics for test data:
#>          model  accuracy balanced_accuracy       auc   logloss
#> 1   metabolome 0.6461538         0.6455204 0.8078598 0.8402359
#> 2      species 0.3846154         0.3923584 0.6646290 1.0300602
#> 3      stacked 0.6615385         0.6546113 0.7820692 1.1737686
#> 4 concatenated 0.5846154         0.5816864 0.7581535 0.9188124
#> ========================================

Useful multiclass outputs:

  • fit$metrics.train
  • fit$metrics.test
  • fit$class.train
  • fit$class.test
  • fit$prob.train
  • fit$prob.test
  • fit$feature_importance_signed_by_class
  • fit$filter_method, fit$filter_pct
  • fit$screening_used, fit$screen_pct

The multiclass metric tables now report accuracy, balanced accuracy, one-vs-rest AUC, and log-loss. The plotting helper also returns a single one-vs-rest ROC figure with all class curves overlaid for each fitted model.

plot.obj.mc <- IntegratedLearner:::plot.learner(fit)
plot.obj.mc$plot

Example 4: Survival Outcome (Time-to-event)

For survival tasks, IntegratedLearner dispatches to ILsurv when survival metadata are detected. The expected fields are:

  • time: follow-up time (non-negative).
  • event: event indicator (0/1).
  • optional Y: Surv(time, event) convenience column.

This path uses the package-native survival backend (no mlr3 dependency required).

For plotting, the survival backend now stores:

  • a time-dependent AUC table evaluated over a denser event-time grid (rather than only a few summary quantiles), and
  • Kaplan-Meier curve payloads built from predicted risk groups for the best fused survival model.

This section provides a complete MAE workflow.

data("TCGA_survival_MAE_train", package = "IntegratedLearner")
data("TCGA_survival_MAE_valid", package = "IntegratedLearner")

mae_train <- TCGA_survival_MAE_train
mae_valid <- TCGA_survival_MAE_valid

fit_surv_mae <- IntegratedLearner(
  MAE_train = mae_train,
  MAE_valid = mae_valid,
  experiment = c("gene", "mirna"),
  assay.type = c("abundance", "abundance"),
  outcome_col = "outcome_surv",
  subject_id_col = "patient_id",
  folds = 2,
  base_learner = "surv.coxph",
  filter_method = "variance",
  filter_pct = 40,
  run_screening = TRUE,
  screen_pct = 25,
  verbose = TRUE
)
#> Feature filter (caret variance ranking, top 40.00% per layer): kept 88/220 features. Layer breakdown: gene=48/120, mirna=40/100.
#> ILsurv starting
#>   base_learner: surv.coxph
#>   returning late fusion methods: IBS, COX
#>   folds: 2 | seed: 1234
#>   samples: 223 | features: 88
#>   layers: gene, mirna
#>   screening: cox (25.00%)
#> [gene] fitting OOF + full model (48 features)
#> [gene] done
#> [mirna] fitting OOF + full model (40 features)
#> [mirna] done
#> Computing single-layer training metrics
#>   [single:gene] cindex=0.5156
#>   [single:mirna] cindex=0.5117
#> Running early fusion
#> Warning in coxph.fit(X, Y, istrat, offset, init, control, weights = weights, :
#> Ran out of iterations and did not converge
#> Warning in coxph.fit(X, Y, istrat, offset, init, control, weights = weights, :
#> one or more coefficients may be infinite
#>   [early] cindex=0.5732
#> Preparing survival-matrix weighting inputs from layer risks
#> Learning late-fusion weights
#>   [late:IBS] weights: gene = 1.0000, mirna = 0.0000
#>   [late:IBS] cindex=0.5156
#>   [late:COX] weights: gene = 0.3299, mirna = 0.6701
#>   [late:COX] cindex=0.5035
#> Running validation
#>   [valid single:gene] cindex=0.7192
#>   [valid single:mirna] cindex=0.6485
#>   [valid late:IBS] cindex=0.7192
#>   [valid late:COX] cindex=0.7111
#>   [valid early] cindex=0.6364
#> ILsurv completed

Interpret Survival Outputs

# Single-layer training metrics
# fit_surv_mae$train_out$single$metrics

# Late fusion (two weighted integration summaries)
fit_surv_mae$train_out$late$IBS$weights
#>         gene        mirna 
#> 9.999989e-01 1.143658e-06
fit_surv_mae$train_out$late$IBS$train_cindex
#> [1] 0.5155855
fit_surv_mae$train_out$late$IBS$train_auc
#>            time       AUC
#> t=141.2   141.2 0.2788691
#> t=169.2   169.2 0.3499917
#> t=197     197.0 0.3886445
#> t=238.2   238.2 0.4369070
#> t=311.4   311.4 0.3910950
#> t=353.4   353.4 0.4447330
#> t=534.6   534.6 0.4410842
#> t=612     612.0 0.5544788
#> t=653.4   653.4 0.5608964
#> t=848.2   848.2 0.5915106
#> t=1052.8 1052.8 0.5869811
#> t=1289.6 1289.6 0.5209155
#> t=1430   1430.0 0.5500383
#> t=1452.8 1452.8 0.5152458
#> t=1527.2 1527.2 0.4821055
#> t=1607.6 1607.6 0.4867266
#> t=1678.8 1678.8 0.4986192
#> t=1699   1699.0 0.4845962
#> t=1805.8 1805.8 0.4438026
#> t=2034.6 2034.6 0.5104866
#> t=2115   2115.0 0.4996476
#> t=2179   2179.0 0.5349159
#> t=2207   2207.0 0.5252076
#> t=2628.6 2628.6 0.5623329
#> t=3222.6 3222.6 0.5547792
fit_surv_mae$train_out$late$COX$weights
#>      gene     mirna 
#> 0.3299115 0.6700885 
#> attr(,"method_details")
#> attr(,"method_details")$weight_method
#> [1] "COX"
#> 
#> attr(,"method_details")$time_grid
#>  [1]  159.6000  223.1310  304.0345  371.8276  393.4414  427.3517  461.2621
#>  [8]  517.7586  568.1655  611.4966  639.7586  690.3241  744.2414  807.5862
#> [15]  911.7724  996.2276 1061.0483 1140.5172 1208.3724 1327.5931 1478.2069
#> [22] 1602.0138 1683.6552 1850.4138 2039.5517 2195.8966 2395.3034 2723.6207
#> [29] 3067.4897 3250.6000
#> 
#> attr(,"method_details")$t_vec
#> [1]  223.1310  517.7586  911.7724 1683.6552 3067.4897
#> 
#> attr(,"method_details")$layer_score
#> [1] "sum"
#> 
#> attr(,"method_details")$scaling
#> attr(,"method_details")$scaling$M
#>                gene       mirna
#>   [1,] -0.061903150 -0.67711347
#>   [2,]  1.817927060  1.79215698
#>   [3,]  1.464365758  0.67435980
#>   [4,]  2.338852543  1.49106782
#>   [5,] -1.011058140 -1.71667484
#>   [6,] -0.016276534  0.27021412
#>   [7,] -0.691130856 -1.28699794
#>   [8,] -0.943135955 -0.94306926
#>   [9,]  1.471506946  0.88715162
#>  [10,] -1.559323792 -0.14385050
#>  [11,] -1.293672327  0.19815950
#>  [12,]  0.037993082  0.46238809
#>  [13,] -0.679767931  0.31106705
#>  [14,]  0.390147247 -0.59536489
#>  [15,]  1.206573893  0.67266422
#>  [16,] -1.122201041 -0.44489890
#>  [17,]  0.803589179  0.52890995
#>  [18,] -0.505092040  0.38006779
#>  [19,] -2.042254388 -0.87888937
#>  [20,]  2.405672330  0.77552750
#>  [21,]  0.336934126 -0.16715668
#>  [22,]  0.852256459 -0.98856259
#>  [23,]  0.289610002  1.26128961
#>  [24,] -0.368215682 -1.46755197
#>  [25,] -1.130301640 -0.29720910
#>  [26,] -0.936557144 -0.78923178
#>  [27,]  0.807078148 -1.13709919
#>  [28,]  0.459051734  1.52164521
#>  [29,]  1.062583684  1.52309794
#>  [30,] -0.670687028 -1.01528491
#>  [31,]  0.307169691 -0.59980737
#>  [32,] -0.768101386  1.37451409
#>  [33,]  1.236535230 -0.64507880
#>  [34,] -1.803860401  1.41048658
#>  [35,]  0.356839544  2.54849159
#>  [36,] -1.216894944 -0.08565249
#>  [37,]  1.181545655  0.19375221
#>  [38,]  0.564906227  1.47882103
#>  [39,]  2.049510782  0.37892986
#>  [40,]  2.405672330 -0.07710970
#>  [41,]  0.064536805 -0.11869875
#>  [42,] -0.133905826  0.95415594
#>  [43,]  0.374376666  0.98291367
#>  [44,] -0.081183693  0.20380360
#>  [45,] -0.799146157 -1.09423647
#>  [46,]  1.362369594 -0.30437221
#>  [47,] -0.004577517 -0.80635502
#>  [48,]  0.345180452 -2.16146595
#>  [49,]  0.548572912 -2.16146595
#>  [50,] -0.602444456 -0.96876616
#>  [51,] -0.945911621 -0.66486528
#>  [52,] -0.431949381 -0.08665403
#>  [53,]  0.370009461  0.20497040
#>  [54,]  0.928866723  1.87452930
#>  [55,] -2.474691655  0.39823693
#>  [56,] -0.337915981  0.54782023
#>  [57,] -0.281114257  0.78976951
#>  [58,]  0.873994947  0.08581114
#>  [59,] -2.029896290 -1.35831082
#>  [60,]  0.231537912 -0.07568244
#>  [61,] -0.293851906 -0.20057596
#>  [62,]  0.174912610 -0.15023112
#>  [63,]  0.563211075 -1.29274298
#>  [64,]  0.034777086 -0.95337957
#>  [65,]  0.938416571  1.02361940
#>  [66,]  0.848338622 -0.85962391
#>  [67,] -0.184236987 -2.11734085
#>  [68,] -0.513065219  2.54849159
#>  [69,] -1.184301742  0.20096053
#>  [70,]  0.663637717  0.88219268
#>  [71,]  0.323202930 -0.05497647
#>  [72,]  2.276160823 -0.18763794
#>  [73,] -0.892415713 -0.74367617
#>  [74,] -1.075498934 -2.05990240
#>  [75,] -0.263286461 -0.17435304
#>  [76,] -0.808222883 -0.43168089
#>  [77,]  0.820187458 -0.14057704
#>  [78,]  0.954586545 -0.90145411
#>  [79,]  1.003171913  0.79955597
#>  [80,]  0.324542186 -0.81918417
#>  [81,]  0.977915172  1.25519391
#>  [82,] -0.265014466 -0.95715191
#>  [83,]  0.846648241  1.63173306
#>  [84,] -0.730298412 -0.81060145
#>  [85,] -1.527766875 -0.22708177
#>  [86,] -0.472527602  0.55349830
#>  [87,]  1.674783531  0.73624556
#>  [88,]  0.701270854 -0.21437640
#>  [89,]  0.269357660  0.33220860
#>  [90,]  1.546084766  0.89509632
#>  [91,] -0.594946120 -0.26407967
#>  [92,]  1.310221432  1.67759400
#>  [93,]  0.253875613  0.42822800
#>  [94,]  0.022646629  0.61510849
#>  [95,] -0.678533093 -0.37030261
#>  [96,]  0.807170349  0.14388573
#>  [97,] -0.516756370  0.67940636
#>  [98,] -0.371691186  0.80715970
#>  [99,] -0.524860961  0.09988816
#> [100,] -0.754696923  0.01435240
#> [101,]  0.324248459  0.68681350
#> [102,] -1.016896242  0.50997886
#> [103,]  0.415352500  2.28286289
#> [104,]  0.301530693  1.11469031
#> [105,]  0.266898650  0.04636093
#> [106,]  0.150969487  0.88951664
#> [107,]  2.145998493  0.58185989
#> [108,]  0.877029686  0.57477762
#> [109,] -0.232177145  0.04568081
#> [110,] -0.373847775  0.84136746
#> [111,]  0.131689695 -0.99754042
#> [112,] -1.194284211  1.65359371
#> [113,]  0.917354834 -1.88276440
#> [114,]  1.032725050  0.56286491
#> [115,]  0.249291589 -0.12578429
#> [116,]  0.138355208  1.01111328
#> [117,] -0.034675046 -0.51085788
#> [118,] -0.382250726 -0.60708719
#> [119,] -0.222545820 -1.68159650
#> [120,]  0.964408175 -2.06828509
#> [121,]  0.403289685  0.89654141
#> [122,] -1.242203498  0.28314562
#> [123,]  0.331880052 -0.30214983
#> [124,]  1.160675024  1.82701883
#> [125,] -0.915937274 -0.33811665
#> [126,]  0.358454911  1.02902673
#> [127,] -0.229573184 -0.92913211
#> [128,] -0.936593155 -0.58786870
#> [129,] -0.814534320 -0.24968369
#> [130,]  1.332190612  1.63202877
#> [131,]  1.468705004  0.93411398
#> [132,] -0.281497537  1.20533867
#> [133,]  0.331495162  0.84257132
#> [134,] -0.085960733  0.22732169
#> [135,] -0.698231221  0.12401615
#> [136,] -0.425799598  0.01713611
#> [137,]  0.042100525  0.28039650
#> [138,] -0.192253413  1.82512684
#> [139,] -0.068975483  0.11599669
#> [140,] -1.173024809  0.68523580
#> [141,] -0.126634824 -1.69209943
#> [142,] -0.121908885 -0.76560902
#> [143,] -2.474691655 -1.15366252
#> [144,] -0.688958515 -0.47707902
#> [145,]  1.088529157 -0.87793418
#> [146,] -1.375036896 -1.10700405
#> [147,]  0.939826674 -0.43823283
#> [148,]  0.183592231 -0.93859815
#> [149,] -0.362102403 -0.13780573
#> [150,]  0.043010980  0.15373902
#> [151,]  0.475825224 -0.64128763
#> [152,]  0.976499144 -0.01970685
#> [153,] -0.269240778 -0.52072532
#> [154,] -1.721295167 -1.47027033
#> [155,]  0.570986803 -0.66370084
#> [156,]  0.310275491 -0.12851467
#> [157,] -0.857297669 -0.85906151
#> [158,] -2.323654031 -0.08704727
#> [159,]  0.160463152  0.69844157
#> [160,]  0.055667112 -1.31827010
#> [161,]  0.451231401 -0.54617382
#> [162,] -0.402858420 -2.16146595
#> [163,]  0.160682667 -0.04512278
#> [164,] -0.383500807  0.19992557
#> [165,] -1.497193523 -1.13840690
#> [166,] -0.136634293 -0.55604649
#> [167,] -0.193290398 -0.37175472
#> [168,]  0.971101468 -0.38310938
#> [169,] -1.286736111 -0.27638305
#> [170,]  1.599709594  0.34963378
#> [171,]  1.100731755 -0.50421847
#> [172,] -1.665960897  1.79617512
#> [173,]  0.138050189 -0.03312519
#> [174,] -0.564753840 -1.14882311
#> [175,] -2.150627329 -1.51593406
#> [176,]  2.405672330  2.26399259
#> [177,]  0.869763770  1.39532453
#> [178,]  1.230642001  0.01392923
#> [179,]  0.575679511 -1.94794684
#> [180,] -0.564117717  0.36134638
#> [181,] -1.220203387 -0.92765380
#> [182,] -1.549232857 -2.09952793
#> [183,]  0.250678014 -0.22986985
#> [184,] -1.703456834 -0.83478519
#> [185,] -0.297965506 -0.75641902
#> [186,]  0.139254808 -0.62330089
#> [187,]  1.559627650  1.28740832
#> [188,] -0.306178731  0.76211826
#> [189,]  1.867177661  2.54849159
#> [190,]  0.907232278 -1.06899834
#> [191,] -0.310332882  0.21397553
#> [192,]  1.590051786  1.23533143
#> [193,] -0.529183449  0.87666813
#> [194,]  1.065103803 -0.10753727
#> [195,]  0.244020172 -0.76279460
#> [196,]  1.120404993 -0.13003287
#> [197,] -0.492263383  0.26134412
#> [198,]  0.372637409  1.92479375
#> [199,] -0.449046558  1.13735695
#> [200,] -2.314147992  0.94142872
#> [201,] -1.660311183  0.20870505
#> [202,]  1.040995328  0.37977165
#> [203,] -0.413298356 -1.89256168
#> [204,] -0.990759358 -0.19299692
#> [205,]  1.063025389 -0.53263472
#> [206,] -0.304698790  1.76543175
#> [207,]  0.218184752  1.17791866
#> [208,]  1.208298415 -0.01402709
#> [209,] -0.566983608 -0.02631378
#> [210,] -1.304088144  0.30061036
#> [211,] -1.448870191 -0.43391776
#> [212,]  0.174450002 -0.60797081
#> [213,]  0.808243592 -0.52741979
#> [214,] -0.501833061 -0.59420657
#> [215,] -0.903764025 -1.19668436
#> [216,]  0.349568925  0.29958237
#> [217,] -0.185602397  0.60077560
#> [218,] -0.262920711  1.23194978
#> [219,] -2.474691655 -0.93042972
#> [220,] -0.418134212 -0.63702668
#> [221,] -0.370441734 -0.29511164
#> [222,] -0.939095836 -1.03206859
#> [223,]  0.287977220 -0.26517367
#> 
#> attr(,"method_details")$scaling$center
#>      gene     mirna 
#> 0.4563780 0.4574176 
#> 
#> attr(,"method_details")$scaling$scale
#>       gene      mirna 
#> 0.02964485 0.09377227 
#> 
#> 
#> attr(,"method_details")$weight_lambda
#> [1] 0.02
#> 
#> attr(,"method_details")$weight_penalty
#> [1] "l2_to_uniform"
#> 
#> attr(,"method_details")$weight_cap
#> [1] 1
fit_surv_mae$train_out$late$COX$train_cindex
#> [1] 0.5035102
fit_surv_mae$train_out$late$COX$train_auc
#>            time       AUC
#> t=141.2   141.2 0.3393038
#> t=169.2   169.2 0.4308691
#> t=197     197.0 0.3763094
#> t=238.2   238.2 0.4610534
#> t=311.4   311.4 0.4794404
#> t=353.4   353.4 0.5408010
#> t=534.6   534.6 0.4930835
#> t=612     612.0 0.5904624
#> t=653.4   653.4 0.5029730
#> t=848.2   848.2 0.4640157
#> t=1052.8 1052.8 0.4487822
#> t=1289.6 1289.6 0.4185638
#> t=1430   1430.0 0.4504876
#> t=1452.8 1452.8 0.4859213
#> t=1527.2 1527.2 0.4499681
#> t=1607.6 1607.6 0.4354954
#> t=1678.8 1678.8 0.4648625
#> t=1699   1699.0 0.4602310
#> t=1805.8 1805.8 0.4887562
#> t=2034.6 2034.6 0.5412678
#> t=2115   2115.0 0.5150369
#> t=2179   2179.0 0.5580437
#> t=2207   2207.0 0.5899874
#> t=2628.6 2628.6 0.6403522
#> t=3222.6 3222.6 0.7631859

# Early fusion summary
# fit_surv_mae$train_out$early
# Validation metrics
fit_surv_mae$valid_out$late$IBS$valid_cindex
#> [1] 0.7191919
fit_surv_mae$valid_out$late$IBS$valid_auc
#>        time       AUC
#> t=548   548 0.8985507
#> t=754   754 0.8600230
#> t=976   976 0.7864146
#> t=1174 1174 0.8390249
#> t=1411 1411 0.8524327
#> t=1556 1556 0.7860699
#> t=1642 1642 0.7769077
#> t=1673 1673 0.6425432
#> t=2009 2009 0.6161855
#> t=2207 2207 0.5954286
#> t=2636 2636 0.5799395
#> t=2763 2763 0.6660291
#> t=3472 3472 0.7002240
fit_surv_mae$valid_out$late$COX$valid_cindex
#> [1] 0.7111111
fit_surv_mae$valid_out$late$COX$valid_auc
#>        time       AUC
#> t=548   548 0.9420290
#> t=754   754 0.7309908
#> t=976   976 0.6777911
#> t=1174 1174 0.7719847
#> t=1411 1411 0.7973105
#> t=1556 1556 0.6588996
#> t=1642 1642 0.7026588
#> t=1673 1673 0.6051685
#> t=2009 2009 0.6331028
#> t=2207 2207 0.7407960
#> t=2636 2636 0.7909917
#> t=2763 2763 0.7581064
#> t=3472 3472 0.7847797
fit_surv_mae$valid_out$single$valid_cindex
#> $gene
#> [1] 0.7191919
#> 
#> $mirna
#> [1] 0.6484848

The train_auc and valid_auc objects for both IBS and COX are data frames with time and AUC columns, so they can be plotted as true time-dependent discrimination curves. In practice, these two late-fusion outputs provide complementary summaries over the same single-layer and early-fusion backbone, making side-by-side comparison possible within one fit object.

plot.obj.surv <- IntegratedLearner:::plot.learner(fit_surv_mae)
plot.obj.surv$plot

Session Information

sessionInfo()
#> R version 4.6.1 (2026-06-24)
#> Platform: x86_64-pc-linux-gnu
#> Running under: Ubuntu 26.04.1 LTS
#> 
#> Matrix products: default
#> BLAS:   /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 
#> LAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.32.so;  LAPACK version 3.12.0
#> 
#> locale:
#>  [1] LC_CTYPE=en_US.UTF-8          LC_NUMERIC=C                 
#>  [3] LC_TIME=en_US.UTF-8           LC_COLLATE=en_US.UTF-8       
#>  [5] LC_MONETARY=en_US.UTF-8       LC_MESSAGES=en_US.UTF-8      
#>  [7] LC_PAPER=en_US.UTF-8          LC_NAME=en_US.UTF-8          
#>  [9] LC_ADDRESS=en_US.UTF-8        LC_TELEPHONE=en_US.UTF-8     
#> [11] LC_MEASUREMENT=en_US.UTF-8    LC_IDENTIFICATION=en_US.UTF-8
#> 
#> time zone: Etc/UTC
#> tzcode source: system (glibc)
#> 
#> attached base packages:
#> [1] stats4    splines   stats     graphics  grDevices utils     datasets 
#> [8] methods   base     
#> 
#> other attached packages:
#>  [1] bartMachine_1.4.2           survival_3.8-12            
#>  [3] MultiAssayExperiment_1.39.1 SummarizedExperiment_1.43.0
#>  [5] Biobase_2.73.2              GenomicRanges_1.65.4       
#>  [7] Seqinfo_1.3.2               IRanges_2.47.5             
#>  [9] MatrixGenerics_1.25.0       matrixStats_1.5.0          
#> [11] S4Vectors_0.51.10           BiocGenerics_0.59.12       
#> [13] generics_0.1.4              bayesplot_1.16.0           
#> [15] cowplot_1.2.0               caret_7.0-1                
#> [17] lattice_0.23-1              SuperLearner_2.0-42        
#> [19] nnls_1.6                    gam_1.22-7                 
#> [21] foreach_1.5.2               ggplot2_4.0.3              
#> [23] dplyr_1.2.1                 IntegratedLearner_0.99.2   
#> [25] BiocStyle_2.41.0           
#> 
#> loaded via a namespace (and not attached):
#>   [1] RColorBrewer_1.1-3    sys_3.4.3             tensorA_0.36.2.1     
#>   [4] jsonlite_2.0.0        shape_1.4.6.1         magrittr_2.0.5       
#>   [7] farver_2.1.2          nloptr_2.2.1          rmarkdown_2.32       
#>  [10] vctrs_0.7.3           ROCR_1.0-12           htmltools_0.5.9      
#>  [13] S4Arrays_1.13.0       BiocBaseUtils_1.15.1  itertools_0.1-3      
#>  [16] missForest_1.6.1      distributional_0.9.0  SparseArray_1.13.2   
#>  [19] pROC_1.19.1           sass_0.4.10           parallelly_1.48.0    
#>  [22] bslib_0.12.0          plyr_1.8.9            lubridate_1.9.5      
#>  [25] cachem_1.1.0          buildtools_1.0.0      lifecycle_1.0.5      
#>  [28] iterators_1.0.14      pkgconfig_2.0.3       Matrix_1.7-6         
#>  [31] R6_2.6.1              fastmap_1.2.0         rbibutils_2.4.1      
#>  [34] future_1.75.0         digest_0.6.39         numDeriv_2016.8-1.1  
#>  [37] labeling_0.4.3        randomForest_4.7-1.2  timechange_0.4.0     
#>  [40] abind_1.4-8           compiler_4.6.1        rngtools_1.5.2       
#>  [43] withr_3.0.3           S7_0.2.2              backports_1.5.1      
#>  [46] MASS_7.3-66           lava_1.9.3            DelayedArray_0.39.6  
#>  [49] ModelMetrics_1.2.2.2  tools_4.6.1           ranger_0.18.0        
#>  [52] otel_0.2.0            future.apply_1.20.2   nnet_7.3-21          
#>  [55] glue_1.8.1            quadprog_1.5-8        nlme_3.1-171         
#>  [58] grid_4.6.1            checkmate_2.3.4       reshape2_1.4.5       
#>  [61] recipes_1.4.0         gtable_0.3.6          class_7.3-24         
#>  [64] tidyr_1.3.2           data.table_1.18.6.1   XVector_0.53.0       
#>  [67] pillar_1.11.1         stringr_1.6.0         posterior_1.7.0      
#>  [70] rJava_1.0-18          tidyselect_1.2.1      maketools_1.3.2      
#>  [73] knitr_1.52            bartMachineJARs_1.2.2 xfun_0.61            
#>  [76] hardhat_1.4.3         timeDate_4052.112     stringi_1.8.9        
#>  [79] yaml_2.3.12           pec_2025.06.24        evaluate_1.0.5       
#>  [82] codetools_0.2-20      tibble_3.3.1          BiocManager_1.30.27  
#>  [85] cli_3.6.6             rpart_4.1.27          Rdpack_2.6.6         
#>  [88] jquerylib_0.1.4       Rcpp_1.1.2            globals_0.19.1       
#>  [91] parallel_4.6.1        gower_1.0.2           timeROC_0.4.1        
#>  [94] doRNG_1.8.6.3         listenv_1.0.0         glmnet_5.0           
#>  [97] mvtnorm_1.4-2         timereg_2.0.7         ipred_0.9-16         
#> [100] scales_1.4.0          prodlim_2026.03.11    purrr_1.2.2          
#> [103] rlang_1.3.0

References

Franzosa EA et al. (2019). Gut microbiome structure and metabolic activity in inflammatory bowel disease. Nature Microbiology 4(2):293-305.

Ghaemi MS et al. (2019). Multiomics modeling of the immunome, transcriptome, microbiome, proteome and metabolome adaptations during human pregnancy. Bioinformatics 35(1):95-103.

Citation

Mallick et al. (2024). An integrated Bayesian framework for multi-omics prediction and classification. Statistics in Medicine 43(5):983-1002.