-
-
Patients list dropdown box
-
Cohort level view (Clinical layer (SHAP))
-
Page header with Fused 6-month flare risk, epigenetic layer risk and clinical layer risk for each patient
-
Patient's score driving factor (Clinical layer (SHAP))
-
Cohort level view (Epigenetic layer (SHAP))
-
Patient's score driving factor (Epigenetic layer (SHAP))
Inspiration
Rheumatoid arthritis flares cause irreversible joint damage, but the way we detect them today hasn't changed much: a patient shows up to a clinic visit, gets a DAS28 score and some bloodwork, and by the time the numbers look bad, the flare is already underway. Meanwhile, epigenetics research has quietly shown for over a decade that RA patients' DNA methylation ages faster than their chronological age — a signal that's almost never combined with the clinical data doctors actually use. We wanted to see whether fusing those two signals could catch a flare earlier than either one alone.
What it does
ChronoFlare-RA predicts a patient's probability of an RA flare within 6 months by combining two "omics" layers into one score:
- Epigenetic layer — DNA methylation beta values at 30 CpG sites feed a self-trained elastic-net epigenetic clock, producing an age acceleration score and an immune-activation score.
- Clinical layer — DAS28, CRP, ESR, seropositivity, disease duration, BMI, smoking status, and biologic use.
Each layer gets its own gradient-boosted model; a logistic-regression meta-learner fuses their outputs into one calibrated risk score. A Streamlit dashboard shows the fused score and each layer's individual contribution, with SHAP explanations of exactly what's driving a given patient's number — because a clinician won't trust a black box.
How we built it
- Generated a synthetic cohort statistically grounded in published RA epigenetics/clinical literature (public RA methylation cohorts require ethics-gated access, so this keeps the pipeline fully reproducible).
- Built an elastic-net epigenetic clock (\( \hat{y}{age} = \beta_0 + \sum_i \beta_i x_i \)) trained on the CpG betas, then derived age acceleration as \( \Delta{age} = \hat{y}{age} - y{chronological} \).
- Built a stacked ensemble: separate XGBoost base learners per omics layer, combined via 5-fold out-of-fold stacking into a logistic regression meta-learner — avoiding leakage between the layers.
- Ran an ablation study (methylation-only vs. clinical-only vs. fused) to verify the fusion is actually earning its complexity.
- Wired it all into a Streamlit dashboard with SHAP waterfall plots per patient.
Challenges we ran into
- No real dataset in scope. Public GEO methylation cohorts are ethics-gated and too large for a hackathon repo, so we had to build a synthetic data generator whose causal structure (not just marginal distributions) mirrors what's reported in the literature — otherwise the "fusion beats either layer" story would be meaningless.
- Avoiding a rigged demo. Early versions of the model showed inflated performance because the synthetic label leaked too directly from the features. We deliberately added noise and re-ran the ablation until the results were honest: the fused model convincingly beats the clinical- only baseline (closest to current practice) while staying competitive with methylation alone, rather than showing a suspiciously perfect number.
- Stacking without leakage. Getting the out-of-fold prediction pipeline right (so the meta-learner never trains on a base learner's in-sample output) took some care.
What we learned
How to structure a genuine multi-omics fusion architecture (not just concatenating features), how to build and validate a methylation clock from scratch, and how much of the "trustworthiness" of a clinical ML tool comes from being able to explain why, not just what.
What's next
Swap in a real GEO methylation series (e.g. GSE42861) and a proper Houseman-style reference deconvolution for immune cell composition, add a longitudinal/temporal layer using DAS28 trajectories, and reframe the label as time-to-flare (Cox survival) instead of a fixed 6-month cutoff.
Built With
- elasticnet
- jupyter
- matplotlib
- numpy
- pandas
- python
- scikit-learn
- shap
- streamlit
- xgboost
Log in or sign up for Devpost to join the conversation.