NSBA Draft Analyticsembargoed · 2026-06-06

41_scibowl_difficulty_anchor.md

41 — scibowl.live Difficulty Anchor (transferable priors for the joint model)

41 — scibowl.live Difficulty Anchor (transferable priors for the joint model)

Goal. Fit subject/question difficulty on the LARGE external scibowl.live corpus (13,632 buzzes; 8,426 tossup buzzes; 366 players; 420 distinct tossup questions; 100% reconciled to recorded game scores — see F1) and export it as transferable priors a joint NSBA model can consume. The combine IRT (combine_ability.py) fits difficulty separately each season on tiny NSBA samples (24 items, ~50–90 players); difficulty is the hardest-to-estimate layer. This anchor lets the joint model borrow strength from a ~50–100× larger sample for the 5 shared subjects.


Scale / parameterization (what the next agent consumes)

All latent quantities are on a girth IRT logit scale fit under a N(0,1) ability prior — the SAME convention as combine_ability.py theta — so difficulty/discrim priors are on a compatible scale even though the OUTCOME WORLD differs (see caveats).

scibowl_difficulty_priors.csv (one row per scibowl subject + a CS sentinel):

column meaning
subject_difficulty_prior PRIMARY. Relative per-subject difficulty, logit(1−conversion) of the question-INSTANCE conversion (the finding-20/F1 metric), centered to mean 0 over the 5 shared NSBA subjects (higher = harder). Units: logits. Use as an informative prior MEAN for the subject difficulty offset.
subject_difficulty_prior_sd Cross-subject spread of those logits (0.177) — a conservative prior SD.
subject_discrim_prior GRM discrimination of the per-subject best-buzz ordinal (N(0,1) EAP). Prior mean for the subject slope.
q_difficulty_{mean,sd,p25,p50,p75} Distribution of per-QUESTION 2PL difficulty b, centered to grand-mean 0 over all usable questions (logits). Use within-subject mean/sd as a hierarchical prior for NSBA question difficulty in that subject.
q_discrim_mean Mean 2PL discrimination of questions in the subject.
raw_conversion, avg_celerity Raw question-instance conversion (lower=harder) and mean correct-buzz celerity (sanity columns).
has_external_anchor 1 for the 6 scibowl subjects; 0 for the COMPUTER_SCIENCE sentinel row (empty priors).

Subject & question difficulties are RELATIVE (centered) — transfer the ordering and spread, not an absolute zero.

scibowl_player_subject_ability.csv (366 players): canonical_id, match_method, player_name, team_name, tournament, theta_overall, se_overall, theta_{bio,chem,phys, math,ess,energy}. theta_overall/se_overall are the GRM EAP posterior mean/SD (N(0,1) scale). Per-subject thetas are standardized best-buzz ordinals (5-level resolution) — a cross-validation seed, not a precise per-subject IRT score.


Claims / evidence / confidence

C1 — Subject difficulty ordering on the shared 5 (PRIMARY)

Claim. On the shared 5 NSBA subjects, hardest→easiest is Earth/Space ≫ Biology > Physics ≈ Math ≈ Chemistry. Energy (no NSBA map) is the easiest of the 6. Evidence. Two independent methods agree:

subject nsba difficulty_prior (logit) q_difficulty_mean (2PL) raw_conversion discrim
Earth/Space ess +0.317 +0.334 0.764 (hardest) 0.99
Biology bio +0.071 −0.159 0.806 0.95
Physics phys −0.100 −0.064 0.831 1.60
Math math −0.129 +0.077 0.835 0.88
Chemistry chem −0.159 −0.183 0.839 1.23
Energy (none) −0.251 −0.150 0.851 (easiest) 1.45

corr(subject_difficulty_prior, q_difficulty_mean) = +0.74; Earth/Space is the clear hardest in BOTH. Confidence: high for ESS-hardest and the broad ordering; medium for the tight Physics/Math/Chemistry cluster (within ~0.06 logits — effectively a tie).

C2 — scibowl difficulty ordering DISAGREES with NSBA finding 20 on the shared 5

Claim. Finding 20 (NSBA games) found Bio easiest, then ess/phys/chem/math, CS hardest. On the shared 5, scibowl finds Earth/Space the HARDEST and Bio second- hardest — close to the reverse for those two. Evidence. F20 nsba3 subject conversions: bio 0.921 (easiest), ess 0.844, phys 0.833, chem 0.803, math 0.794. scibowl: ess 0.764 (hardest), bio 0.806, phys 0.831, math 0.835, chem 0.839. Chemistry/Math flip from "harder" (NSBA) to "easier" (scibowl); Earth/Space flips from mid to hardest. Why. Different question writers (NSBA packet-submission vs real Science Bowl tournaments), a much stronger/deeper scibowl field, and — load-bearing — F20 itself warns subject conversion is not stable across contexts (NSBA Bio swung 0.79→0.92 across seasons). The priors should be used as a soft Bayesian prior the NSBA data can override, NOT a hard constraint. Confidence: high that the orderings differ; medium on the causal attribution.

C3 — Celerity tracks ability (sanity vs F1)

Claim. Higher-ability players buzz earlier; harder subjects do NOT mean slower buzzing. Evidence. corr(theta_overall, avg_celerity) = +0.41, corr(theta_overall, tu_conv%) = +0.29 (both positive — F1 found team-level corr(win_pct, celerity) = +0.78). NOTE a deliberate non-result: subject difficulty and subject celerity are POSITIVELY correlated (+0.85) — the hardest subject (Earth/Space) is buzzed EARLIEST. This is exactly why the celerity-tiered GRM threshold was rejected as the difficulty signal (it conflates speed with difficulty); the conversion-logit prior is speed-independent. Confidence: high.

C4 — Question-level difficulty IS recoverable (unlike NSBA games)

Claim. Per-(player, question) difficulty is estimable here; 373 of 406 tossup questions are usable in a 2PL. Evidence. Each logical tossup is replayed across many games (median 8, mean 15.7) with ~20 distinct buzzers, so a [player × question] binary matrix exists. Exposure = a player appeared in a game where the question was played; correct=1 iff they had a correct buzz on it. girth.twopl_mml_eap fit cleanly (kept questions with ≥10 exposed players and both classes). Confidence: high for the ordering; see W3 for the level caveat.

C5 — 24 scibowl players reconcile to NSBA canonical_ids

Claim. 24 scibowl players map to NSBA canonical_id (extra cross-val observations). All via the authoritative canonical_players bridge (the 23 nsba_name_guess matches are a subset). Evidence. 24 source='scibowl' rows in canonical_players.csv share a canonical_id with a non-scibowl source (match_method='real_name'). Sanity: their mean theta_overall = +1.12 vs field +0.02 — NSBA draftees who also play real Science Bowl are elite in the scibowl field, as expected. Top reconciled: Anurag Sodhi (P0093), Ryan Karim (P0505), Ishaan Kabra (P0283), Kian Dhawan (P0346). Confidence: high.


Limitations / caveats (load-bearing)

Reproduce

/home/david/code/nsba/.venv/bin/python scripts/A41_scibowl_anchor.py

Writes the two CSVs and prints the subject + per-question difficulty tables and the reconciliation count.


NSBA Draft Analytics · embargoed until after the SSB draft · ← hub