Skip to content

DIABLO: Supervised sPLS-DA

The other three methods here are unsupervised. They read the data and report the structure they find. DIABLO does the opposite. You hand it a label, IGHV status, and it selects a small panel of features from every layer that both separates the two classes and stays correlated across layers. It is the method for biomarker discovery, where the deliverable is a short signature you can act on rather than a map of variation.

DIABLO extends sparse PLS-DA to several data blocks. Sparse, because it forces most feature weights to zero and keeps only a handful per block. Multi-block, because it ties the blocks together through a design matrix so the selected features agree across layers instead of each block discriminating in isolation.

Each component is a set of sparse loadings, one vector per block, chosen to maximize the covariance with the outcome and, controlled by a design matrix, with the other blocks. Two knobs matter. keepX sets how many features to keep per block per component, which is the sparsity. The design matrix, between 0 and 1 off the diagonal, trades pure discrimination against between-block correlation. Because it is supervised, DIABLO overfits if you let it, so the number of components is chosen by repeated cross-validation and performance is always reported cross-validated.

This page is R only: mixOmics has no mainstream Python implementation. It runs in the pinned multi-omics container, with the CLL data from the MOFAdata package inside it.

IGHV is the outcome, so it is removed from the Mutations block to avoid leakage. DIABLO needs complete cases, so the analysis keeps the 188 patients with data in every layer and a known IGHV status, scales the continuous blocks, and leaves the binary mutations as is.

library(mixOmics)
# Off-diagonal 0.1 tilts DIABLO toward discrimination over block correlation.
design <- matrix(0.1, 4, 4); diag(design) <- 0
# Choose the number of components by repeated cross-validation, then fit.
perf_ncomp <- perf(init_model, validation = "Mfold", folds = 3, nrepeat = 5)
ncomp <- perf_ncomp$choice.ncomp$WeightedVote["Overall.BER", "centroids.dist"] # 2
model <- block.splsda(X, Y, ncomp = ncomp, keepX = keepX, design = design)

Cross-validation settles on two components. Projected onto them, each block separates the two IGHV subtypes, cleanly for methylation, loosely for mutations.

DIABLO sample plot, one panel per block, M versus U separation (R)

The panel DIABLO selects on the first component is 20 features each from drugs, methylation, and expression, and 9 mutations.

DIABLO component 1 loadings, selected features per block (R)

The nine selected mutations are del11q22.3, BRAF, TP53, NOTCH1, del17p13, ATM, SF3B1, and del13q14, the recognized driver lesions of CLL. DIABLO did not know these were important. It selected them because they help separate IGHV subtypes, and they turn out to be the genes CLL biology already points to. The circos plot draws the correlations among the selected features across all four blocks at a 0.7 cutoff.

DIABLO circos plot, cross-block correlations among selected features (R)

Cross-validated over repeated folds, the model misclassifies about 8% of patients (balanced error 0.085 at two components). The unmutated class is easy, near 1% error; the mutated class is harder, around 16%. Per-block ROC tells you which layer carries the signal.

DIABLO per-block ROC curves (R)

Methylation is the strongest single discriminator at AUC 0.996, then drug response 0.936, expression 0.913, and mutations 0.808. Methylation leading the pack echoes what SNF found: the IGHV split is written most clearly in the epigenome.

DIABLO needs a label, so it cannot discover structure you have not named. Point it at IGHV and it finds an IGHV panel; it will not surface an unexpected axis the way MOFA can. The panel is specific to the chosen outcome, and the sparsity and component count are choices you must validate rather than trust. For discovery without a label, start with MOFA or MCIA and bring DIABLO in once you have a phenotype worth predicting.

The runnable scripts and the container are in the companion code repo under guides/multi-omics/diablo/.