Skip to content

12 · Scorecard · Taylor · ROC

Round 4 · Report views · data: real · streamed · reimagines METviewer (the scorecard) + METplotpy (Taylor, ROC)

The three report views the lab was missing, all driven by the shared data funnel (lib/met-data-source.mjs) over the de-identified archive bundle:

  1. Scorecard — model vs reference across variables × leads. Each cell’s ▲/▼ symbol comes from an event-equalized, paired case-level bootstrap: the two models are compared only on their common init cycles, and each replicate resamples cycles in pairs so the CI of the difference respects the pairing. One symbol = the 95% CI excludes zero; doubled = 99%.
  2. Taylor diagram — σf, σo, and r computed entirely from SL1L2 moments (σ = √(FFBAR−FBAR²) etc.), proving the Taylor diagram needs no pair-level data.
  3. ROC curves — MET’s deterministic multi-threshold ROC: one (POFD, POD) point per precip threshold from summed 2×2 counts, AUC by trapezoid. (A PCT-based probabilistic ROC needs probability forecasts, which this archive lacks — stated in-app.)
apps/scorecard/
index.html shell + selectors (obs source, model, reference, threshold, lead, variable)
src/kernel.mjs pure math: pairedDiffCI, buildScorecard, taylorStats, rocFromCTC
src/render.mjs DOM/SVG renderers (textContent everywhere — data stays data)
selftest.mjs 25 checks against the real bundle

node apps/scorecard/selftest.mjs25/25: a model paired against itself yields diff exactly 0 with a CI containing 0; scorecard symbols always agree with the oriented-difference sign; Taylor points obey the law-of-cosines identity; ROC curves are corner-anchored and monotone with AUC > 0.5 on the real data (AUC 0.892 for the AI model’s precip at 24 h).

Drop your own .stat files anywhere on the page to rebuild every view from them. Intentionally no single-file build — it streams the bundle.