Methodology · revision 1.3

A bio age you can argue with.

13
domains modelled. Fitness, cardiovascular, sleep, body composition, cognitive, physical function, labs, inflammation, clinical, genetic, family history, mental health, lifestyle.
100+
peer-reviewed coefficients. Each one carries its citation inline; each one links back to the line in the engine source where it fires.
±0.5y
day-to-day stability. An exponential moving average (α = 0.35), regression-tested on noisy realistic input, keeps the number from flickering.

The approach in one paragraph

We don't predict mortality. We predict physiological age - the age at which someone with median health metrics would carry the same readings you do. Each of 13 domains emits a "years older or younger than chronological" signal grounded in a published cohort study. Domains compose additively, with safety clamps so no single signal can dominate, and a confidence score so a sparse-data user knows their estimate is provisional. Day-to-day stability is enforced by an exponential moving average (α = 0.35) that's regression-tested to keep variance under 0.5 years on realistic noisy input.

This page is the public version of our internal methodology document. It's published - rather than kept internal - because the alternative is a black-box bio-age number, and health-tech apps that hide their math should not be trusted.

1 · Fitness

VO₂ max - the strongest single signal

Predicted VO₂ max for your age, sex, and weight uses the Jackson non-exercise estimate. Years delta is then −1.61 · (measured − expected) / 3.5, clamped to ±6 years.

Mandsager K et al. Association of Cardiorespiratory Fitness with Long-term Mortality Among Adults Undergoing Exercise Treadmill Testing. JAMA Network Open 2018;1(6):e183605.
A 1-MET (3.5 ml/kg/min) advantage over expected mapped to ~12% lower all-cause mortality; converted to ~1.6 years of physiological-age equivalent.

Steps and active minutes

Step thresholds are split by age 60. Older-adult bands: <2,500 / <4,000 / <6,000 / 6,000-8,000 / >8,000. Younger adults shift up by ~1,000 at each band.

Saint-Maurice PF et al. Association of Daily Step Count and Step Intensity with Mortality Among US Adults. JAMA 2020;323(12):1151-1160.

Cumulative fitness - capacity + behavior

VO₂ measures cardiorespiratory capacity (peak aerobic potential); steps and active minutes measure behavior (habitual movement). They have meaningfully independent contributions.

Stamatakis E et al. Joint associations of objectively-assessed physical activity and cardiorespiratory fitness with all-cause and cardiovascular mortality. BMJ 2019;366:l4570.
Combined high-fitness + high-activity stratum had the largest mortality reduction (HR ≈ 0.45 vs sedentary low-fit). "High-fit / low-active" was substantially worse than "high-fit / high-active".

The engine combines:

DriverRangeWhen it fires
VO₂ max±6yAlways preferred when present
Cycling FTP±6yOnly when VO₂ absent
Steps + active-min±2.5y full / ±1.25y discountedAlways when data present
Self-reported activity±2yOnly when neither capacity nor behavior fires
Zone 2 minutes bonus−0.4y additiveWhen any primary path fired

When both capacity and behavior are present, behavior is discounted by min(0.5, |capacityDelta| / 6.0) - Stamatakis 2019's ~50% overlap. The combined sum is clamped at ±7y.

2 · Cardiovascular & autonomic

Blood pressure

Bands match the ACC/AHA 2017 hypertension guideline. The protective athletic-low band (90-114 / 60-74) was added on the back of the SPRINT trial.

ReadingYears delta
90-114 / 60-74 (athletic-low)−0.3
<120/80 (normal)0
120-129 / <80 (elevated)+0.5
≥130/80 (Stage 1)+1.5
≥140/90 (Stage 2)+3.0
>180/120 (severe)+4.5
Whelton PK et al. 2017 ACC/AHA Guideline for High Blood Pressure in Adults. JACC 2018;71:e127-e248.

Resting heart rate

Bands progress from −1.0y at ≤55 bpm to +3.3y at ~100 bpm.

Saxena A et al. Resting Heart Rate and Mortality. Eur Heart J 2013 - pooled analysis: hazard ratio ~1.09 per 10 bpm above 65.

Heart rate variability (RMSSD)

Hillebrand S et al. Heart Rate Variability and First Cardiovascular Event in Populations Without Known Cardiovascular Disease: meta-analysis and dose-response. Europace 2013;15:742-749.

3 · Sleep & recovery

Sleep duration uses an inverted-U curve peaking at 7-9h, with bands grounded in:

Yin J et al. Relationship of Sleep Duration With All-Cause Mortality and Cardiovascular Events: A Systematic Review and Dose-Response Meta-Analysis of Prospective Cohort Studies. J Am Heart Assoc 2017;6:e005947.

Sleep efficiency (% of time-in-bed actually asleep), bedtime regularity, and time-in-deep-sleep + REM each contribute additional small deltas, capped per-driver and clamped collectively at ±4y.

4 · Body composition

BMI uses the standard underweight / normal / overweight / obese / Stage II / Stage III bands, but with the protective recognition that BMI 25-27 in older adults is associated with lower all-cause mortality. Body fat % bands are sex-specific. Waist-to-height ratio > 0.5 is treated as a separate metabolic risk signal.

Flegal KM et al. Association of all-cause mortality with overweight and obesity using standard BMI categories: a systematic review and meta-analysis. JAMA 2013;309(1):71-82.

5 · Cognitive

