somascan-85 / README.md
stasaking's picture
SomaScan Inflammation aging clock (85 proteins / 125 aptamers, ROSMAP) — TabM student + standalone predict.py
944651d verified
|
Raw
History Blame Contribute Delete
3.13 kB
---
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).