ZORV Vitality Age — Methodology
Public reference for how ZVA is computed: domains, priors, uncertainty, and the full zva_hazard_ratios catalog.
Keep Section 8 aligned with packages/db/src/migrations/0017_zva_core.sql.
1. What is ZORV Vitality Age?
ZORV Vitality Age (ZVA) is a multi-domain estimate of physiological risk profile expressed as an age offset from your chronological age. It combines wearable signals (heart rate, HRV, sleep, activity), behavioral patterns (steps, sedentary time), strength and training context, and optional laboratory biomarkers when you connect labs or import results.
How it differs from chronological age
Chronological age is calendar time. ZVA asks: given your current inputs, how does your risk-relevant physiology compare to typical aging, using literature hazard ratios (HRs) mapped to an effective vitality offset in years? A positive offset means the model interprets your combined profile as associated with higher mortality risk than a neutral profile; a negative offset means relatively favorable signals.
How it differs from opaque “biological age” products
Many consumer scores (for example WHOOP Age or Garmin Fitness Age) blend proprietary models with limited published methodology. ZORV ZVA is built to be auditable:
- Transparent priors: published HRs, populations, and directionality are listed in our
zva_hazard_ratioscatalog (see Section 8). - Uncertainty: we report a parametric uncertainty band around the estimate, not a single point score.
- Athlete-awareness: default domain weights can be overridden where the product allows, and periodization gates reduce inappropriate penalties during heavy training or taper (see Section 5).
- Data tiers: we label how complete your input set is (core / enhanced / complete) so sparse data does not pretend to be comprehensive (Section 6).
2. The seven domains
Domains are combined with default weights that sum to 100%. Order below matches the engine’s aggregation order.
| Domain | Default weight | Role & inputs (summary) | Hazard-ratio priors |
|---|---|---|---|
| Cardiovascular | 25% | Resting HR, VO2-based fitness (METs vs ACSM norms), 1-minute heart-rate recovery after exercise; optional lipid context where modeled. | Seeded HRs: rhr_per_10bpm, vo2max_per_met, heart_rate_recovery_lt_12_bpm_1min, total_cholesterol_u_shaped_band, hdl_per_10_mg_dl. The engine also applies correlation-aware composition across active cardio metrics. |
| Autonomic | 15% | HRV (ln rMSSD vs age-stratified population norms), 30-day HRV coefficient of variation, nocturnal respiratory rate; training phase informs periodization handling. | Seeded: hrv_ln_rmssd_per_sd (Thayer et al. review effect size). Additional engine heuristics for CV banding and respiratory rate (not separate rows in zva_hazard_ratios) refine the composite HR before Gompertz mapping. |
| Sleep | 15% | Sleep duration, timing consistency, efficiency, deep-sleep share vs age-adjusted expectation; optional alignment with sleep-provider scores for confidence. | Seeded: short/long duration, high consistency (see Section 8). |
| Metabolic | 15% | Fasting glucose, HbA1c, body composition, key labs (e.g. albumin, TSH, liver enzymes, insulin) via LOINC-aligned pipeline. | Seeded: hs-CRP, HbA1c slope, fasting glucose, vitamin D (Section 8). Other mappings use the same Gompertz and correlation machinery with lab-specific logic. |
| Musculoskeletal | 10% | Strength exposure (sessions) and movement diversity; taper/race periodization gate neutralizes strength/diversity penalties when appropriate. | Seeded: strength_training_any_vs_none (Momma et al.). Diversity uses an engine prior (multi-sport variety) combined with strength via correlation adjustment. |
| Recovery | 10% | Recovery trend, ACWR stability, training response, and selected labs (e.g. hs-CRP, WBC, ferritin, testosterone vs age/sex norms, cortisol snapshot). | No separate rows in zva_hazard_ratios for recovery metrics. Engine uses conservative HR priors (some aligned with the same literature as metabolic hs-CRP). Offsets are combined with equicorrelation adjustment across active recovery metrics. |
| Behavioral | 10% | Daily steps (dose-response blocks), sedentary time, alcohol, smoking. | Seeded: steps_per_1000_day, sedentary_gt_10h_day. Other behavioral factors use engine priors and correlation composition. |
3. Gompertz conversion
Each composed hazard ratio for a domain (or sub-metric path) is mapped to an effective age offset in years using a Gompertz-style baseline hazard for mortality scaling:
offset_years = ln(HR) / ln(b)
Here b is the age-stratified annual mortality multiplier for a reference band (approximate Gompertz slope in log-hazard per year). ZVA uses:
| Age band (years) | b (approx.) | ln(b) |
|---|---|---|
| 20–39 | 1.08 | ln(1.08) ≈ 0.077 |
| 40–59 | 1.10 | ln(1.10) ≈ 0.095 |
| 60–79 | 1.13 | ln(1.13) ≈ 0.122 |
Chronological age selects the band (values outside 20–80 clamp to the nearest band).
Examples (40–59 band, b = 1.10)
- HR = 1.09 (e.g. higher resting HR per 10 bpm): offset ≈ ln(1.09)/ln(1.10) ≈ +0.90 y.
- HR = 0.87 (e.g. protective cardiorespiratory fitness per MET): offset ≈ ln(0.87)/ln(1.10) ≈ −1.47 y.
- HR = 4.0 (e.g. impaired heart-rate recovery): offset ≈ ln(4)/ln(1.10) ≈ +14.5 y (large HRs map to large offsets by design).
4. Bayesian aggregation
ZVA combines domain-level offsets into one aggregate vitality offset and an uncertainty range. The implementation is a pragmatic MVP: it is not a full hierarchical Bayesian posterior with MCMC; it is documented as Bayesian-style because it pools uncertainty from domains with explicit priors.
How domains are combined
- Effective weights: each domain’s configured weight is multiplied by that domain’s input confidence (0–1). If the sum of effective weights is positive, weights are renormalized to sum to 1. If all confidences are negligible, the model falls back to uniform weights over domains that have any inputs (or over all domains as a last resort).
- Aggregate offset: the weighted sum of per-domain
offset_yearsvalues. - Per-domain uncertainty: a stochastic term combines low confidence with larger offset magnitude, plus a base uncertainty per domain (years) so sparse domains do not collapse uncertainty.
- Pool: independent combination yields raw combined spread = sqrt(sum (wi si)2).
- Correlation inflation: because domains overlap physiologically, a factor in [1.0, 1.4] inflates the pooled spread based on average inter-domain correlation among active domains (fixed correlation prior matrix in code).
- 95% interval on offset: the aggregate offset ± 1.96 × inflated combined spread. Vitality age = chronological age + offset; the reported band applies to that offset (and thus to vitality age).
What the interval means
This is best read as a parametric uncertainty interval around the aggregate offset under the MVP independence/correlation-inflation model. It reflects input completeness and domain-level spread, not a full posterior over latent biological age. As longitudinal data grows, the model may graduate to richer covariance or explicit Bayes inference (see in-code “Phase 3” notes).
5. Periodization gate
Structured training intentionally changes acute markers (e.g. HRV suppression in build/overload; reduced strength stimulus in taper/race). ZVA applies gates so population-norm comparisons do not blindly penalize athletes in appropriate phases.
Autonomic (build / overload)
When training phase is build or overload, HRV is evaluated against an expected suppression versus baseline (and population z-scores). If the gated path yields a more favorable (lower) unfavorable offset than the naive population comparison, a periodization gate flag is set and the gated offset is used. Optional baseline rMSSD improves detection of excess suppression beyond expected.
Musculoskeletal (taper / race)
When phase is taper or race, strength and movement-diversity hazard ratios are forced to neutral (HR = 1) so short-term reductions in lifting volume or sport variety do not register as long-term risk. A gate flag records that this neutralization applied.
6. Data tiers
Your snapshot includes a data tier label:
- Complete: every domain reports at least two tracked inputs available (
inputs_available ≥ 2per domain). - Enhanced: otherwise, if you have metabolic lab signals on the engine’s metabolic LOINC path or body composition (lean mass or body fat) plus at least one lab value.
- Core: wearable-forward estimate when enhanced/complete criteria are not met; domains may be sparse.
7. Limitations & caveats
- Population hazard ratios on individuals: published HRs are group-level associations. They are used as transparent priors, not individualized causal effects.
- Wearable accuracy: device error, wrist vs chest, algorithm changes, and missing nights affect inputs; confidence weighting and uncertainty partially reflect this but cannot remove all measurement bias.
- Not a medical diagnostic: ZVA is a wellness and training-context estimate. It does not diagnose disease or replace clinical judgment or screening guidelines.
- Additive / independence limits: domain-level independence and fixed correlation inflation approximate overlapping biology; interaction effects (e.g. sleep × training load) are not fully captured.
- Living model: priors, weights, and aggregation may change as methodology improves. Check the product version string when comparing snapshots over time.
8. Full hazard ratio table (zva_hazard_ratios)
All rows below are seeded in the database from migration 0017_zva_core.sql. Direction describes how the HR applies (per-unit increase, binary threshold, etc.).
| metric_key | domain | HR | 95% CI | direction | unit / threshold | Citation (year) | Population | Notes |
|---|---|---|---|---|---|---|---|---|
| rhr_per_10bpm | cardiovascular | 1.0900 | — | per_unit_increase | per 10 bpm increase in resting heart rate | Aune D, et al. CMAJ (2017) | general adult | Pooled dose-response: higher RHR → higher all-cause mortality; HR per 10 bpm. |
| vo2max_per_met | cardiovascular | 0.8700 | — | per_unit_increase | per 1 MET higher CRF | Mandsager K, et al. JAMA Netw Open (2018) | clinical exercise testing | ∼HR 0.87 per MET higher fitness. |
| hrv_ln_rmssd_per_sd | autonomic | 0.8500 | — | per_unit_increase | per 1 SD higher ln(rMSSD) | Thayer JF, et al. Neurosci Biobehav Rev (2010) | general adult | Working effect size for higher HRV → lower risk. |
| sleep_duration_short_lt_6h | sleep | 1.1200 | — | binary_below_threshold | hours/night; threshold 6 | Cappuccio FP, et al. Sleep (2010) | general adult | Short sleep mortality association. |
| sleep_duration_long_gt_9h | sleep | 1.3000 | — | binary_above_threshold | hours/night; threshold 9 | Cappuccio FP, et al. Sleep (2010) | general adult | Long sleep mortality association. |
| sleep_consistency_gt_70pct | sleep | 0.6000 | 0.52–0.80 | binary_above_threshold | consistency %; threshold 70 | Zuraikat FM, et al. Sleep (2024) | general adult | Midpoint prior; harmonize exposure definitions in pipeline. |
| steps_per_1000_day | behavioral | 0.8800 | — | per_unit_increase | per 1000 steps/day (up to ~10k) | Paluch AE, et al. Lancet Public Health (2022) | general adult | Incremental benefit per 1000 steps. |
| strength_training_any_vs_none | musculoskeletal | 0.7700 | — | binary_above_threshold | any vs none (see engine mapping) | Momma H, et al. Br J Sports Med (2022) | general adult | Guideline-level muscle-strengthening vs none. |
| heart_rate_recovery_lt_12_bpm_1min | cardiovascular | 4.0000 | — | binary_below_threshold | HRR bpm at 1 min; threshold 12 | Cole CR, et al. N Engl J Med (1999) | clinical exercise testing | Impaired recovery → higher mortality. |
| hs_crp_gt_3_mg_l | metabolic | 1.4400 | — | binary_above_threshold | mg/L; threshold 3 | Emerging Risk Factors Collaboration. JAMA (2010) | general adult | CRP >3 vs ≤1 mg/L vascular mortality IPD meta-analysis. |
| hba1c_per_1pct_above_5_7 | metabolic | 1.1500 | — | per_unit_increase | per 1% HbA1c above 5.7% | Selvin E, et al. N Engl J Med (2010) | nondiabetic US adults | Nondiabetic range cardiovascular risk. |
| fasting_glucose_gt_126_mg_dl | metabolic | 1.2000 | — | binary_above_threshold | mg/dL; threshold 126 | DECODE. Lancet (1999) | European cohorts | Diabetes-range fasting glucose vs normoglycemia. |
| total_cholesterol_u_shaped_band | cardiovascular | 1.1000 | — | binary_above_threshold | mg/dL total cholesterol; threshold 240 | Prospective Studies Collaboration. Lancet (2007) | general adult | U-/J-shaped associations; prior flags far-from-optimal bands. |
| hdl_per_10_mg_dl | cardiovascular | 0.9000 | — | per_unit_increase | per 10 mg/dL higher HDL-C | Gordon DJ, et al. Circulation (1989) | hypercholesterolemic men | CHD approximation; not identical to all-cause. |
| vitamin_d_lt_20_ng_ml | metabolic | 1.2600 | — | binary_below_threshold | 25(OH)D ng/mL; threshold 20 | Schöttker B, et al. BMJ (2014) | older EU + US | Low 25(OH)D vs higher concentrations. |
| sedentary_gt_10h_day | behavioral | 1.3400 | — | binary_above_threshold | hours/day sedentary; threshold 10 | Ekelund U, et al. Lancet (2016) | general adult | Very high sitting vs lowest groups. |
Full citations as stored in the database: see migration SQL for complete source_citation strings.