| --- |
| license: apache-2.0 |
| tags: |
| - biology |
| - proteomics |
| - aging |
| - aging-clock |
| - tabular |
| - tabm |
| - distillation |
| - somascan |
| pipeline_tag: tabular-regression |
| --- |
| |
| # SomaScan Inflammation Aging Clock (85 proteins) |
|
|
| A lightweight **plasma-protein aging clock** that predicts chronological age from |
| **85 unique inflammatory proteins measured by SomaScan** (125 aptamers / |
| SomaScan features). The model is a **TabM† student** distilled from a **TabPFN |
| v2** teacher, so it runs at inference **without any TabPFN dependency** (small, |
| DUA-friendly artifacts). |
|
|
| Trained on the **ROSMAP** cohort, panel-matched to the Olink Inflammation |
| companion model. |
|
|
| | Cohort | Platform | Aptamers (features) | Unique proteins | N (persons) | Teacher R² | Student R² | Gap (mean ± sd) | |
| |---|---|---|---|---|---|---|---| |
| | ROSMAP | SomaScan | 125 | 85 | 1,611 (1,313) | 0.304 | 0.302 | 0.002 ± 0.006 | |
|
|
| *(10-fold person-grouped CV, R². Student fidelity-RMSE ≈ 0.070 in scaled-y.)* The |
| TabM† student reproduces its TabPFN v2 teacher to within ~0.002 R² — inside |
| fold-to-fold noise. |
|
|
| > **Note on counts:** SomaScan measures some proteins with more than one aptamer. |
| > The model consumes **125 aptamer-level features** (the `meta.json` → |
| > `feature_name` list), which map to **85 unique proteins**. |
| |
| ## Files |
| |
| ``` |
| predict.py standalone inference script |
| meta.json feature order, y-scaler, arch config |
| models/ |
| T0001_model.pkl slim model (~4 KB) |
| T0001_student_tabm.pt TabM† weights (~8 MB) + quantile bins |
| results/, *_results.csv aggregate CV metrics summaries |
| ``` |
| |
| Target `T0001` = `age_at_visit` (chronological age at the visit). |
| |
| ## Usage |
| |
| `predict.py` runs the model with **only public dependencies**: |
| |
| ```bash |
| pip install torch tabm rtdl_num_embeddings numpy pandas |
| |
| python predict.py --input proteins.csv --output ages.csv |
| ``` |
| |
| `--input` is a CSV/TSV with one row per sample and one column per aptamer feature, |
| named exactly as in `meta.json` → `feature_name` (125 SomaScan features). Column |
| order does not matter; an optional `sample_id` column is carried through. Output |
| is `sample_id, predicted_age`. This model expects complete values (no imputer). |
| The script errors if any required feature is missing and warns about unused |
| input columns. |
| |
| ## Method |
| |
| - **Teacher:** TabPFN v2. |
| - **Student:** TabM† distilled on a GMM-augmented transfer set (target 10,000 |
| rows) with a 5-quantile pinball regression loss. |
| - **CV:** 10-fold person-grouped (verified no person spans >1 fold). |
| |
| ## Inference contract |
| |
| Order the features by `meta.json → feature_name`; rebuild the TabM model with |
| piecewise-linear numeric embeddings and load the weights; average the 5-quantile |
| (trapezoidal-mean) point estimate over the 32 ensemble members; inverse the |
| y-scaler to recover age. |
| |
| ## Citation |
| |
| Inflammatory aging clock for plasma inflammatory proteins (ROSMAP). Manuscript in |
| preparation. See also the Olink companion model: |
| [`inflammatory-aging-clock/olink-inflammation-92`](https://huggingface.co/inflammatory-aging-clock/olink-inflammation-92). |
| |