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.
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?
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.
| 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.
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.
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).
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.
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.
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 (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):
- 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.
- Both datasets are in-vitro partial/transient reprogramming. This says nothing yet about in-vivo aging reversal or clinical interventions.
- 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.
- 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.
- Same array family (EPIC) both times. A 450K-only replication would test platform-independence.
- n is modest (25 and 8 pairs). The within-subject paired design and unanimity are the strength, not the sample size.
- 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.
python3.9 -m venv venv && source venv/bin/activate
pip install -r requirements.txtPure 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).
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 resultRaw 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.pyGSE142439 (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.pyExpected (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.tarCGI can truncate behind some HTTP proxies and does not support byte-range resume; pulling the per-sample IDATs individually fromftp.ncbi.nlm.nih.gov(range-resumable) is the reliable fallback. If methylprep sees both.idatand.idat.gzcopies it will create phantom duplicate-label rows — keep only one copy per sample.
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
- 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.

