What we said, and what happened
Every forecast this network publishes for a station with an hourly report is compared against that report once the valid time has passed, and the residual is written down. This is the whole file, published whether or not it flatters.
Skill by lead
Mean absolute error grows with lead time; the useful question is how fast. Every cell is printed with the number of pairs behind it, because a tidy value drawn from forty samples is not a measurement.
Temperature (°F)
| Lead | NDFD MAE | NDFD bias | NBM MAE | NBM bias | pairs |
|---|---|---|---|---|---|
| Day 1 | 2.27 | -0.02 | 2.23 | -0.12 | 68,091 |
| Day 2 | 2.47 | -0.06 | 2.42 | -0.16 | 65,834 |
| Day 3 | 2.73 | -0.08 | 2.63 | -0.17 | 63,334 |
| Day 4 | 2.96 | +0.04 | 2.85 | -0.17 | 60,980 |
| Day 5 | 3.25 | +0.06 | 3.12 | -0.12 | 58,585 |
| Day 6 | 3.54 | +0.13 | 3.42 | -0.05 | 56,174 |
| Day 7 | 3.82 | +0.27 | 3.66 | -0.04 | 43,716 |
| Day 8 | — | — | 3.96 | -0.08 | 25,530 |
6-hour precipitation (in)
| Lead | NDFD MAE | NDFD bias | NBM MAE | NBM bias | pairs |
|---|---|---|---|---|---|
| Day 1 | 0.02 | +0.00 | — | — | 15,603 |
| Day 2 | 0.02 | +0.00 | — | — | 28,228 |
| Day 3 | 0.02 | +0.00 | — | — | 23,811 |
| Day 4 | — | — | 0.02 | -0.01 | 27,058 |
| Day 5 | — | — | 0.02 | -0.01 | 25,871 |
| Day 6 | — | — | 0.02 | -0.01 | 24,709 |
| Day 7 | — | — | 0.02 | -0.01 | 23,546 |
| Day 8 | — | — | 0.02 | -0.01 | 22,369 |
Where the guidance leans
Mean absolute error says how far a forecast lands from the report; the signed mean says which side. A bias is not an error a reader has to accept — it is one they can correct for. Red runs warm, blue runs cool.
| Station | Bias °F | MAE °F | pairs | |
|---|---|---|---|---|
| YKM | +2.55 | 3.91 | 5,255 | |
| NBG | +2.51 | 3.00 | 5,824 | |
| MHL | +2.18 | 3.33 | 5,741 | |
| GRB | +2.10 | 3.46 | 5,800 | |
| EED | -1.99 | 3.25 | 5,823 | |
| HHR | -1.98 | 3.10 | 5,809 | |
| PDT | -1.98 | 3.62 | 5,858 | |
| XNI | +1.96 | 3.92 | 5,858 | |
| DLF | -1.78 | 2.72 | 637 | |
| CMX | +1.65 | 3.01 | 5,571 | |
| PHX | -1.63 | 3.36 | 5,858 | |
| TVC | +1.50 | 3.22 | 5,858 | |
| AVL | -1.37 | 2.36 | 5,854 | |
| SHR | -1.36 | 4.21 | 5,619 | |
| APN | +1.31 | 2.94 | 5,858 | |
| BIH | -1.15 | 3.39 | 5,857 | |
| TXK | -1.14 | 2.90 | 5,858 | |
| BOI | -1.12 | 4.10 | 5,858 |
Showing the 18 most-biased of 78 stations with at least 200 scored pairs.
Our misses
The largest temperature residuals in the file, one row per event. A bad forecast is re-issued every cycle until its valid time passes, so the raw list repeats the same miss a dozen times; the cycles column says how many runs carried it, which is the difference between one bad run and a model that stayed wrong for two days. They are printed for the same reason the rest of the file is.
| Station | Model | Valid | Worst lead | Forecast | Observed | Residual | Cycles |
|---|---|---|---|---|---|---|---|
| HVE | NBM/NDFD | 2026-09-01 00:00Z | day 8 | 92.2 | 62.6 | +29.6 | 57 of 60 |
| SHR | NBM/NDFD | 2026-09-14 00:00Z | day 6 | 58.2 | 87.1 | -28.9 | 46 of 60 |
| HVE | NBM/NDFD | 2026-08-31 00:00Z | day 8 | 96.2 | 69.8 | +26.4 | 56 of 59 |
| HVE | NBM/NDFD | 2026-08-31 18:00Z | day 8 | 89.0 | 62.6 | +26.4 | 59 of 59 |
| SJT | NBM/NDFD | 2026-08-28 00:00Z | day 7 | 99.0 | 73.0 | +26.1 | 55 of 55 |
| MVH | NBM/NDFD | 2026-09-11 18:00Z | day 7 | 71.9 | 46.4 | +25.5 | 39 of 59 |
| EED | NBM/NDFD | 2026-09-07 00:00Z | day 8 | 103.9 | 79.0 | +24.9 | 55 of 60 |
| CNK | NBM/NDFD | 2026-09-13 00:00Z | day 8 | 86.3 | 62.1 | +24.2 | 60 of 60 |
| INW | NBM/NDFD | 2026-08-30 00:00Z | day 7 | 98.0 | 73.9 | +24.1 | 50 of 57 |
| LIT | NBM/NDFD | 2026-08-27 00:00Z | day 8 | 94.9 | 71.1 | +23.8 | 53 of 53 |
| BOI | NBM/NDFD | 2026-09-05 00:00Z | day 5 | 79.1 | 55.9 | +23.2 | 47 of 60 |
| XNI | NBM/NDFD | 2026-08-31 18:00Z | day 8 | 83.9 | 60.8 | +23.1 | 56 of 59 |
Method, and reach
ASOS reports at :53 and the forecast is stamped on the hour, so a forecast is paired with the nearest observation within 30 minutes and otherwise left unscored.
The ledger begins when the residuals began being written down. The upstream history store keeps a rolling forty cycles, so nothing before that date can be recovered at any price — the table deepens from here rather than reaching backwards.
A residual that cannot be believed is not a miss. 2 rows were excluded here as a data defect rather than a forecast error — a forecast outside the range of anything its own station has ever reported is a broken number, and publishing it as the month's worst miss would blame a forecaster for a decode bug.
Machine edition: /api/v1/ledger.json. Built 2026-09-16T18:25:21Z.