Skip to content

Reading the numbers

The Lab makes it easy to produce a number and easy to misread one. This page is the short list of what to check first.

Which yardstick?

Every score is relative to a truth set, and the truth set can decide the winner. The genome view now labels this on each block; read the label before quoting the number.

Where Scored against Consequence
Classification TP/FP/FN the overlaid meta model's training annotation (Ensembl for M2-S), else the base model's — shown as a vs … tag beside the counts, overridable with the Ground truth selector correct by default
F1-optimal, "this gene" the base model's annotation, canonical only penalises M2-S for working — labelled in the panel
F1-optimal, "held-out" the meta model's eval: Ensembl, all annotated sites canonical sites dominate the average
Alt-sites badge Ensembl ∖ MANE the headline for M2-S

The classification row auto-resolves because the same predictions score wildly differently by yardstick. TARDBP, M2-S at threshold 0.9, identical predictions throughout:

truth base TP/FP/FN meta TP/FP/FN
MANE 9/0/1 10/19/0
Ensembl (auto for M2-S) 9/0/23 29/0/3

Those 19 "false positives" are real annotated splice sites. Scored on the annotation M2-S was trained on, it has none.

Why the delta set is recall, not TP/FP/FN

You cannot compute a false positive against a subset of truth: a call away from the subset may be a perfectly correct canonical call. Scoring the base model on the delta reports 9 "false positives" on TARDBP that are all correct MANE calls. The delta is therefore reported as recall (the alt-sites badge), and Ensembl (all) — which is the delta plus MANE — carries the well-defined TP/FP/FN.

The clearest illustration: on TARDBP the per-gene sweep reports base F1 1.000 and meta 0.833. That is measured on MANE, where every alternative site M2-S correctly finds is scored as an error. A metric that improves when the model stops doing its job is the wrong metric — which is why the published M2-S result uses the delta set (Ensembl ∖ MANE), matching 09_evaluate_alternative_sites.py.

Two consequences worth internalising:

  • A model can only be judged against the annotation its task is defined by.
  • "F1-optimal" without a named truth set is not a claim. It is half a claim.

0.5 is not an operating point

Splice sites are under 0.5% of positions, so a 0.5 cutoff is arbitrary. Base and meta score distributions differ enough that one shared threshold always flatters one of them:

threshold favours
0.5 base — meta's calls look like false positives
0.99 meta — base has started dropping true sites

Neither is "correct". Use the two sliders, or report PR-AUC, which is threshold-free. See Genome View.

Recall on a subset is not TP/FP/FN

The alt-sites badge reads base 0/22 → meta 20/22, deliberately not TP/FP/FN. "False positive" is not well defined against a subset of truth: a call away from an alternative site may be a perfectly correct canonical call. Recall on the delta set is the well-defined quantity.

Per-gene numbers are exploratory

Everything on the genome view is one gene. The F1-optimal sweep is a post-hoc optimum on the data being displayed — a navigation aid for the slider, not a held-out operating point. The citable numbers are the results pages, over thousands of held-out genes.

Not every annotated site is scoreable

Prediction runs over the gene span in the model's annotation. Where another annotation's gene is longer, its extra sites fall outside the window and cannot be detected by anything. TARDBP: 8 of 30. Those are excluded from denominators, with the count shown. A denominator that includes undetectable sites understates every model.

Dead channels

Feature extraction pulls conservation from bigWig files. A network failure used to zero-fill the channel and write the cache anyway, leaving a gene whose features were silently wrong — and the all-zero guard could not catch it, because it pools evidence across genes and one bad gene among healthy ones reads as healthy.

A failed channel query now raises and the gene is skipped rather than cached. If a gene is missing after a build, check the run log for SKIPPED on channel-extraction failure before assuming the data is fine. Caching the bigWigs locally removes the failure entirely — see Getting started.

Quick reference

Symptom Likely cause
Meta shows many FPs threshold too low, and/or scored against MANE — check the alt-sites badge
Base looks perfect threshold suits base; raise it and watch base lose true sites
Alt-site denominator < track count sites outside the scored gene span
An annotation row is empty GENCODE ∖ Ensembl is ~always 0 for coding genes
Gene 404s on the overlay no feature cache — build it with 02_build_showcase_feature_cache.py
Gene 404s on /novel not in the held-out universe (chromosomes ⅓/5/7/9)