Spec
| Target | gnomAD (v4.1.1) genetic-constraint binary classification (K=2, unconstrained/constrained): predict whether a gene is loss-of-function `constrained` (`loeuf` < 0.6) for the GENCODE-v49 protein-coding genes with unflagged constraint metrics (~17.5k; ~25% positive). Wired to the sample_classification task — `gene_id` is the pairing key, no feature columns (a zero-width input pointer). Scored with AUROC + AUPRC (the ~25% prevalence is the AUPRC random baseline). Same paralog/family-aware gene partition as the `constraint_loeuf` regression eval. |
|---|---|
| Axis | Fitness & dosage — Essentiality, constraint, and dosage sensitivity. |
| Shape | Binary classification · metric family: auroc |
| Task | sample_classification / sample_classification |
| Dataset | chen_2024_nature/constraint_constrained@0.0.1 |
| Publication | chen_2024_nature |
| Metrics |
|
| Temporal discovery | no — held-out genes |
| License | Declared per SPDX in the dataset's recipe README ↗ (commercial-use gated by CI). |
| References |
|
IO contract
- operating_threshold_column
- operating_threshold
- optional_metadata
- cohort, disease, assay, split, donor_id
- pairing_key
- sample_id
- prediction_format
- (n, K) per-class scores; (n, 1) accepted at K=2
- required_metadata
- sample_id
- target_kind
- multiclass_index
What the prediction looks like
This eval has the binary classification shape. The figure is seeded to it — drag the control to watch the score respond.
Yes or no — and where do you draw the line?
Used by is-TF · constrained (LOEUF<0.6) · ClinGen haplo / triplo
Two populations, one score axis. Moving the threshold trades sensitivity for specificity. When positives are rare (is-TF is ~8%), accuracy misleads and precision gets brutal — so the panel scores threshold-free AUROC plus MCC and balanced accuracy.
Run it
Fetch the censored splits, predict, score — task and dataset filled in.
import prima_bench as pb
# Downloads on demand into the local cache; returns local Paths.
train_path, test_path = pb.fetch_data(task="sample_classification", dataset="chen_2024_nature/constraint_constrained@0.0.1")
train = pb.load(train_path, task="sample_classification", split="train", dataset="chen_2024_nature/constraint_constrained@0.0.1")
test = pb.load(test_path, task="sample_classification", split="test", dataset="chen_2024_nature/constraint_constrained@0.0.1")
# Your model produces predictions aligned to the eval input.
predictions = my_model(test)
# Score against the censored solution over this task's metric panel:
# sample_auroc, sample_sensitivity, sample_specificity, sample_accuracy, sample_f1, sample_mcc, sample_balanced_accuracy, sample_auprc, sample_score_correlation
run = pb.Evaluation(task="sample_classification", dataset="chen_2024_nature/constraint_constrained@0.0.1")
run.update(predictions=predictions) # one-shot; or stream shard-by-shard
result = run.compute() # -> EvalResult
print(result)
Results
Awaiting scored models — the row scaffold is live; numbers land with results.json.
Awaiting results · prima-bench
constraint_constrained · leaderboard
results.json wired up yet. The eval scaffold below is live; drop a document matching src/data/results.schema.md at src/data/results.json (or pass a results prop) and every bar fills in. Each track's tick marks the chance baseline.Sample Classification
1| Eval | Score | awaiting |
|---|---|---|
constraint_constrainedchen_2024_nature/constraint_constrained@0.0.1 | — |