OpenCGM-StateEventSource ↗

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.

Chance
0.500
Raw glucose readings
0.607
Clinical metricstime-in-range, mean, variability
0.643
CGM-JEPAthe nearest published model, identical folds
0.643
OpenCGM-StateEvent
0.670
0.50
0.55
0.60
0.65
0.70

ROC-AUC. The axis starts at 0.50 — chance — not at zero.

Improvement over…This modelCGM-JEPAReading
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.0359Both 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.

Regenerate:just eval-headline && just head-to-headreports/eval/head_to_head_5seed.csv~80 min on an RTX 3090

Ablations

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…ScoreChangeVerdict
Event stream only0.6229-0.0504load-bearing
No decomposition (raw signal)0.6500-0.0233load-bearing
No time-of-day signal0.6580-0.0152load-bearing
State stream only0.6592-0.0141load-bearing
Trained without Shanghai0.6649-0.0084within noise
Trained without Stanford0.6669-0.0064within noise
No temporal-dynamics loss0.6710-0.0023within noise
Gaps filled in by interpolation0.6738+0.0005within noise
No data augmentation0.6757+0.0024within noise
Fixed (not learned) filter width0.6765+0.0032within 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.

Regenerate:just ablation-sweep && just ablation-aggregatereports/eval/tier1_ablations_3seed.csv~8 h on an RTX 5090

Two 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.onnx1.99 MBsha256 b1349deffd15ab62CC-BY-NC-4.0
heads.json18 probes14 above the signal floorCC-BY-NC-SA-4.0
encoder.meta.jsonprovenancecheckpoint, epoch, seed, architecture flagsApache-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}
}