Results
Five independently trained models, 120 epochs each, evaluated on 14 clinical questions with subject-disjoint splits. Negative results included.
Headline
ROC-AUC is the probability that a randomly chosen positive case is ranked above a randomly chosen negative one. 0.5 is chance.
ROC-AUC. The axis starts at 0.50 — chance — not at zero.
| Improvement over… | This model | CGM-JEPA | Reading |
|---|---|---|---|
| Clinical metrics | +0.0269[0.0222, 0.0316] | 0.0000[-0.0049, 0.0050] | This interval excludes zero; the comparator’s does not. |
| Raw readings | +0.0628 | +0.0359 | Both improve on raw input. |
Brackets are 95% confidence intervals over seeds. The macro advantage is real and its interval excludes zero, but it does not survive being broken into single questions: this model is ahead of the clinical baseline on 13 of 18 task-cohort rows, and on none of them does the difference reach significance after Holm correction — in any seed. Each row has 29 to 100 people in it. What the evidence supports is a small consistent lift across tasks, not a set of per-task wins.
just eval-headline && just head-to-headreports/eval/head_to_head_5seed.csv~80 min on an RTX 3090Ablations
Each design choice was removed and the model retrained: ten conditions, three seeds each, 40 epochs. The seed-level standard deviation is 0.0084, so differences smaller than that are noise.
| Remove this… | Score | Change | Verdict |
|---|---|---|---|
| Event stream only | 0.6229 | -0.0504 | load-bearing |
| No decomposition (raw signal) | 0.6500 | -0.0233 | load-bearing |
| No time-of-day signal | 0.6580 | -0.0152 | load-bearing |
| State stream only | 0.6592 | -0.0141 | load-bearing |
| Trained without Shanghai | 0.6649 | -0.0084 | within noise |
| Trained without Stanford | 0.6669 | -0.0064 | within noise |
| No temporal-dynamics loss | 0.6710 | -0.0023 | within noise |
| Gaps filled in by interpolation | 0.6738 | +0.0005 | within noise |
| No data augmentation | 0.6757 | +0.0024 | within noise |
| Fixed (not learned) filter width | 0.6765 | +0.0032 | within noise |
The event stream alone loses 0.0504, six times the noise level. Removing the decomposition entirely loses 0.0233. The state/event split is where most of the benefit comes from.
just ablation-sweep && just ablation-aggregatereports/eval/tier1_ablations_3seed.csv~8 h on an RTX 5090Two results went against expectation. Augmentation contributes nothing measurable. And interpolating the sensor gaps, which the design refuses to do, scores +0.0005 — level with the masked version at this evaluation depth. The never-interpolate rule is defensible on other grounds, but at 40 epochs it is not supported by a measured gain.
Artefacts
Everything the numbers above were computed from, and the files this site serves.
| encoder.onnx | 1.99 MB | sha256 b1349deffd15ab62… | CC-BY-NC-4.0 |
| heads.json | 18 probes | 14 above the signal floor | CC-BY-NC-SA-4.0 |
| encoder.meta.json | provenance | checkpoint, epoch, seed, architecture flags | Apache-2.0 |
Cite
@software{fourdrinier_opencgm_stateevent,
author = {Fourdrinier, Stephane},
title = {OpenCGM-StateEvent: an independent public-data reconstruction
of the GlucoFM dual-stream CGM foundation model},
year = {2026},
url = {https://github.com/sfourdrinier/opencgm},
note = {Code Apache-2.0; encoder CC-BY-NC-4.0; probe heads CC-BY-NC-SA-4.0}
}