linage2
Principal-component clinical clock trained on 20-year mortality in the NHANES IV 1999-2000 wave and tested in the 2001-2002 wave. The 59 model features are log transformed where the reference specifies, robustly z-scored by sex against a healthy 40-50 year old NHANES reference, and folded at 6 MAD-scaled units; the folded vector is projected onto sex-specific singular vectors and scored by a sex-specific Cox model, so male and female samples run through entirely separate parameter sets. Chronological age is supplied in years and enters the Cox terms in months, where it is a genuine covariate rather than a cancelling offset. Sex is coded female = 1 and male = 0; a dataset with no female column scores every sample with the male parameters. C-reactive protein is supplied raw in mg/dL and takes a plain natural log with no floor, so a reading below detection coded as 0 folds to the -6 cap instead of being clamped the way the BioAge clocks clamp it. The input contract is wider than the 59 model features: total cholesterol, HDL cholesterol and triglycerides are consumed only by the Friedewald LDL and are not features themselves, and 26 questionnaire codes feed the comorbidity, self-reported-health and healthcare-use indices. An absent questionnaire block is the main hazard and it biases the estimate downward. The substituted values are the reference cohort's median profile everywhere except the comorbidity index: answering no to all 22 conditions gives 0 where the cohort's median is 1/22, so that one feature is substituted marginally healthier than the median. It costs almost nothing, because the index's entire 0 to 1 range moves the estimate by only 0.06 years. The self-reported-health index is what does the damage: its substitute of good, unchanged health is exactly the cohort median, and a subject who would have reported poor and worsening health reads about 5.3 years younger than they should. The healthcare-use index pushes the other way, by about 0.5 years for a subject who made 16 or more visits. An absent lipid panel substitutes a total cholesterol chosen so that the derived LDL lands on the reference median, avoiding the reference implementation's hard 0 mmol/L substitution; a NaN inside a lipid column that is present still takes that hard 0 path and lowers the estimate by roughly 0.35 years. The range check cannot see this at all: it resolves ranges over the clock's declared input features, and the comorbidity, self-reported-health and healthcare-use indices are derived inside the model rather than supplied, so no range check ever applies to them. Heed the missing-feature warning the prediction pipeline emits; for this clock it is the only signal that the questionnaire block was absent.
| |
|---|
| Predicts | biological age |
| Species | Homo sapiens |
| Tissue | blood, urine |
| Data type | clinical biomarkers |
| Model type | PCA + Cox regression |
| Year | 2025 |
Use with pyaging
1import pyaging as pya
2
3pya.pred.predict_age(adata, ["linage2"])
Browse every clock in the
pyaging Clock Catalogue.
Citation
Fong, Sheng, et al. "LinAge2: providing actionable insights and benchmarking with epigenetic clocks." npj Aging 11.1 (2025): 29.