File size: 8,716 Bytes
45a04b8 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 | ---
license: mit
library_name: numpy
tags:
- biology
- proteins
- protein-engineering
- deep-mutational-scanning
- variant-effect-prediction
- proteingym
- ridge-regression
datasets:
- engAbdullahHanif/mutascope-proteingym-v1.3
---
# MutaScope ridge `seq_struct`: per-assay mutation-effect models for ProteinGym v1.3
One ridge regression per deep mutational scanning (DMS) assay, trained on that assay's measured
single substitutions, that predicts the effect of **every** single amino-acid substitution of the
protein (all 19 × L), with 80% and 90% prediction intervals. These are the supervised models
behind [MutaScope](https://github.com/EngAbdullahHanif/mutascope); the predicted landscapes are
in the dataset
[engAbdullahHanif/mutascope-proteingym-v1.3](https://huggingface.co/datasets/engAbdullahHanif/mutascope-proteingym-v1.3)
(configs `supervised_landscapes` and `supervised_landscape_assays`).
Predictions are **functional effects in laboratory DMS assays** (growth, binding, stability,
activity, expression), on each assay's own scale. They are **not clinical pathogenicity
predictions and must not be used for clinical or diagnostic decisions.**
## Model
- **Type:** ridge regression, one per assay, 198 assays. The same model and features everywhere;
nothing is selected per assay.
- **Features (`seq_struct`, 2,647 columns per variant):** wild-type and mutant one-hot (40),
BLOSUM62 (1), relative position (1); ESM-2 650M masked-marginal score (1), its 20
log-probabilities at the position and its 1,280-dimensional embedding of the residue; the same
three blocks from SaProt 650M (AF2 structure tokens); pLDDT, relative SASA and contact count
from the AlphaFold2 structure (3). The zero-shot models are pinned by revision in the configs.
- **Penalty:** chosen by cross-validation inside the assay's measured variants, over
ProteinGym's folds. Each assay has **two fits**: `random` (penalty chosen on random folds) and
`contiguous` (on contiguous position blocks). The `random` fit predicts variants at positions
that have measurements, the `contiguous` fit variants at positions with none: each is tuned for
the task it does.
- **Files:** `model/fits.parquet` (per assay and fit: `alpha`, `intercept`, `target_mean`,
`target_sd`, `n_train`), `model/coefficients.parquet` (per assay, fit and feature:
`coefficient` and `impute`), `model/manifest.parquet` (every ProteinGym assay: eligible or
why not), `model/version.json`, `config/` (the configs as committed and resolved), `results/`
(the evaluation tables).
A prediction is `intercept + Σ coefficient × feature`, in `DMS_score` units, on raw feature values
(a missing structure feature takes its `impute` value):
```python
import pandas as pd
fits = pd.read_parquet("model/fits.parquet").set_index(["assay_id", "fit"])
coef = pd.read_parquet("model/coefficients.parquet")
rows = coef[(coef.assay_id == assay_id) & (coef.fit == "contiguous")]
x = features[rows.feature].fillna(dict(zip(rows.feature, rows.impute))) # one row per variant
prediction = (
fits.loc[(assay_id, "contiguous"), "intercept"] + x.to_numpy() @ rows.coefficient.to_numpy()
)
```
The features come from MutaScope's feature store (`mutascope features build`); the landscapes in
the dataset already hold every prediction and interval.
## Eligibility
A supervised landscape exists for an assay with **a structure and at least 300 measured single
mutants**: 198 of ProteinGym's 217 assays. The rule was set before the final run, from the ridge
and LightGBM results: below 300 variants supervised models lose to zero-shot SaProt on unseen
positions (ridge − SaProt −0.20 under the contiguous split at ≤ 200 variants, ADR 0023). For the other 19
the manifest gives the reason and the model MutaScope shows instead:
| Reason | Assays | Shown instead |
|---|---:|---|
| No structure (AF2 model does not match the target; ProteinGym data issue) | 4 | ESM-2 650M zero-shot |
| Fewer than 300 measured variants (33 to 298) | 15 | SaProt 650M zero-shot |
## Training data
ProteinGym v1.3 single-substitution DMS assays (Notin et al., NeurIPS 2023), processed and
validated as the dataset above: 663,263 measured variants across the 198 eligible assays (326 to
16,897 per assay). Targets are each assay's `DMS_score`, standardised within the assay (higher =
fitter).
## Evaluation
Under ProteinGym's supervised protocol: per assay, 5-fold cross-validation with ProteinGym's
`random`, `modulo` and `contiguous` fold assignments; Spearman over the pooled out-of-fold
predictions; aggregated per UniProt ID, then per function type, then overall. Brackets: 95%
bootstrap CI over assays. **Paired** differences resample the same assays for both models.
| Split | Assays | Ridge `seq_struct` | − zero-shot SaProt 650M, paired |
|---|---:|---:|---:|
| random (positions seen in training) | 213 | 0.721 [0.705, 0.741] | +0.263 [+0.239, +0.286] |
| modulo (every 5th position held out) | 213 | 0.593 [0.571, 0.617] | +0.135 [+0.109, +0.156] |
| contiguous (blocks of positions held out) | 213 | 0.553 [0.528, 0.581] | +0.092 [+0.065, +0.115] |
Most of a landscape is positions with no measurement, which the modulo and contiguous splits
test; the random split only describes positions with measurements. Ridge was chosen as the
deployed model on those two splits: LightGBM and an MLP fit seen positions better (+0.013 to
+0.026 under random) but extrapolate no better (LightGBM-PCA −0.011 / −0.020, MLP-MSE +0.001 /
−0.011 under modulo / contiguous, paired, ADRs 0022–0023).
By function type (contiguous split, ridge − SaProt, paired): stability +0.162, organismal
fitness +0.126, activity +0.090, expression +0.071, binding +0.010 [−0.106, +0.121] (13 assays;
not distinguishable from zero).
## Prediction intervals
Constant-width **CV+** intervals (Barber et al., 2021) at 80% and 90%, calibrated on the folds that
match the prediction: random folds for a variant at a position with measurements, contiguous
folds for a variant at a position without. Coverage was measured on held-out test folds before
deployment (ridge `seq_struct`, 213 assays, mean over assays):
| Situation | Calibration | 80% | 90% | Assays > 10 points below 90% |
|---|---|---:|---:|---:|
| Seen positions (random split) | random folds | 0.818 | 0.911 | 0 |
| Unseen positions (contiguous split) | contiguous folds | 0.815 | 0.908 | 0 |
| Unseen positions, *if calibrated on random folds* | random folds | 0.673 | 0.806 | 86 |
The last row is why calibration follows the position. Honest intervals at unmeasured positions
are wide: median 90% width 2.70 assay standard deviations (1.91 at positions with measurements).
For a **measured** variant the landscape shows its **out-of-fold** prediction (from the fold
model that never saw it), never the final model's in-sample fit, and an interval built from the
other variants' out-of-fold residuals.
## Limitations
- **Not for clinical use.** DMS assays measure a laboratory phenotype in a chosen system; a
substitution's assay score is not a statement about disease.
- **One assay, one model.** Scores are on each assay's own scale and are not comparable across
assays, or across assays of the same protein.
- **Extrapolation is the hard case.** At positions far from any measurement, accuracy is near the
contiguous-split value (aggregate Spearman 0.553) and the intervals are wide.
- **Small and binding assays.** Below 300 variants no supervised landscape is made; for binding
assays the gain over zero-shot on unseen positions is not distinguishable from zero.
- **Structures are AlphaFold2 predictions.** For two targets most residues lie outside the
modelled structure (`A0A140D2T1_ZIKV_Sourisseau_2019`: 55,461 of 65,037 landscape variants;
`POLG_HCVJF_Qi_2014`: 52,991 of 57,627). There the structure features are imputed with their
measured mean (flag `structure_imputed`) and predictions rely on the sequence and SaProt
features.
- **Selection of proteins.** ProteinGym reflects which proteins DMS studies chose; 64 of 66
stability assays come from one study of small domains.
- **Coverage is an average.** CV+ intervals hold their level on average over variants, not for
every variant or position.
## Version
`model/version.json` and every landscape row carry the git commit of the code, the sha256 of the
resolved config and the sha256 of MutaScope's `data/manifest.yaml` (which pins every input
file's checksum).
## Citation
ProteinGym (Notin et al., 2023), ESM-2 (Lin et al., *Science* 2023), SaProt (Su et al., ICLR
2024), Foldseek (van Kempen et al., *Nat. Biotechnol.* 2024), CV+ (Barber, Candès, Ramdas &
Tibshirani, *Ann. Statist.* 2021). Licence: MIT.
|