Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

1 Commit
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

reversible-layer-aging

Does partial/transient epigenetic reprogramming move the causal-damage methylation layer (DamAge) or the adaptive layer (AdaptAge) toward youth?

Short answer, on two independent human EPIC datasets: the causal-damage layer (DamAge) reverts youthward; the adaptive layer (AdaptAge) does not. The two layers dissociate, and the dissociation replicates across two labs and two reprogramming chemistries.

This repository lets you verify that claim from public data in a few minutes. It contains the full analysis code, the CpG lists used, the result JSONs, two summary figures, and exact reproduction steps. It is a small, honest, single-question re-analysis built on top of Ying et al.'s DamAge/AdaptAge clocks — not a new clock and not a large-magnitude claim.

Built by Macheng Shen (independent researcher) + an AI system. Released for scrutiny.


The question, precisely

Ying et al. (Causality-enriched epigenetic age uncouples damage and adaptation, Nature Aging 2024) split age-associated CpGs into a causal-damage set (DamAge, 1090 CpGs, methylation changes that causally drive adverse aging outcomes) and an adaptive set (AdaptAge, 1000 CpGs, protective/adaptive changes). Each CpG carries a signed coefficient whose sign encodes the aged direction.

A natural mechanistic fork:

  • Damage-primacy would predict the causal-damage layer is the stubborn one — hard to reverse — and that interventions mostly move downstream/adaptive marks.
  • Reversible-regulatory would predict the causal-damage layer is at least partially reversible by an identity-preserving intervention.

Partial / transient reprogramming (OSK(M)-type factors applied transiently, without erasing somatic cell identity) is the cleanest available "rejuvenation-ish" perturbation of aged human cells. So we ask: under partial reprogramming, which layer moves toward youth?

"Youthward", defined operationally

For each clock CpG with independent Ying coefficient c:

Δβ        = β(treated/reprogrammed)  −  β(aged baseline)      # per CpG, per matched pair
youthward = sign(Δβ) opposite to sign(c)                      # i.e. moving against the aged direction
signed youthward value = −sign(c) · Δβ                        # >0 means toward youth

Set-level statistic = grand mean signed-youthward Δβ over the CpG set (and the % of CpG×pair cells that are youthward). The CpG signs come from biolearn (independent of these datasets), so the test is non-circular.


Datasets (referenced by accession — no raw data committed)

Dataset Lab Reprogramming chemistry Platform Design used here
GSE165180 Gill & Reik Sendai-virus MPTR (maturation-phase transient reprogramming) Illumina EPIC 25 matched pairs (donor × timepoint × experiment × cell-kind), negative-control vs transiently-reprogrammed
GSE142439 Sarkar / Sebastiano / Conboy mRNA OSKMLN transient transfection Illumina EPIC 8 within-person matched pairs (Normal vs Treated): 4 skin fibroblast + 4 vein endothelial

GSE142439 is the independent replication: different lab, different cells, and a completely different reprogramming chemistry (mRNA OSKMLN vs Sendai MPTR). Same EPIC array family, so DamAge/AdaptAge cg IDs map directly with no platform liftover.

Both are in-vitro partial/transient reprogramming of aged human cells. This study makes no in-vivo claim.

CpG-list provenance

YingDamAge.csv (1090 CpGs) and YingAdaptAge.csv (1000 CpGs) are the DamAge / AdaptAge coefficient tables from the open-source biolearn library (Ying et al., Nature Aging 2024). Columns: CpGmarker, CoefficientTraining. These are the independent clock weights — they were not fit on GSE165180 or GSE142439 — which is what makes the youthward test non-circular.


Results

Headline

On both datasets, under a within-pair sign-flip (Fisher) permutation null (5,000 permutations, respecting the matched-pair design):

Set GSE165180 (Sendai MPTR) GSE142439 (mRNA OSKMLN)
matched pairs 25 8
DamAge signed Δβ +0.0077 +0.0023
DamAge pairs youthward 22/25 8/8
DamAge paired-t +6.17 +3.42
DamAge perm p (1-sided youthward) 0.0002 0.0044
AdaptAge signed Δβ −0.0058 −0.0021
AdaptAge pairs youthward low 0/8
AdaptAge perm p (youthward) 0.999 (not youthward) 1.000 (not youthward)
dissociation DamAge reverts, AdaptAge doesn't same

Random-sign background null sits at ~50% youthward / signed ≈ 0, as expected (the honest non-circular baseline).

Signed youthward Δβ, DamAge vs AdaptAge, both datasets

Fig 1. Mean signed youthward Δβ (error bars = 95% CpG-bootstrap CI). DamAge (red) is positive — toward youth — on both datasets and clears the ~0 random-sign null; AdaptAge (blue) is negative on both (moves the aged direction). One-sided permutation p-values annotated.

Per-pair robustness

Fig 2. The DamAge youthward shift is positive in (nearly) every matched pair — 22/25 in GSE165180 (all three donors positive) and 8/8 in GSE142439 (both cell types, all persons positive). Leave-one-subject-out stays youthward in every drop. Not driven by a single subject.

Contrast with full reprogramming (sanity check, GSE54848)

A full fibroblast→iPSC reprogramming sanity check shows the opposite dissociation (AdaptAge moves, DamAge does not). Full reprogramming erases somatic identity and imposes the pluripotent methylome; partial/transient reprogramming preserves identity and is the regime that moves the causal-damage layer youthward. (Sanity-check numbers are summarized in results/; the full-reprogramming IDATs are not re-analyzed in the runnable pipeline here.)


Claim typing + honest caveats

Claim (supported, confidence MODERATE → MODERATE-HIGH, 2 datasets): Under partial/transient epigenetic reprogramming of aged human cells, the causal-damage CpG layer (DamAge) shifts youthward beyond a donor-respecting null, while the adaptive layer (AdaptAge) does not. This is consistent with a reversible-regulatory reading of aging's causal-damage signature and is evidence against strict damage-primacy — in this regime.

Caveats (all real, not inflating):

  1. Effect is small in absolute β (signed ≈ +0.002 to +0.008). "Reverts" means a coherent, every-pair-agreeing direction beating a tight within-subject null, not large-magnitude erasure of the damage methylome. Do not oversell.
  2. Both datasets are in-vitro partial/transient reprogramming. This says nothing yet about in-vivo aging reversal or clinical interventions.
  3. Direction + dissociation replicate; magnitude differs (~+0.008 MPTR vs ~+0.002 mRNA — the mRNA-transient protocol is milder/shorter, so a smaller magnitude is expected). The replicated object is the direction and the dissociation, not a magnitude.
  4. Shared methodology across both datasets (same methylprep settings, same Ying lists, same null) — good for comparability, but a fully orthogonal re-analysis (different clock CpG set / different preprocessing) would harden it further.
  5. Same array family (EPIC) both times. A 450K-only replication would test platform-independence.
  6. n is modest (25 and 8 pairs). The within-subject paired design and unanimity are the strength, not the sample size.
  7. GSE165180 donors are middle-aged (38 & 53 y); the within-study "young" anchor is imperfect, so the primary result rests on the non-circular old→reprog axis with independent Ying signs, not on a young anchor.

Reproduce it

0. Environment

python3.9 -m venv venv && source venv/bin/activate
pip install -r requirements.txt

Pure Python, no R/Bioconductor. methylprep 1.7.1 does sesame-style NOOB + dye-bias + pOOBAH preprocessing. pandas/numpy are pinned (methylprep uses DataFrame.append, removed in pandas 2.x).

1. Fast path — re-verify the statistics from committed results (seconds)

The result JSONs and CpG lists are in the repo, so you can re-draw the figures and inspect every number without downloading any methylation data:

python scripts/make_figures.py          # regenerates figures/fig1_*.png, figures/fig2_*.png
cat results/donor_paired_perm_result_gse165180.json   # GSE165180 permutation result
cat results/result_gse142439.json                     # GSE142439 replication result

2. Full path — recompute beta matrices from public IDATs and re-run the test

Raw data are not committed (per .gitignore); pull them from GEO by accession.

GSE165180 (SuperSeries; methylation lives in SubSeries GSE165178/GSE165179):

# download GSE165180_RAW.tar from GEO (EPIC IDATs), extract into ./idat/
python scripts/01_run_methylprep.py ./idat work/betas_gse165180.pkl
# (sample sheet already provided at results/sample_sheet_gse165180.csv;
#  scripts/02_build_sample_sheet_gse165180.py shows how it was derived from GEO SOFT metadata)

# group-mean view (the original 57% / +0.0094 numbers):
python scripts/03_group_mean_analysis_gse165180.py \
    --betas work/betas_gse165180.pkl --sheet results/sample_sheet_gse165180.csv \
    --damage YingDamAge.csv --adapt YingAdaptAge.csv \
    --out results/group_mean_result_gse165180.json

# the rigorous donor-paired permutation test (the headline p-values):
python scripts/04_donor_paired_perm_gse165180.py

GSE142439 (replication):

# download the 16 EPIC IDAT pairs (GSM4227385-4227400) from GEO into ./work-142439/idat/
BETAS=work/betas_gse142439.pkl python scripts/01_run_methylprep.py ./work-142439/idat work/betas_gse142439.pkl
BETAS=work/betas_gse142439.pkl python scripts/05_replication_gse142439.py

Expected (matches the committed JSONs): DamAge youthward, GSE165180 p≈0.0002 / GSE142439 p≈0.0044; AdaptAge not youthward on either. All scripts honor BETAS / SHEET / DAM / ADP / OUT / NPERM / SEED env vars.

Download note: the GEO RAW.tar CGI can truncate behind some HTTP proxies and does not support byte-range resume; pulling the per-sample IDATs individually from ftp.ncbi.nlm.nih.gov (range-resumable) is the reliable fallback. If methylprep sees both .idat and .idat.gz copies it will create phantom duplicate-label rows — keep only one copy per sample.


Repository layout

scripts/
  01_run_methylprep.py                  IDATs -> beta matrix (methylprep, sesame defaults)
  02_build_sample_sheet_gse165180.py    GEO SOFT metadata -> sample sheet / groups
  03_group_mean_analysis_gse165180.py   group-mean youthward analysis (+ random-sign background)
  04_donor_paired_perm_gse165180.py     donor-paired sign-flip permutation test (headline)
  05_replication_gse142439.py           identical pipeline on the GSE142439 replication
  make_figures.py                       figures from the committed result JSONs
results/
  donor_paired_perm_result_gse165180.json
  group_mean_result_gse165180.json
  result_gse142439.json
  sample_sheet_gse165180.csv            (public GEO-derived sample metadata)
  sample_sheet_gse142439.csv
figures/
  fig1_signed_dbeta.png
  fig2_per_pair_robustness.png
YingDamAge.csv  YingAdaptAge.csv         DamAge/AdaptAge CpG coefficients (from biolearn)
requirements.txt  LICENSE  .gitignore

Citations

  • Ying, K. et al. Causality-enriched epigenetic age uncouples damage and adaptation. Nature Aging (2024). (DamAge / AdaptAge / CausAge; biolearn.)
  • Gill, D. et al. (Reik lab). Multi-omic rejuvenation of human cells by maturation phase transient reprogramming — GSE165180.
  • Sarkar, T.J. et al. (Sebastiano / Conboy labs). Transient non-integrative expression of nuclear reprogramming factors promotes multifaceted amelioration of aging in human cells. Nature Communications (2020) — GSE142439.
  • biolearn: open-source library for biomarkers of aging.

About

Reproducible re-analysis on two human EPIC datasets asking whether partial epigenetic reprogramming reverts the causal-damage (DamAge) or the adaptive (AdaptAge) methylation layer — the two layers dissociate, and the dissociation replicates.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages