Communitygithub.com

gangchen/epiage-skill

Berechnet 24 epigenetische 'Aging Clocks' (GrimAge V1/V2, Horvath, Hannum, PhenoAge, Ying, DunedinPoAm, DNAmTL…) – offline, als installierbare Agent-Fertigkeit, mit nur pandas+numpy.

Was ist epiage-skill?

Diese Fertigkeit führt eine vollständige epigenetische Altersbestimmung (DNA-Methylierungs-basierte 'Aging Clocks') allein aus einer Beta-Wert-Datei durch. Sie enthält den gesamten Code, alle Koeffizienten und Referenzen (ca. 1 MB) und benötigt nur `pandas` und `numpy` – keine Installation von Biolearn, Torch, Seaborn, Scipy oder Netzwerkzugriff. Die Implementierung wurde gegen die Ergebnisse der Biolearn-Bibliothek verifiziert (Abweichung < 0,005). Insgesamt werden 25 Uhren unterstützt, darunter GrimAge V1/V2, Horvath, Hannum, PhenoAge, DunedinPoAm, DNAmTL und viele weitere. Die Fertigkeit erkennt automatisch das Format der Eingabedatei (Lang-/Matrix-Layout), berechnet für jede Uhr den Wert, die Beschleunigung (Abweichung vom chronologischen Alter) und die Coverage und gibt die Ergebnisse als Tabelle und als JSON aus. Sie ist für die Ausführung auf menschlichem Vollblut optimiert und nutzt zur Imputation fehlender CpGs das leistungsfähigere methyLImp-Verfahren, das im Repository bereits enthalten ist. Die Fertigkeit eignet sich für Forschungszwecke und Bildungskontexte, ist jedoch kein zertifizierter Rechner und stellt keine medizinische Beratung dar.

Funktioniert mit~Claude Code~Codex CLI~Cursor
npx skills add gangchen/epiage-skill

In Ihrer bevorzugten KI fragen

Öffnet einen neuen Chat, in dem dieser Agent-Skill bereits geladen ist.

Dokumentation

Epigenetic Clock Calculator

Berechnet DNA-Methylierungs-basierte 'Aging Clocks' aus einer Beta-Wert-Datei. 25 Uhren stehen zur Verfügung; GrimAge ist die wichtigste.

In sich geschlossen. Benötigt nur pandas + numpy – kein biolearn, torch, seaborn, scipy oder network. Die Koeffizienten und Referenzen der Uhren sind in data/ enthalten (aus der Open-Source-Bibliothek biolearn extrahiert und auf die von den Uhren verwendeten CpGs reduziert, insgesamt ~1 MB). scripts/compute_clocks.py implementiert biolearns GrimageModel, LinearMethylationModel und die Quantilnormalisierung von DunedinPACE (mit einer numpy-only rankdata) originalgetreu nach und reproduziert biolearns Ergebnisse für alle 25 Uhren (auf <0,005 verifiziert, d. h. nur Rundungsfehler).

Die Uhren (führen Sie --list-clocks für die aktuelle Liste aus)

FamilieUhrenEinheit
GrimAge (2. Generation, Mortalität)grimagev1, grimagev2Jahre (benötigt Alter+Geschlecht)
1. Generation (chronologisch)horvath, horvath2, hannum, lin, vidalbralo, weidner, garagnani, bocklandtJahre
2. Generation (biologisches Alter)phenoage, hrsinchphenoageJahre
Ying 2022 (Kausalität)yingcausage, yingdamage, yingadaptageJahre
stochastischestoch, stocp, stoczJahre
gewebespezifischepedbe (pädiatrisch bukkal), cortical (Gehirn)Jahre
3. Generation (Alternsgeschwindigkeit)dunedinpace, dunedinpoamJahre/Jahr
andere Markerdnamtl (Telomerlänge in kb), zhang (Mortalität), epitoc1 (mitotische)variiert

Gruppenaliase für --clocks: all, grimage, core (Standard), firstgen, secondgen, thirdgen.

dunedinpace benötigt ~20.000 Hintergrund-CpGs für die Quantilnormalisierung (nicht nur die 173 Modell-CpGs). Bei einer spärlichen Eingabe imputiert sich die Fertigkeit die fehlenden Hintergrund-CpGs aus der Goldstandard-Referenz selbst; liegt die gemeldete Abdeckung deutlich unter ~90%, wird das Ergebnis von der Referenz dominiert und ist unzuverlässig – dies sollte mitgeteilt werden. Ein vollständiger EPIC/450K-Export deckt dies gut ab.

Wichtige Fakten zu GrimAge (damit Sie es richtig interpretieren)

GrimAge ist eine zweite Generation, mortalitätstrainierte Uhr: Sie schätzt DNAm-Surrogate für 7 Plasmaproteine + Rauch-Packungsjahre (V2 fügt DNAm A1C und CRP hinzu) und kombiniert diese dann mit chronologischem Alter und Geschlecht in einem Überlebensmodell. Alter und Geschlecht fließen direkt in die Formel ein, daher werden beide für jede grimage* Uhr benötigt. Die anderen Uhren benötigen sie nicht, aber die Angabe --age ermöglicht es, die Beschleunigung zu berechnen.

Arbeitsablauf

1. Eingabedatei inspizieren

Automatisch erkannte Formate: Lang (zwei Spalten: CpG-ID + Beta) oder Matrix (erste Spalte CpG-ID, restliche Spalten = Proben). Betas sind Gleitkommazahlen in [0,1]. Notieren Sie die Zeilenanzahl; die Abdeckung der CpGs jeder Uhr wird pro Uhr gemeldet.

2. Alter und Geschlecht ermitteln

Erforderlich für GrimAge. Ist nur eine Altersspanne bekannt, verwenden Sie den Mittelwert und führen Sie --sensitivity aus, damit der Benutzer sieht, wie stark das Ergebnis vom genauen Alter abhängt.

3. Abhängigkeiten prüfen (nur pandas + numpy)

python3 -c "import pandas, numpy" 2>/dev/null && echo OK || pip install pandas numpy

Keine venv, biolearn, torch oder Netzwerk erforderlich.

4. Ausführung

python3 <skill-verzeichnis>/scripts/compute_clocks.py \
  --input "<betas.csv>" --age <jahre> --sex <m|f> \
  --clocks all                 # oder: core (Standard), grimage, firstgen, secondgen oder bestimmte Schlüssel
  # --sensitivity 40 42 47 49  # optional, wenn das genaue Alter unsicher ist
python3 <skill-verzeichnis>/scripts/compute_clocks.py --list-clocks   # alle Schlüssel anzeigen

Das Skript imputiert fehlende Uhr-CpGs aus der mitgelieferten (reduzierten) Bevölkerungsreferenz data/sesame_450k_median.csv, führt jedes Modell aus und gibt eine Tabelle mit Wert, Beschleunigung (für Uhren mit Jahre-Einheit) und Abdeckung sowie eine JSON-Zeile für die weitere Verarbeitung aus.

5. Bericht und Interpretation

Führen Sie mit GrimAge an, dann den Vergleich. Geben Sie immer diese Hinweise:

  • Open-Source-Neuimplementierung, nicht der offizielle Rechner. Die Werte ähneln denen von Horvaths offiziellem Server / Clock Foundation, sind aber keine zertifizierte Zahl. Für einen zitierfähigen Wert verweisen Sie auf den Horvath DNAm Age Calculator oder einen kommerziellen Anbieter.
  • „Beschleunigung“ hier = Uhrwert − chronologisches Alter, eine einfache Differenz. Der akademische AgeAccel (Residuum vs. eine gleichaltrige Kohorte) benötigt eine Bevölkerungsstichprobe und kann für eine einzelne Person nicht berechnet werden – +8 bedeutet also „epigenetisch vorhergesagtes Alter ist 8 Jahre über dem chronologischen Alter“, nicht „8 Jahre älter als Gleichaltrige“.
  • Generationen unterscheiden sich. 1. Generation (Horvath/Hannum/Lin/…) zielen auf das chronologische Alter ab und liegen meist nahe am wahren Alter. 2. Generation (GrimAge/PhenoAge) zielen auf Gesundheitsergebnisse ab und sagen Mortalität/Altern besser voraus – sie können durch ihr Design vom wahren Alter abweichen. Interpretieren Sie GrimAge nicht als „sieht N Jahre alt aus“; es ist ein Risikoscore in Jahren.
  • Nicht-Jahresuhren (dunedinpoam Geschwindigkeit, dnamtl Telomerlänge in kb, zhang/stocz Mortalitätsrisiko, epitoc1 mitotisch) sind keine Altersangaben – es wird keine Beschleunigung angezeigt.
  • Abdeckung / Imputation: Einige fehlende Uhr-CpGs, die aus einem Bevölkerungsmedian aufgefüllt werden, sind normal; kennzeichnen Sie Uhren, deren Abdeckung unter ~90% fällt. Die Spalte n_lowconf in der Ausgabe zählt imputierte CpGs, deren Blut-Referenz-Standardabweichung > 0,08 beträgt (als unzuverlässige Füllungen zu werten) – ein pro-CpG-Signal, das schärfer ist als die reine Abdeckung. Eine Uhr mit vielen n_lowconf-Füllungen ist bei dieser Probe unzuverlässig, selbst wenn sie „gelaufen“ ist.
  • Nur für Blut ausgelegt. Diese Fertigkeit geht von menschlichem VOLLBLUT aus. Die Uhren sind auf Blut angewandt; die Imputationsreferenz ist Blut. Verwenden Sie sie nicht auf anderen Geweben.
  • Imputation fehlender CpGs – standardmäßig methyLImp. Fehlende Uhr-CpGs (z. B. EPIC-trainierte CpGs, die in einem MSA/WeGene-Export fehlen) werden mit methyLImp imputiert: einer Reduziert-Rang-Regression (PCA), die jedes fehlende CpG aus den beobachteten CpGs der Probe unter Verwendung der Inter-CpG-Korrelationsstruktur eines Vollblut-Panels vorhersagt – genauer als ein flacher Median (~30% niedrigerer RMSE bei passendem Gewebe). CpGs, die dem Panel fehlen, werden auf den Blut-Median zurückgesetzt; n_lowconf (Blut-SD>0,08) kennzeichnet unzuverlässige Füllungen. Der aktive Modus wird zu Beginn der Ausführung ausgegeben.
    • Das Panel befindet sich in data/blood_panel.npz und ist enthalten (~5 MB; vorgebaut aus GSE40279 = 656 Vollblut-450K-Proben, reduziert auf die Uhr-CpGs + 50 Blut-PCs + pro-CpG-Median/SD). Daher ist methyLImp sofort aktiv – es reduziert den Imputations-RMSE um ~10% gegenüber einem flachen Median in einem Benchmark mit zurückgehaltenen CpGs. Zum Neuerstellen/Anpassen führen Sie scripts/build_blood_panel.py aus. Wenn die Datei fehlt, fällt das Tool automatisch auf den globalen Median zurück und meldet dies.
    • Realitätscheck: methyLImp verbessert hauptsächlich die stark imputierten Uhren. Hochdeckende Uhren (GrimAge/Horvath/PhenoAge) imputieren wenige CpGs, daher ändern sich ihre Werte um <0,2 Jahre – das Konfidenz-Flag ist der praktisch größere Gewinn.
  • Keine medizinische Beratung – nur für Forschungs-/Bildungszwecke.

Anmerkungen

  • Matrix-Eingabe → eine Ergebniszeile pro Probe und Uhr.
  • Bewusst ausgeschlossen (können ohne schwerere Methoden nicht originalgetreu reproduziert werden oder sind keine Alterungsuhren):
    • PC-Uhren (PCHorvath…), AltumAge, GPAge – benötigen PCA-Rotation / neuronale Netze.
    • Gestationsuhren (Knight, Lee, Mayne, Bohlin) – für Nabelschnurblut / Neugeborene.
    • Merkmals- und Krankheitsprädiktoren (BMI, Cholesterin, Rauchen, Alkohol, Alzheimer, CVD, …) – dies sind Biomarker-Modelle, keine Alterungsuhren. Wenn ein Benutzer speziell eine dieser Uhren benötigt, teilen Sie ihm mit, dass dafür die vollständige Biolearn-Installation erforderlich ist.
  • Herkunft. Die Koeffizienten stammen aus biolearn (MIT), das die veröffentlichten Uhren neu implementiert. GrimAge unterliegt kommerziellen Nutzungsbeschränkungen (UCLA TDG / Clock Foundation) für Kosmetik- und Lebensversicherungsanwendungen.

Verwandte Skills