MetaboGuard has a valid self-supervised representation/deviation artifact, but does not currently have a validated future cancer or diabetes risk model.
The current artifact may be used to:
It must not be described as predicting future development from current NHANES data.
| Item | Result |
|---|---|
| Unlabelled training rows | 50,000 |
| Raw features | 25 |
| Latent dimensions | 16 |
| Validation reconstruction loss | 0.0565 |
Post-hoc cross-sectional association checks:
| Label | AUROC | AUPRC | Interpretation |
|---|---|---|---|
| Any-cancer prevalence | 0.699 | 0.169 | Representation association only |
| Type 2 diabetes proxy | 0.923 | 0.675 | Current-state association only |
| Type 1 proxy | 0.909 | 0.135 | Unvalidated research proxy |
These values are not development-risk performance.
An audit against the official NHANES codebook found that the first pooled dataset used MCQ230 code 39 as pancreatic cancer. The official coding is:
The former metrics and MetaboGuard-XGB v1 artifact are invalid and must not be
quoted, benchmarked, published or used for inference.

The corrected nhanes_multicycle_v2.csv contains:
| Definition | Positive cases |
|---|---|
| Pancreatic cancer across the pooled population | 19 |
| Pancreatic cancer among participants with diabetes | 7 |
| Usable diabetic positives after required-field cleaning | 6 |
| Pancreatic cancer diagnosed 0-3 years after diabetes | 2 |
These event counts are too small for train/test splitting, calibration, temporal validation or model comparison.

MetaboGuard now:
nhanes_multicycle.csv and nhanes_merged.csv from API discovery._v2.csv.| Variable | MetaboGuard field | Coverage in pooled cohort |
|---|---|---|
| Smoking status | smoking_status |
59,745 |
| Current smoker | current_smoker |
59,745 |
| Alcohol status | alcohol_status |
51,467 |
| Average drinks/day | average_drinks_per_day |
34,282 |
| Haemoglobin | CBC_LBXHGB |
87,554 |
| Platelet count | CBC_LBXPLTSI |
87,552 |
| ALT | BIOPRO_LBXSATSI |
67,442 |
| Alkaline phosphatase | BIOPRO_LBXSAPSI |
67,536 |
| Creatinine | BIOPRO_LBXSCR |
67,542 |
| Reciprocal HbA1c term | hba1c_reciprocal_100 |
68,644 |
| Squared HbA1c term | hba1c_squared |
68,644 |
These variables improve the feature schema but cannot compensate for only six usable positive diabetic pancreatic-cancer cases.

| Output | Meaning | Direction |
|---|---|---|
| AUROC | Ranking discrimination | Higher is better; 0.5 is random |
| AUPRC | Precision-recall performance | Higher is better; compare with prevalence |
| AUPRC lift | AUPRC divided by prevalence | Higher is better; 1× is baseline |
| Brier score | Squared probability error | Lower is better |
| Feature importance | Model dependence on a feature | Larger means more influence, not causality |
No corrected pancreatic-risk values are currently reported for these metrics.
The brief requires a cohort containing:
UK Biobank or an equivalent linked clinical/genetic cohort is required for the primary MetaboGuard model. NHANES should remain a feature-engineering and population-context dataset.
| Output | What it is | What it is not | Safe sentence |
|---|---|---|---|
metabolic_deviation_score |
Distance of a profile from the training reference (0.7 × reconstruction + 0.3 × latent distance, both robust-scaled) | A probability, a severity grade, or a diagnosis | “This profile is unusual relative to our reference sample.” |
reference_percentile |
Rank of that score inside the training reference distribution | A population percentile (survey weights are not applied) | “It sits above the 95th percentile of our training reference.” |
latent_representation |
16 learned numbers summarising the inputs | Interpretable biology; individual dimensions have no assigned meaning | “It is the encoding we use for downstream research.” |
top_deviation_features |
Features contributing most to reconstruction error | Causes, or clinically abnormal values | “Most of the unusualness comes from HbA1c and triglycerides.” |
cross_sectional_association_probability |
Probability that someone with this profile already has a recorded diagnosis in NHANES | A future-risk probability; a screening result | “Profiles like this are more common among people who already report a diagnosis.” |
| Post-hoc AUROC / AUPRC | Separation of prevalent cases on the holdout partition | Prevention or early-warning performance | “The representation carries cross-sectional signal.” |
| Baseline reconstruction MSE | How well an unsupervised method models the feature distribution | Disease prediction skill | “The encoder models the data slightly better than a matched PCA.” |
| Flag Jaccard between methods | Overlap of the top-5 % most-unusual profiles | Agreement about disease | “Which profiles look unusual depends on the method, so clinicians adjudicate.” |
Deprecated: cancer_risk_probability is retained for one release as an alias of
cross_sectional_association_probability. Do not quote it; the name implies future
risk the data cannot support.
| Tier | What it means for interpretation |
|---|---|
usable_now |
Present, plausible, ≥50% coverage among adults, no blocking drift or availability gap. |
qualified_use |
Usable with the stated caveat printed alongside any result: low coverage, cycle availability gap, cycle-level drift, implausible-value burden, or a declared evidence gap. |
unavailable |
Absent or effectively unmeasured. Any statement about it is unsupported. |
prohibited |
Outcome label, label-derived column, or post-diagnosis TCGA context. Never an input. |
Current file: 17 usable_now, 8 qualified_use (C-peptide, glucose, insulin, hs-CRP,
triglycerides, LDL, HOMA-IR, race/ethnicity), 0 unavailable, 16 prohibited.
| Output | What it is | What it is not |
|---|---|---|
cluster_id |
A phenotype identifier such as cluster_2 |
A cancer type, cancer site, disease subtype or severity grade |
prototype_median_profile |
Median raw feature values inside the phenotype | A patient, a reference range or a target |
top_distinguishing_panel |
Features whose robust standardised difference from the reference is largest | Causes, or evidence that the panel detects disease |
membership_confidence |
GMM posterior, or k-means relative margin | A probability of disease |
posthoc_label_summary |
Prevalence of an already-recorded diagnosis per phenotype, suppressed below 50 cases | Future risk, incidence, or validation of the phenotype |
status: no_stable_clusters |
A result: nothing passed the gates | A bug, or a reason to lower the thresholds |
If the status is no_stable_clusters, the correct sentence is: “No stable metabolic
phenotype survived our stability and negative-control checks on this data.” Do not describe
candidate solutions from the table as findings.
A gating control above 0.30 means the clustering largely reproduces that nuisance variable. Age and sex associations are expected to be non-zero in metabolic data; only values above the threshold mark a solution as a data artefact. The exact assay-availability pattern is shown for transparency and never gates a decision.
Read three fields together before quoting any number: stage_or_lead_time,
validation_status and limitations. A high AUC measured at diagnosis says nothing about
early detection; the lead-time column is where the honest answer lives. Rows without a
source URL or with an ungraded evidence_grade are research-only and must not reach a
clinician-facing surface. See EVIDENCE_AND_CLAIMS.md for the
allowed and denied statement lists.
Gated off entirely: any 1/3/5-year horizon output. /api/v1/prevention-future-risk
returns HTTP 409 with the event-count gate report, and
prevention-capabilities.longitudinal_heads_enabled is false.
Professor-facing API/UI surfaces now render a shared envelope so interpretation is explicit and consistent:
current_profile_assessment: current-state meaning (deviation band or
cross-sectional association framing).standout_factors: feature-level contributions for this profile.data_readiness: missing inputs with priority and rationale.research_association: prevalence/proxy-only status text.safety_contract: diagnostic_status=non_diagnostic, future_risk=disabled.The dashboard’s future-risk panel shows one row per horizon (1, 3 and 5 years). Every row is one of exactly two things:
Reading the numbers:
results.json —
not per individual synthetic history.The dashboard’s future-risk panel shows one row per horizon (1, 3 and 5 years). Every row is one of exactly two things:
Reading the numbers:
results.json —
not per individual synthetic history.The dashboard’s future-risk panel shows one row per horizon (1, 3 and 5 years). Every row is one of exactly two things:
Reading the numbers:
results.json —
not per individual synthetic history.