Three tools you meet in the NFIDD forecast-evaluation session — the CRPS and the DSS score how good a forecast is, while the PIT histogram diagnoses why. The guiding principle throughout: maximise sharpness subject to calibration.
What makes a probabilistic forecast "good"?
A probabilistic forecast is not a single number but a whole distribution over what might happen. To judge it we use two ideas:
A proper scoring rule is a score, assigned to each (forecast, outcome) pair, that you minimise in expectation only by reporting your true beliefs. It rewards calibration and sharpness together, so it can't be gamed. Here we use the convention throughout that lower is better.
| Tool | Type | Answers | Units |
|---|---|---|---|
| CRPS | score | How far is the whole forecast distribution from the outcome? | same as the data |
| WIS | score | The CRPS computed from a handful of quantiles (forecast-hub format) | same as the data |
| DSS | score | Same, using only the forecast's mean & spread | unitless (log) |
| PIT | diagnostic | Why is calibration off — too sharp, too wide, or biased? | a histogram |
Continuous Ranked Probability Score — the MAE of probabilistic forecasts
For a point forecast you would use the mean absolute error: the distance between your single guess and the truth. The CRPS generalises this to a forecast that is a distribution. Write the forecast as its cumulative distribution function (CDF) F, and the observed value as y. The CRPS compares the forecast CDF to the "perfect-hindsight" CDF — a single step from 0 to 1 at the value that actually happened:
The shaded region below is the CRPS: wherever the smooth forecast curve disagrees with the step at the observation, that squared gap is added up. A forecast that is both accurate (centred near y) and sharp (steep) leaves little gap and scores low. Drag the observation, or widen the forecast, and watch the area — and the score — change.
A single CRPS number tells you how wrong a forecast is, but not why. It splits cleanly into three additive pieces that always sum back to the total — the same decomposition scoringutils reports:
Drag the controls above and watch the split: centre the forecast on y and only dispersion remains; push the observation into a tail and a directional penalty grows.
Probability Integral Transform — a calibration check, not a score
Evaluate each forecast CDF F at the value that actually occurred: u = F(y) — where in the forecast distribution the outcome landed. Collected over many forecasts, these u values should be spread evenly across 0–1 if the forecasts are calibrated. Let's first build the histogram one forecast at a time, then learn to read its shape.
The PIT value is simply where each outcome lands on its own forecast CDF: read up from the observation y to the S-curve, then across to the axis — that height is u = F(y). The histogram is just those heights, from many forecasts, piling up. Pick a scenario, then press play and watch a fresh outcome get drawn, read off the CDF on the left, and dropped into its bin on the right.
Once many outcomes have piled up, the shape of the histogram tells you what is wrong. A perfectly calibrated forecaster gives a flat histogram; the classic departures are:
All four forecasters predict a Normal; the truth is also Normal. Only the shape of the predictive distribution differs.
Move the forecaster's bias and spread and watch the histogram morph between the four shapes above. The truth is fixed at a standard Normal (mean 0, σ = 1); only the forecast changes. The preset buttons snap to each canonical case.
One subtlety for count data. The clean uniform result holds for continuous forecasts. For integer-valued forecasts (case counts!) the PIT is no longer exactly uniform even when calibrated, so the course uses a randomised PIT — it replaces the single step with a uniform draw across the probability jump at y — which restores uniformity under calibration.
Dawid–Sebastiani Score — accuracy and sharpness from just two numbers
The DSS asks only for the forecast's mean μ and standard deviation σ — no full distribution required. It is the squared standardised error plus a penalty on the spread:
Read the two terms as a tug-of-war:
Weighted Interval Score — the CRPS for quantile forecasts
Forecast hubs (COVID-19, flu, RSV) don't collect a forecaster's whole distribution — they collect a handful of quantiles, e.g. the 2.5%, 25%, 50%, 75%, 97.5% points. The WIS scores exactly that. It is built from the interval score of each central prediction interval [l, u] at level (1−α):
Pay for the interval's width (sharpness), then pay a penalty if the outcome lands outside it. The WIS averages these across K intervals plus the median m, weighting each by αk2:
The lower panel makes this concrete: the dashed line is the exact CRPS of the underlying forecast, and the WIS curve climbs toward it as the number of intervals K increases. The upper panel shows the nested intervals (the forecast "fan") and where the observation falls — intervals it escapes are drawn in red.
Because WIS is the finite-quantile CRPS, it carries the identical three-part decomposition — and the interval form makes each piece tangible:
The PIT's plain-English twin: do your intervals contain the truth as often as they claim?
The PIT histogram is one window onto calibration; interval coverage is another, often easier to explain to a non-statistician. Take the forecaster's central X% prediction interval (e.g. the 90% interval, running from the 5th to the 95th percentile). If the forecaster is calibrated, then over many forecasts the truth should fall inside that interval about X% of the time. Tally how often it actually does, for every nominal level from 0 to 100%, and plot the result.
Here every forecast is a Normal(μf, σf) and the truth is drawn from a standard Normal(0, 1). The forecaster can be biased (μf ≠ 0) and over- or under-dispersed (σf ≠ 1). Because both are Normal, the expected coverage of the central level q interval has a closed form — the solid curve — and a finite sample of n forecasts scatters around it (the dots).
Read the coverage diagram below as: x-axis = the level you claimed, y-axis = the level you achieved. The dashed 45° line is perfect calibration. An over-confident (too-sharp) forecaster makes intervals that are too narrow, so they catch the truth less often than advertised and the curve sags below the diagonal; an under-confident (too-wide) forecaster sits above it. Bias drops the whole curve, since an off-centre interval misses on the far side.
Why epidemic forecasts are often scored after a log transform
Epidemic incidence spans orders of magnitude — a wave can climb from a handful of cases to thousands and back. A proper score like the CRPS is in the units of the data, so on the natural scale a miss of 100 cases counts the same whether the truth was 50 or 5000. The few high-incidence days around the peak therefore dominate the total: a model can look excellent overall just by getting the peak roughly right, while being hopeless in the low-count growth and decline phases that matter most for situational awareness.
Scoring on the log scale — transform both forecast and observation by log(x + 1) before scoring — fixes this. Differences in log space are relative / multiplicative errors, so being a factor of two off is penalised equally whether near 10 cases or near 1000. This weights the growth, peak and decline phases more evenly and amounts, roughly, to scoring the order of magnitude (or the growth rate) rather than the raw count (Bosse et al., scoring epidemiological forecasts on transformed scales).
Below, an epidemic trajectory rises from about 1 to about 1000 and back. Two forecasters track it: A nails the peak but is sloppy at low counts, while B is consistently decent across all phases. Each bar is a single day's CRPS contribution. Flip between the natural and log scale and watch where the score "lives" — and watch the ranking flip.
log(x+1)-transformed scoring by transforming each forecast's mean and spread.)| CRPS | WIS | DSS | PIT histogram | |
|---|---|---|---|---|
| What it is | Proper score | Proper score | Proper score | Calibration diagnostic |
| Needs | Full predictive distribution | A set of quantiles | Only mean & SD | Full predictive CDF at the outcome |
| Units | Same as the data | Same as the data | Unitless (log scale) | — |
| Best value | Lower | Lower | Lower | Flat / uniform |
| Sees distribution shape? | Yes | At the chosen quantiles | No (moments only) | Indirectly, via where outcomes land |
| Outlier sensitivity | Moderate | Moderate | High (squared, standardised) | Shows up as tail bins |
| Decomposes? | Dispersion + over + under | Dispersion + over + under | No | — |
| Use it to… | Rank full distributions | Score hub-style quantile forecasts | Score quickly from summaries | Explain why a model mis-scores |