The in-app cognitive battery (reaction time, word recall, spatial memory, symbol match) emits a small (±2y) bonus or penalty, weighted by how much the user's score deviates from age-matched norms. This is a deliberately modest contribution - single-session cognitive scores have high variance.

6 · Physical function

Grip strength, sit-to-stand reps, and balance time. Each is a strong independent predictor of mortality in older adults; in younger users they're smaller signals.

Leong DP et al. Prognostic value of grip strength: findings from the Prospective Urban Rural Epidemiology (PURE) study. Lancet 2015;386(9990):266-273.
Each 5kg decrement in grip strength was associated with a 16% increase in all-cause mortality.

7 · Lab biomarkers (AI-aggregated)

When users upload a lab report (PDF or photo), an AI vision pass extracts the values and routes each to its named coefficient (see §9). When the report is unparseable, a fallback "labs flag" reads the user's self-reported summary and emits a small penalty.

8 · Inflammation (hsCRP)

High-sensitivity CRP is the single inflammation marker in the model.

Ridker PM. A Test in Context: High-Sensitivity C-Reactive Protein. JACC 2016;67(6):712-723.
hsCRP <1 mg/L low risk; 1-3 mg/L average; >3 mg/L elevated; >10 mg/L acute-process flag (excluded from chronic-disease estimation).

9 · Lab markers - structured per-marker

Each lab marker has its own threshold table. Below: the highest-leverage signals.

ApoB

Sniderman AD et al. Apolipoprotein B Particles and Cardiovascular Disease: A Narrative Review. JAMA Cardiol 2019;4(12):1287-1295.
ApoB outperforms LDL-C as a CV-risk predictor; targets <80 mg/dL standard, <60 mg/dL aggressive.

HbA1c

Selvin E et al. Glycated Hemoglobin, Diabetes, and Cardiovascular Risk in Nondiabetic Adults. NEJM 2010;362:800-811.

Lp(a)

Genetic, single-test. >50 mg/dL adds +1.5y; >100 mg/dL +3y. Tsimikas S et al. A Test in Context: Lipoprotein(a). JACC 2017;69(6):692-711.

Vitamin D, fasting glucose, GGT, eGFR, ALT/AST, ferritin

Each has its own band table, each with the citation inline in the engine source.

10 · Genetic (APOE ε4)

When a user uploads 23andMe / AncestryDNA raw data, the engine reads APOE ε4 status. e3/e3 baseline; e3/e4 +0.6y; e4/e4 +1.8y. This is a small, capped contribution - APOE is correlative, not deterministic.

Liu C-C et al. Apolipoprotein E and Alzheimer disease: risk, mechanisms and therapy. Nat Rev Neurol 2013;9:106-118.

11 · Family history (parental longevity)

Self-reported parental ages of death. Each parent who lived >85 contributes −0.4y; each who died <60 contributes +0.5y. Capped at ±2y.

Sebastiani P et al. Families enriched for exceptional longevity also have increased health-span. Front Public Health 2013;1:38.

12 · Mental health

PHQ-9 (depression), GAD-7 (anxiety), and PSS-10 (perceived stress) - each user-administered in-app. Major depression is associated with ~+1.7y physiological age; severe anxiety adds another small layer; high perceived stress is a separate signal.

Han LKM et al. Contributing factors to advanced brain aging in depression and anxiety disorders. Translational Psychiatry 2021;11:402.

13 · Clinical flags

Smoking (active +5y; quit-3y +2y; quit-5y +0.5y), Type 2 diabetes (+3y), CVD (+4y), and severe BP (>180/120) each surface as clinical flags with a "seek prompt review" message - at these levels, the algorithm should not silently average the data into a score.

Composite, caps, and smoothing

Domains compose additively, with two safety mechanisms:

  1. Per-domain caps. No single domain can move bio age more than ±6-8 years (varies by domain). Prevents one outlier signal from dominating.
  2. Total clamp. Final delta clamped to ±18 years off chronological. Beyond that, the model is reporting noise.

Day-to-day stability is enforced by an exponential moving average (α = 0.35) that's regression-tested on noisy realistic input. The smoother lives in BioAgeSmoother.swift and is mirrored on the server as a Postgres RPC for cross-platform parity.

Confidence & uncertainty

Every reading carries a confidence score (0-1) computed from how many domains had data. Sparse-data users see a "provisional" badge on their bio age until enough domains light up. The confidence breakdown is visible in the in-app Bio Age Breakdown sheet, alongside the per-domain contribution chart.

What this isn't

  • Not a mortality prediction. Mortality models (e.g. Klemera-Doubal, PhenoAge) train on death-event data; we don't.
  • Not a methylation clock. Methylation clocks (Horvath, GrimAge) measure DNA methylation directly. This model uses behavioral, physiological, and biomarker proxies.
  • Not a disease diagnosis. A high bio age doesn't mean you have a condition; it means signals are pointing in a direction worth understanding.
  • Not personalised therapy. Recommendations are population-level. For anything clinically significant, see a doctor.

Methodology v1.3, last revised 2026-05-08. The full document - every coefficient, every Swift line anchor, every citation - is published in the Thier repository.

Signed off

Read it. Argue with it. Then go see your number.

The point of publishing every coefficient is that you don't have to take my word for any of it. Read the paper. Check the threshold. If you find a coefficient that disagrees with the literature, tell me - I'll fix it. The methodology is a living document; the engine is a single Swift package; both are open to argument.

- Steven