Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

PhenoAge Calculation Bug Disclosure: Missing U-Shaped Curves for Biomarkers #136

Open
nopara73 opened this issue Jan 2, 2025 · 6 comments

Comments

@nopara73
Copy link
Owner

nopara73 commented Jan 2, 2025

With Dave Pascoe we’ve discovered that the DNAm PhenoAge calculation method in the Longevity World Cup repository – as well as all existing online PhenoAge calculators – seems to have a critical oversight. Specifically, the PhenoAge biomarkers (albumin, creatinine, glucose, C-reactive protein, lymphocyte percentage, mean cell volume, red cell distribution width, white blood cell count, and alkaline phosphatase) follow a U-shaped curve in reality (values that are either too high or too low are both associated with increased mortality), but the current linear regression model rewards pushing these values to unrealistic extremes.

For instance, the algorithm will yield impossibly large negative ages if albumin is inflated to 100 g/dL or if glucose is taken down to extremely low, unhealthy levels. These “optimizations” don’t reflect better health but rather an artifact of the underlying linear model.

Below is a snippet from our discussion:

“Glucose, for example, would be near perfect biologically at 80, but PhenoAge will reward much more unhealthy people (e.g., glucose of 60, 40, or even 20) with much younger PhenoAges! That’s a big problem!”
— Dave Pascoe

We see similar distortions with albumin, C-reactive protein, and likely other markers. Simply capping values at a plausible upper or lower limit won’t solve it either, because some biomarkers legitimately have a U-shape (like glucose), and limiting them linearly doesn't capture the genuine mortality curve.

Question:

How might we fix or improve the DNAm PhenoAge calculations to respect actual physiological realities (e.g., U-shaped relationships) rather than purely linear extrapolations?

image

Some ideas to consider:

  1. Clamp Out-of-Range Values: Implement quick min() and max() constraints for each biomarker so extreme values won’t skew results. For example, cap albumin at 5.0 g/dL and glucose at 250 mg/dL to prevent nonsensical outputs.
  2. Add Simple Penalties for Out-of-Bounds Values: If a biomarker is below or above a known physiologically healthy range, add a penalty to push the result toward typical U-shaped mortality curves. This can be a single conditional block per biomarker.
  3. Use a Two-Point Slope Adjustment: For clearly U-shaped markers, define two slopes: one for the “low range” and one for the “high range.” This is still a quick linear approach but mimics a U-shape without a full-blown polynomial or spline.
  4. Piecewise Functions or Non-Linear Models: Implement piecewise functions or spline-based approaches to model truly U-shaped biomarker relationships.
  5. Physiological Constraints: Set upper and lower limits based on best-known population studies, ensuring that values beyond these bounds do not produce unrealistic results.

Let me know your thoughts and any other potential strategies!

@nopara73
Copy link
Owner Author

I'm stuck on this issue. No solution really seems to be worth it.

  1. If I do quick and dirty with a clean cutoff to correct for obvious problems at the end, it's very subjective without a proper research what score people should get. How fast am I worsening it? And it barely even solves the issue, just handles things that won't really happen.
  2. A fairly correct result could be if I try to be more sophisticated and let's say I cut it off at the best possible value, the same subjectivity issue arises, but much worse because now people are expected to fall into these scores so it'd have real world consequences.

I guess sticking with the pheno age model, albeit it being flawed, might be the least bad solution?

@nopara73
Copy link
Owner Author

nopara73 commented Feb 3, 2025

I'm gonna stop the improvement of the results at the best possible physiological values. Here I'm attempting to figure out what those should be. A quick and dirty AI questionnaire resulted in the following table:

Model Albumin (g/L) Creatinine (µmol/L) Glucose (mmol/L) C-Reactive Protein (mg/L) Lymphocytes (%) Mean Corpuscular Volume (fL) Red Cell Distribution Width (%) Alkaline Phosphatase (U/L) White Blood Cell Count (1000 cells/μL)
4o 45.0 80 4.8 0.0 40 90 12 70 6.50
o1 40.0 80 5.0 1.0 30 90 13 80 7.00
o3-mini-high 40.0 80 5.0 1.0 30 90 13 80 7.00
deepseek 40.0 80 5.0 3.0 30 90 12 70 7.00
claude 42.5 90 5.0 2.5 30 90 13 75 7.75

At this time o1 and o3-mini-high are considered to be the most advanced models. Coincidentally they are even in perfect agreement regarding the results, which is convenient, so I'll take their numbers as caps.

@nopara73
Copy link
Owner Author

nopara73 commented Feb 3, 2025

Or maybe I should go with reference ranges instead of best possible values? The reference ranges are less contentious than ideal values are. Although that'd have less optimal results, yet they are less debatable and stays more on the safe side.

@nopara73
Copy link
Owner Author

nopara73 commented Feb 3, 2025

Or maybe I can have the best of both wordls: I can go with ideal ranges instead of typical reference ranges?

@nopara73
Copy link
Owner Author

nopara73 commented Feb 3, 2025

Ok, this is what's happening.

For age and crp there are no known lower caps, so not capping them.

For the rest based on o1 and o3 again, falling on the safer side when they disagree:

Albumin: Upper cap: 50 g/L
Creatinine: Lower cap: 60 µmol/L
Glucose: Lower cap: 4.0 mmol/L
White Blood Cell Count (WBC): Lower cap: 4.5 × 1000 cells/µL
Lymphocytes: Upper cap: 40 %
Mean Corpuscular Volume (MCV): Lower cap: 85 fL
Red Cell Distribution Width (RDW): Lower cap: 11.5 %
Alkaline Phosphatase (AP): Lower cap: 50 U/L

@nopara73
Copy link
Owner Author

nopara73 commented Feb 3, 2025

97dbdf8

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant