Forecast evaluation
How the forecasts on the forecasts page have scored against the data that arrived afterwards. Scoring is the continuous ranked probability score against a persistence baseline, defined in the forecast scoring Methods section. The same scoring by province is on the province forecast evaluation page and by health zone on the health-zone forecast evaluation page.
Load packages, data and fitted chains
# Shared setup: packages, observations and the fit registry. See
# `docs/pages/_setup.jl`.
using BVDOutbreakSize
include(joinpath(pkgdir(BVDOutbreakSize), "docs", "pages", "_setup.jl"))validation_forecast_from (generic function with 1 method)# The fits this page reads, loaded from the cache here.
chn_joint = load_fit("joint")
frozen_lastweek = load_fit("frozen_validation")
frozen_lastweek_streams = frozen_validation_stream_fits();Summary
The overall bullets come first, then each stream's own scores, from the sections further down this page. Relative skill is the model's CRPS over the persistence baseline's, so a value below one beats the baseline. Coverage is the fraction of forecasts whose observed value falls inside the 90% predictive interval, nominally 0.9.
Joint model across releases: beat the baseline on 1 of 5 streams.
Frozen joint model: beat the baseline on 2 of 5 streams.
Across releases
confirmed cases: relative skill 6.59, 90% coverage 0.94, bias 0.3 over 100 forecasts.
confirmed deaths: relative skill 9.27, 90% coverage 0.92, bias -0.17 over 98 forecasts.
isolation beds: relative skill 1.43, 90% coverage 0.95, bias 0.19 over 95 forecasts.
onset reports: relative skill 0.94, 90% coverage 0.96, bias -0.1 over 24 forecasts.
recovered: relative skill 1.67, 90% coverage 1.0, bias -0.14 over 14 forecasts.
Frozen fits
confirmed cases: relative skill 2.42, 90% coverage 0.79, bias 0.27 over 247 forecasts.
confirmed deaths: relative skill 0.88, 90% coverage 0.87, bias -0.05 over 191 forecasts.
isolation beds: relative skill 0.78, 90% coverage 0.98, bias 0.1 over 217 forecasts.
onset reports: relative skill 1.02, 90% coverage 0.93, bias -0.11 over 28 forecasts.
recovered: relative skill 5.18, 90% coverage 0.69, bias 0.38 over 97 forecasts.
Forecast validation
How last week's forecast held up against the data since observed, using the frozen re-fit and one-week projection defined in forecast-versus-frozen evaluation. Only the streams the situation reports are still updating are validated here. A stream that has stopped being reported carries a cumulative total that repeats its last reported value, so there is no observation for the past week to score against. The frozen fit also conditions on the isolation beds, so the projected bed occupancy is scored against the beds held a week later. The bed validation is weak at a one-week-back freeze. The reported occupancy rate starts only on 9 June, so the capacity has no implied-capacity anchor and rides its random walk back to the freeze date. Like the scores further down, the confirmed new-count rows here take out any retrospective harmonisation step the week contained. Such a step reattaches records notified earlier, so it is not something the forecast was predicting. The cumulative rows are scored against the published total, harmonisation included.
Fit one week back and validate the one-week-ahead forecast
# frozen_lastweek and frozen_lastweek_streams are computed in the setup
# block above, and `validation_forecast_from` is defined there.
validation_forecast = validation_forecast_from("frozen_validation");
# Each frozen individual (single-stream) fit's own one-week-ahead new-count
# forecast at the same cut-off as `frozen_lastweek`, from
# [`forecast_stream`](@ref) (the same per-stream forecaster
# `stream_forecasts.csv` uses), so the validation plots below can show the
# individual fit alongside the joint rather than the joint alone. Recovered
# has no individual fit and is absent here, as it is throughout this report.
# Only the still-reported streams are fitted at the validation cut-off, so
# a stream the situation reports have stopped updating is absent from
# `frozen_lastweek_streams` and carries no individual series here.
function _validation_individual_new(sid, stream::Symbol)
haskey(frozen_lastweek_streams, sid) || return nothing
return Float64.(
forecast_stream(
fit_forecast("frozen_validation_$sid"), stream; horizon = 7
)
)
end
validation_individual = NamedTuple(
k => v
for (k, v) in pairs(
(;
cases_new = _validation_individual_new(
"cases", :reported_cases
),
deaths_new = _validation_individual_new(
"deaths", :suspected_deaths
),
confirmed_new = _validation_individual_new(
"confirmed", :confirmed_cases
),
confirmed_deaths_new = _validation_individual_new(
"confirmed_deaths", :confirmed_deaths
),
)
)
if !isnothing(v)
)
# The frozen individual (treatment-only) fit's own bed-occupancy forecast.
# `nothing` when the beds have stopped being reported, so the treatment fit
# is absent; the bed panel then draws the joint alone.
validation_individual_isolation = haskey(frozen_lastweek_streams, "treatment") ?
Float64.(
forecast_stream(
fit_forecast("frozen_validation_treatment"), :isolation_beds;
horizon = 7
)
) : nothing
# The observed beds at the current cut-off (the forecast target), so the
# frozen-fit bed forecast is scored against what the beds actually held.
# Held back once the beds stop being reported, since the last count would
# then be carried forward rather than observed at the target date.
_obs_beds = stream_reporting(obs, :isolation_beds) ?
obs.isolation_history.counts[end] : missing
# Same observed/baseline keying as the plot below, so the table covers every
# fitted count stream (cumulative and new-count rows) plus the bed level.
# A harmonisation-break day between the frozen cut-off and the current one
# puts records into the confirmed cumulative that were never notified in that
# week, so the new-count truth carries a step the forecast was never
# predicting. Take it out, the same correction `score_releases.jl` applies.
# Grid days are relative to a seeding date fixed by the genetic tmrca, so the
# frozen fit's own `n` and the current `obs.n` index the same grid.
validation_breaks = (
confirmed_cum = confirmed_break_correction(
obs, frozen_lastweek.o.n, obs.n
),
confirmed_deaths_cum = confirmed_break_correction(
obs, frozen_lastweek.o.n, obs.n; deaths = true
),
)
# Observed cumulative at the target date per stream, keyed by the forecast's
# cumulative column; `baseline` is each stream's origin cumulative (the
# frozen cut-off), so the new count is scored against observed minus origin,
# less any harmonisation the window carries (see `validation_breaks`). Both
# the table and the plot below take the still-reported streams
# (`reporting_cum_cols`, from the setup block): a stream the situation
# reports have stopped updating has an origin and a target reading the same
# repeated total, so its cumulative truth is stale and its new-count truth is
# a guaranteed zero.
validation_observed = (
cases_cum = obs.reported_cases,
deaths_cum = obs.total_deaths,
confirmed_cum = obs.confirmed_cases,
confirmed_deaths_cum = obs.confirmed_deaths,
recovered_cum = obs.recovered_cases,
)
validation_baseline = (
cases_cum = frozen_lastweek.o.reported_cases,
deaths_cum = frozen_lastweek.o.total_deaths,
confirmed_cum = frozen_lastweek.o.confirmed_cases,
confirmed_deaths_cum = frozen_lastweek.o.confirmed_deaths,
recovered_cum = frozen_lastweek.o.recovered_cases,
)
validation_table = forecast_vs_truth(
validation_forecast;
observed = keep_streams(validation_observed, reporting_cum_cols),
baseline = keep_streams(validation_baseline, reporting_cum_cols),
breaks = validation_breaks,
isolation = _obs_beds
);Forecast-versus-observed validation table
| Stream | Quantity | Observed | Lower 90% | Lower 60% | Lower 30% | Upper 30% | Upper 60% | Upper 90% | Within 90% PI |
|---|---|---|---|---|---|---|---|---|---|
| DRC confirmed cases | cumulative by T+7 | 8067 | 8159 | 8257 | 8315 | 8440 | 8520 | 8683 | no |
| DRC confirmed cases | new this week | 395 | 487 | 585 | 643 | 768 | 848 | 1011 | no |
| DRC confirmed deaths | cumulative by T+7 | 3901 | 3935 | 3966 | 3989 | 4026 | 4050 | 4101 | no |
| DRC confirmed deaths | new this week | 202 | 236 | 267 | 290 | 327 | 351 | 402 | no |
| DRC recovered among confirmed | cumulative by T+7 | 2070 | 2012 | 2231 | 2308 | 2427 | 2507 | 2742 | yes |
| DRC recovered among confirmed | new this week | 191 | 133 | 352 | 429 | 548 | 628 | 863 | yes |
| DRC isolation beds | occupancy at T+7 | 773 | 688 | 776 | 828 | 903 | 953 | 1054 | yes |
The observation panels histogram the one-week-ahead forecast made from the frozen fit: a cumulative and a new-count panel for each still-reported count stream the forecast carries. The 90% predictive interval is shaded, and the count observed by the current cut-off is a dashed black rule. Where a stream has its own individual (single-stream) fit, that fit's forecast from the same frozen cut-off is overlaid as a dotted step outline on the joint's own histogram bins.
Forecast-versus-observed plot
validation_fig = plot_forecast_vs_truth(
validation_forecast;
observed = keep_streams(validation_observed, reporting_cum_cols),
baseline = keep_streams(validation_baseline, reporting_cum_cols),
breaks = validation_breaks,
individual = keep_streams(validation_individual, reporting_cum_cols)
);
The bed panel scores last week's projected occupancy against the beds occupied now (the dashed rule), with the individual (treatment-only) fit's own projection overlaid as a dotted step outline on the joint's own histogram bins.
Bed forecast-versus-observed plot
validation_beds_fig = plot_forecast_beds_vs_truth(
validation_forecast;
isolation = _obs_beds, individual = validation_individual_isolation
);
The latent quantities are not observed, so they are scored distribution against distribution: what the frozen fit forecast for the past week's new infections, onsets and deaths against what the current fit now estimates for the same window.
Forecast-versus-now latent plot
# Current fit's draws of the new latent counts over the past week, the last
# seven days of each cumulative-trajectory deterministic.
function _now_new(chn, key)
mat = chn[key]
trajs = [collect(v) for v in vec(collect(mat))]
return Float64[t[end] - t[max(1, length(t) - 7)] for t in trajs]
end
now_latent = (;
infections_new = _now_new(chn_joint, :cumulative_infections),
onsets_new = _now_new(chn_joint, :cumulative_onsets),
deaths_latent_new = _now_new(chn_joint, :cumulative_expected_deaths),
)
validation_latent_fig = plot_forecast_vs_truth_latent(
validation_forecast; now = now_latent
);
Streams no longer reported
The situation reports have stopped updating some of the streams the model fits, listed with the date each was last reported below. The panels show what the frozen fit projected for those streams over the same week, without an observed rule, since the count they would be scored against has not moved since the stream stopped.
Forecast for the streams no longer reported
# The last-reported date per stopped stream, and the frozen fit's own
# projection for them. `plot_forecast` draws a panel per new-count column
# the frame carries, so passing the stopped streams' columns alone gives the
# projection without the fabricated truth rule the validation figure would
# otherwise draw against a repeated total.
validation_stopped_streams = let s = stream_report_status(obs),
ids = [stream_id(c) for c in stopped_cum_cols]
keep = [r.stream in ids for r in eachrow(s)]
DataFrame(
"Stream" => s[keep, :label],
"Last reported" => s[keep, :last_date]
)
end
_stopped_new_cols = [
c
for c in new_cols(stopped_cum_cols)
if c in propertynames(validation_forecast)
]
validation_stopped_fig = plot_forecast(
validation_forecast[!, _stopped_new_cols]
);| Stream | Last reported |
|---|---|
| Suspected cases | 2026-05-26 |
| Suspected deaths | 2026-05-26 |

Forecast scoring across releases
Every release's saved one- to four-week-ahead forecast is scored against the data observed since, against a persistence baseline and, where one exists, the stream's own individual fit as well as the joint. The tables in this section are the joint model's, one row per stream. See forecast scoring against a persistence baseline for how the scores, the relative skill and the baseline are built. Recovered has no individual fit of its own, so its comparison is the baseline against the joint only. Reported cases and suspected deaths stopped being updated by the situation reports partway through the outbreak, and exports' confirmed-detection series is anchored to an earlier cut-off. Exports therefore contributes no scored forecast, and reported cases and suspected deaths each rest on exactly one matched forecast, a single window rather than a settled sample.
Only a minority of the daily releases examined contribute a row to the table below, each a reconstruction of an earlier model version rather than the current fit. Only the newest few releases carry the current model's own individual-stream forecasts, and the backfilled reconstructions carry none at all. Every row also rests on one to a handful of matched forecasts, shown as its own count rather than rounded away.
Four things are excluded from the scores here and in the frozen section below, each for a stated reason rather than for scoring badly, and the second of them applies to the frozen section alone.
One whole reconstruction (
results-v1.6.0): its chain forecasts a near-zero median at every horizon and stream, with the upper predictive tail occasionally reaching five- and six-digit values, which is the signature of a chain that failed to sample rather than a forecast.Frozen section only: the confirmed-death rows of the fourteen frozen reconstructions cut between 16 July and 15 August 2026, whose forecaster could not project that stream from its own trajectory and floored it at zero, so each carries a one-week median of exactly zero against an observed 250 to 370. Reconstructions cut after that window project the stream normally.
An onset window containing a vintage whose reread total falls, since its increment is not what the situation reports added.
A stream that carries no persistence baseline, which is what makes a window scoreable at all.
Nothing is dropped from the archive itself; data/forecast_scores*.csv and data/forecast_overlay*.csv record everything that was scored.
The symptom-onset stream is scored on the new reported count each vintage adds rather than on its level, because every vintage rereads the whole figure. Its printed total therefore moves with the scan error as well as with late reporting. On fourteen vintages the reread total falls, which a cumulative onset curve cannot do, and on many others it repeats unchanged. The scored truth cannot absorb that, since it is the increment between the vintages at the two ends of a window. A window containing a falling vintage is therefore left unscored, the rule the province scores already apply to a window holding a harmonisation-break day. It bites hardest at the longer horizons, a four-week window being more likely to contain a reread than a one-week one: the frozen onset row keeps three of its twenty-nine windows, all at one week, and the cross-release row six of thirty-eight. Read the onset row's skill against the baseline rather than its coverage, and read it as resting on a handful of windows.
Load and summarise the cross-release forecast scores
forecast_scores_df = _release_data(
"forecast_scores.csv",
(;
release = String, made_date = Date, stream = String, horizon = Int,
target_date = Date, fit = String, crps = Float64,
log_crps = Float64, dispersion = Float64, overprediction = Float64,
underprediction = Float64, coverage_50 = Float64,
coverage_90 = Float64,
bias = Float64, n_samples = Int,
log_rel_to_baseline = Float64,
)
)
forecast_overlay_df = _release_data(
"forecast_overlay.csv",
(;
release = String, made_date = Date, stream = String, horizon = Int,
target_date = Date, fit = String, observed = Float64,
median = Float64, lo30 = Float64, hi30 = Float64, lo60 = Float64,
hi60 = Float64, lo90 = Float64, hi90 = Float64,
)
)
# The digitised onset triangle's own per-vintage total, as calendar dates,
# and the windows it makes unscoreable. A vintage that rereads the figure
# lower gives a window an increment the reports did not add, so the window
# is dropped from the scores and the overlay alike (see
# `drop_rescanned_onset_windows`). The current triangle is used to judge
# every release, since the scored truth is read off this one series.
_onset_vintage_dates = grid_date.(obs.onset_report_history.days)
_onset_vintage_totals = obs.onset_report_history.counts
_drop_rescanned(tbl) = drop_rescanned_onset_windows(
tbl; vintage_dates = _onset_vintage_dates,
vintage_totals = _onset_vintage_totals
)
forecast_scores_df = _drop_rescanned(forecast_scores_df)
forecast_overlay_df = _drop_rescanned(forecast_overlay_df)
# One row per (stream, fit) pooled over every horizon and release. The
# by-horizon and by-release detail tables carry the same columns at a finer
# grain (see src/scoring.jl). Every fit is kept here, since the
# relative-skill figure below compares the roles against each other. The
# tables rendered in this section select the joint role, and the individual
# fits are tabulated in their own section.
forecast_score_overview_table = forecast_score_overview(forecast_scores_df)
forecast_score_by_horizon_table = forecast_score_by_horizon(forecast_scores_df)
forecast_score_by_release_table = forecast_score_by_release(forecast_scores_df)
joint_score_overview_table = select_fit_role(
forecast_score_overview_table, "joint"
)
joint_score_by_horizon_table = select_fit_role(
forecast_score_by_horizon_table, "joint"
)
# The trailing `;` on this last assignment matters: without it, this whole
# setup chunk's last statement (the DataFrame it assigns) is Literate's
# implicitly displayed "result" for the chunk, on top of the deliberate
# display further down -- and a bare DataFrame is html-showable, so it
# goes out as a second, undisplayed-in-source `@raw html` block that (for
# a table this size) can itself hit the PCRE limit described above.
joint_score_by_release_table = select_fit_role(
forecast_score_by_release_table, "joint"
);The headline pools every horizon and release into one row per stream for the joint model: the mean CRPS and its decomposition, coverage, bias, and the relative skill against the persistence baseline, on both the natural and the log scale. Each row also carries relative skill against the stream's own individual fit where one exists.
| stream | fit | n | crps | rel_to_baseline | log_crps | log_rel_to_baseline | rel_to_individual | log_rel_to_individual | dispersion | overprediction | underprediction | coverage_50 | coverage_90 | bias |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| confirmed cases | joint | 100 | 892.21 | 6.59 | 0.219 | 1.97 | 0.77 | 0.7 | 813.24 | 78.53 | 0.44 | 0.71 | 0.94 | 0.3 |
| confirmed deaths | joint | 98 | 890.28 | 9.27 | 0.465 | 3 | 0.81 | 0.99 | 786.66 | 16.01 | 87.61 | 0.37 | 0.92 | -0.17 |
| isolation beds | joint | 95 | 80.81 | 1.43 | 0.1 | 1.33 | 0.84 | 0.67 | 51.73 | 23.39 | 5.69 | 0.66 | 0.95 | 0.19 |
| onset reports | joint | 24 | 131.55 | 0.94 | 0.196 | 0.9 | 0.65 | 0.61 | 78.14 | 11.9 | 41.52 | 0.71 | 0.96 | -0.1 |
| recovered | joint | 14 | 111.51 | 1.67 | 0.306 | 1.1 | 96.16 | 5 | 10.36 | 1 | 1 | -0.14 |
The same relative skill against the baseline, by horizon: one panel per stream, one series per fit role, on a log-scaled skill axis with the reference line at one.
forecast_relative_skill_fig = plot_forecast_relative_skill(
forecast_score_by_horizon_table
);
What that error is made of, by horizon: the mean CRPS split into its width, its overprediction and its underprediction, one stacked bar per horizon and fit role.
forecast_crps_by_horizon_fig = plot_forecast_crps_by_horizon(
forecast_score_by_horizon_table
);
Scores by horizon
| stream | horizon | fit | n | crps | rel_to_baseline | log_crps | log_rel_to_baseline | rel_to_individual | log_rel_to_individual | dispersion | overprediction | underprediction | coverage_50 | coverage_90 | bias |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| confirmed cases | 7 | joint | 31 | 115.74 | 2.74 | 0.24 | 2.77 | 0.66 | 0.66 | 69.07 | 46.05 | 0.62 | 0.65 | 0.84 | 0.37 |
| confirmed cases | 14 | joint | 27 | 217.37 | 2.86 | 0.211 | 2.66 | 0.68 | 0.67 | 155.03 | 61.85 | 0.49 | 0.74 | 0.96 | 0.27 |
| confirmed cases | 21 | joint | 23 | 408.78 | 2.43 | 0.193 | 1.54 | 0.74 | 0.71 | 320.5 | 88.01 | 0.28 | 0.78 | 1 | 0.27 |
| confirmed cases | 28 | joint | 19 | 3703.25 | 11.17 | 0.226 | 1.26 | 0.88 | 0.83 | 3559.26 | 143.72 | 0.27 | 0.68 | 1 | 0.28 |
| confirmed deaths | 7 | joint | 31 | 74.77 | 2.93 | 0.48 | 4.39 | 1.06 | 0.96 | 27.62 | 11.84 | 35.31 | 0.39 | 0.81 | -0.08 |
| confirmed deaths | 14 | joint | 26 | 165.94 | 2.78 | 0.439 | 3.48 | 0.94 | 0.89 | 69.07 | 18.26 | 78.6 | 0.31 | 0.92 | -0.13 |
| confirmed deaths | 21 | joint | 22 | 310.69 | 2.4 | 0.453 | 2.52 | 0.82 | 0.99 | 174.07 | 15.42 | 121.19 | 0.27 | 1 | -0.23 |
| confirmed deaths | 28 | joint | 19 | 3883.17 | 17.46 | 0.489 | 2.03 | 0.69 | 1.19 | 3716.38 | 20.41 | 146.39 | 0.53 | 1 | -0.28 |
| isolation beds | 7 | joint | 29 | 73.93 | 1.78 | 0.089 | 1.63 | 0.73 | 0.56 | 35.57 | 32.25 | 6.11 | 0.48 | 0.93 | 0.29 |
| isolation beds | 14 | joint | 25 | 78.48 | 1.58 | 0.094 | 1.43 | 0.83 | 0.65 | 49.25 | 24.41 | 4.83 | 0.64 | 0.96 | 0.19 |
| isolation beds | 21 | joint | 22 | 83.35 | 1.27 | 0.102 | 1.18 | 0.9 | 0.73 | 60.55 | 16.35 | 6.45 | 0.82 | 0.95 | 0.12 |
| isolation beds | 28 | joint | 19 | 91.42 | 1.16 | 0.12 | 1.15 | 0.96 | 0.8 | 69.43 | 16.7 | 5.29 | 0.79 | 0.95 | 0.12 |
| onset reports | 7 | joint | 10 | 85.45 | 0.64 | 0.247 | 0.75 | 0.75 | 0.62 | 55.05 | 3.55 | 26.84 | 0.9 | 0.9 | -0.09 |
| onset reports | 14 | joint | 8 | 141.94 | 1.37 | 0.165 | 1.37 | 0.62 | 0.62 | 78.1 | 15.65 | 48.19 | 0.62 | 1 | -0.06 |
| onset reports | 21 | joint | 6 | 194.56 | 0.97 | 0.15 | 0.94 | 0.58 | 0.58 | 116.67 | 20.82 | 57.08 | 0.5 | 1 | -0.15 |
| recovered | 7 | joint | 6 | 18.11 | 1.5 | 0.185 | 1.5 | 14.79 | 0.73 | 2.59 | 1 | 1 | -0.09 | ||
| recovered | 14 | joint | 3 | 89.7 | 1.95 | 0.393 | 1.46 | 68.01 | 5.81 | 15.87 | 1 | 1 | -0.23 | ||
| recovered | 21 | joint | 3 | 297.16 | 3.26 | 0.422 | 1.16 | 269.9 | 16.05 | 11.2 | 1 | 1 | -0.09 | ||
| recovered | 28 | joint | 2 | 145.99 | 0.65 | 0.367 | 0.57 | 121.86 | 0 | 24.13 | 1 | 1 | -0.26 |
The same relative skill against the baseline, release by release, so a run of releases that lost to the baseline reads as a run rather than as an average.
forecast_skill_by_cutoff_fig = plot_forecast_skill_by_cutoff(
forecast_score_by_release_table;
title = "Relative skill against the baseline, by release"
);
Scores by release
| made_date | stream | fit | n | crps | rel_to_baseline | log_crps | log_rel_to_baseline | rel_to_individual | log_rel_to_individual | dispersion | overprediction | underprediction | coverage_50 | coverage_90 | bias |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 2026-06-07 | confirmed cases | joint | 2 | 363.91 | 12.53 | 0.913 | 10.43 | 341.06 | 22.86 | 0 | 1 | 1 | 0.17 | ||
| 2026-06-10 | confirmed cases | joint | 3 | 534.87 | 6.73 | 0.791 | 5.08 | 435.67 | 99.2 | 0 | 1 | 1 | 0.27 | ||
| 2026-07-01 | confirmed cases | joint | 4 | 15862.78 | 74.23 | 0.583 | 2.82 | 15377.31 | 485.47 | 0 | 0 | 1 | 0.66 | ||
| 2026-07-06 | confirmed cases | joint | 4 | 421.28 | 1.32 | 0.269 | 0.96 | 311.85 | 109.43 | 0 | 0.5 | 1 | 0.49 | ||
| 2026-07-08 | confirmed cases | joint | 4 | 390.98 | 1.22 | 0.253 | 0.96 | 239.5 | 151.47 | 0 | 0.25 | 1 | 0.52 | ||
| 2026-07-23 | confirmed cases | joint | 4 | 335.57 | 0.88 | 0.169 | 0.67 | 1.02 | 0.82 | 299.27 | 35.68 | 0.62 | 1 | 1 | 0.13 |
| 2026-07-25 | confirmed cases | joint | 4 | 222.5 | 0.98 | 0.134 | 0.98 | 0.64 | 0.63 | 218.04 | 4.46 | 0 | 1 | 1 | 0.07 |
| 2026-07-26 | confirmed cases | joint | 4 | 235.69 | 1.12 | 0.141 | 1.12 | 0.79 | 0.67 | 229.65 | 5.68 | 0.36 | 1 | 1 | 0.06 |
| 2026-07-27 | confirmed cases | joint | 4 | 247.97 | 1.28 | 0.142 | 1.12 | 0.93 | 0.83 | 240.08 | 7.88 | 0 | 1 | 1 | 0.11 |
| 2026-07-31 | confirmed cases | joint | 4 | 259.64 | 2.13 | 0.149 | 1.93 | 0.64 | 0.68 | 235.73 | 23.76 | 0.15 | 1 | 1 | 0.13 |
| 2026-08-01 | confirmed cases | joint | 4 | 231.26 | 2.02 | 0.139 | 2.03 | 0.69 | 0.66 | 226.84 | 4.31 | 0.11 | 1 | 1 | 0.05 |
| 2026-08-02 | confirmed cases | joint | 4 | 278.45 | 2.02 | 0.145 | 1.68 | 0.94 | 0.85 | 263.77 | 14.68 | 0 | 1 | 1 | 0.14 |
| 2026-08-03 | confirmed cases | joint | 4 | 247.58 | 1.28 | 0.14 | 0.94 | 0.85 | 0.8 | 237.88 | 9.7 | 0 | 1 | 1 | 0.08 |
| 2026-08-04 | confirmed cases | joint | 4 | 221.56 | 2.43 | 0.133 | 2.4 | 0.63 | 0.69 | 220.7 | 0.86 | 0 | 1 | 1 | 0.03 |
| 2026-08-07 | confirmed cases | joint | 4 | 213.54 | 2.7 | 0.14 | 2.2 | 0.69 | 0.73 | 209.76 | 0 | 3.78 | 1 | 1 | -0.09 |
| 2026-08-11 | confirmed cases | joint | 4 | 197.49 | 4.43 | 0.135 | 3.92 | 0.59 | 0.71 | 191.53 | 0 | 5.97 | 1 | 1 | -0.13 |
| 2026-08-15 | confirmed cases | joint | 4 | 387.77 | 6.54 | 0.193 | 3.8 | 1.24 | 0.91 | 294.02 | 93.75 | 0 | 1 | 1 | 0.37 |
| 2026-08-17 | confirmed cases | joint | 4 | 458.71 | 6.14 | 0.222 | 3.54 | 1.53 | 0.97 | 290.38 | 168.33 | 0 | 0.5 | 1 | 0.46 |
| 2026-08-22 | confirmed cases | joint | 4 | 336.09 | 5.03 | 0.178 | 3.55 | 1 | 0.87 | 228.94 | 107.15 | 0 | 0.75 | 1 | 0.45 |
| 2026-08-24 | confirmed cases | joint | 4 | 246.11 | 4.04 | 0.144 | 3.42 | 0.78 | 0.77 | 118.34 | 127.77 | 0 | 0 | 1 | 0.62 |
| 2026-08-25 | confirmed cases | joint | 4 | 198.57 | 3.21 | 0.12 | 2.79 | 0.66 | 0.65 | 108.48 | 90.1 | 0 | 0 | 1 | 0.56 |
| 2026-08-30 | confirmed cases | joint | 3 | 97.18 | 1.93 | 0.073 | 1.37 | 0.38 | 0.41 | 73.82 | 23.36 | 0 | 1 | 1 | 0.31 |
| 2026-08-31 | confirmed cases | joint | 3 | 94.41 | 1.8 | 0.072 | 1.49 | 0.46 | 0.45 | 75.35 | 19.06 | 0 | 1 | 1 | 0.22 |
| 2026-09-01 | confirmed cases | joint | 3 | 77.23 | 1.26 | 0.061 | 1.03 | 0.32 | 0.35 | 68.4 | 8.84 | 0 | 1 | 1 | 0.13 |
| 2026-09-06 | confirmed cases | joint | 2 | 96.61 | 3.08 | 0.097 | 2.63 | 0.61 | 0.55 | 57.3 | 39.32 | 0 | 0.5 | 1 | 0.5 |
| 2026-09-10 | confirmed cases | joint | 2 | 160.44 | 1.59 | 0.173 | 1.49 | 0.74 | 0.78 | 51.24 | 109.2 | 0 | 0 | 1 | 0.78 |
| 2026-09-12 | confirmed cases | joint | 2 | 332.38 | 2.21 | 0.36 | 1.91 | 0.46 | 0.52 | 64.18 | 268.21 | 0 | 0 | 0 | 0.95 |
| 2026-09-13 | confirmed cases | joint | 1 | 183.19 | 3.02 | 0.311 | 2.7 | 0.45 | 0.51 | 36.62 | 146.57 | 0 | 0 | 0 | 0.92 |
| 2026-09-15 | confirmed cases | joint | 1 | 227.82 | 2.3 | 0.416 | 2.02 | 0.56 | 0.62 | 43.47 | 184.36 | 0 | 0 | 0 | 0.97 |
| 2026-09-16 | confirmed cases | joint | 1 | 217.34 | 2.78 | 0.401 | 2.42 | 0.58 | 0.64 | 42.14 | 175.2 | 0 | 0 | 0 | 0.99 |
| 2026-09-19 | confirmed cases | joint | 1 | 300.57 | 6.04 | 0.547 | 4.86 | 1.01 | 1.01 | 46.48 | 254.09 | 0 | 0 | 0 | 0.99 |
| 2026-06-07 | confirmed deaths | joint | 1 | 41.49 | 1.73 | 0.903 | 2.39 | 36.94 | 0 | 4.55 | 1 | 1 | -0.2 | ||
| 2026-06-10 | confirmed deaths | joint | 2 | 64.93 | 2.28 | 0.735 | 3.06 | 62.7 | 0.99 | 1.24 | 1 | 1 | -0.03 | ||
| 2026-07-01 | confirmed deaths | joint | 4 | 17196 | 79.78 | 0.549 | 1.19 | 17103.11 | 92.89 | 0 | 1 | 1 | 0.28 | ||
| 2026-07-06 | confirmed deaths | joint | 4 | 197.2 | 0.91 | 0.871 | 2.37 | 110.35 | 0 | 86.85 | 0.25 | 1 | -0.49 | ||
| 2026-07-08 | confirmed deaths | joint | 4 | 177.59 | 0.8 | 0.713 | 1.89 | 84.29 | 0 | 93.3 | 0.25 | 1 | -0.61 | ||
| 2026-07-23 | confirmed deaths | joint | 4 | 271.49 | 1.75 | 0.484 | 2.6 | 0.39 | 1.08 | 172.61 | 0 | 98.88 | 1 | 1 | -0.45 |
| 2026-07-25 | confirmed deaths | joint | 4 | 241.83 | 2.02 | 0.504 | 3.45 | 1.02 | 2.15 | 106.46 | 0 | 135.37 | 0 | 1 | -0.57 |
| 2026-07-26 | confirmed deaths | joint | 4 | 268.46 | 2.4 | 0.554 | 4.39 | 1.05 | 2.17 | 101.59 | 0 | 166.87 | 0 | 1 | -0.64 |
| 2026-07-27 | confirmed deaths | joint | 4 | 249.47 | 2.32 | 0.534 | 4.07 | 0.8 | 2.12 | 109.3 | 0 | 140.17 | 0 | 1 | -0.59 |
| 2026-07-31 | confirmed deaths | joint | 4 | 274.55 | 2.37 | 0.56 | 4.16 | 0.88 | 1.94 | 108.79 | 0 | 165.76 | 0.25 | 1 | -0.58 |
| 2026-08-01 | confirmed deaths | joint | 4 | 313.48 | 2.68 | 0.683 | 4.58 | 1.12 | 2.7 | 94.48 | 0 | 219.01 | 0 | 1 | -0.68 |
| 2026-08-02 | confirmed deaths | joint | 4 | 258.17 | 2.75 | 0.507 | 4.37 | 1.01 | 1.83 | 128.19 | 0 | 129.98 | 0.25 | 1 | -0.53 |
| 2026-08-03 | confirmed deaths | joint | 4 | 268.89 | 1.94 | 0.58 | 2.89 | 1.2 | 2.37 | 123.56 | 0 | 145.33 | 0.25 | 1 | -0.55 |
| 2026-08-04 | confirmed deaths | joint | 4 | 298.06 | 4.27 | 0.656 | 8 | 1.2 | 2.32 | 93.54 | 0 | 204.52 | 0 | 1 | -0.67 |
| 2026-08-07 | confirmed deaths | joint | 4 | 366.29 | 5.11 | 0.88 | 8.34 | 1.58 | 2.71 | 76.06 | 0 | 290.23 | 0 | 0.75 | -0.79 |
| 2026-08-11 | confirmed deaths | joint | 4 | 301.17 | 13.15 | 0.798 | 24.01 | 1.23 | 2.37 | 96.55 | 0 | 204.61 | 0 | 1 | -0.7 |
| 2026-08-15 | confirmed deaths | joint | 4 | 205.93 | 5.14 | 0.32 | 5.32 | 0.84 | 0.94 | 180.35 | 0 | 25.58 | 1 | 1 | -0.26 |
| 2026-08-17 | confirmed deaths | joint | 4 | 202.49 | 4.11 | 0.304 | 4.03 | 0.81 | 1.02 | 187.02 | 0 | 15.47 | 1 | 1 | -0.21 |
| 2026-08-22 | confirmed deaths | joint | 4 | 178.98 | 2 | 0.305 | 2.46 | 0.74 | 0.63 | 156.16 | 0 | 22.82 | 1 | 1 | -0.26 |
| 2026-08-24 | confirmed deaths | joint | 4 | 92.94 | 1.35 | 0.105 | 1.24 | 0.42 | 0.19 | 45.42 | 47.51 | 0 | 0.25 | 1 | 0.57 |
| 2026-08-25 | confirmed deaths | joint | 4 | 74 | 1.08 | 0.084 | 1.05 | 0.3 | 0.11 | 45.08 | 28.92 | 0 | 0.75 | 1 | 0.41 |
| 2026-08-30 | confirmed deaths | joint | 3 | 47.6 | 1.06 | 0.075 | 1.17 | 0.22 | 0.08 | 27.29 | 20.31 | 0 | 0.67 | 1 | 0.42 |
| 2026-08-31 | confirmed deaths | joint | 3 | 60.23 | 0.92 | 0.099 | 0.99 | 0.3 | 0.13 | 29.9 | 30.33 | 0 | 0 | 1 | 0.57 |
| 2026-09-01 | confirmed deaths | joint | 3 | 53.54 | 1.06 | 0.085 | 1.11 | 0.26 | 0.09 | 29.13 | 24.41 | 0 | 0.33 | 1 | 0.54 |
| 2026-09-06 | confirmed deaths | joint | 2 | 52.44 | 2.89 | 0.105 | 2.41 | 0.28 | 0.09 | 19.63 | 32.82 | 0 | 0.5 | 1 | 0.57 |
| 2026-09-10 | confirmed deaths | joint | 2 | 96.57 | 1.29 | 0.222 | 1.19 | 0.78 | 0.3 | 20.65 | 75.92 | 0 | 0 | 0.5 | 0.9 |
| 2026-09-12 | confirmed deaths | joint | 2 | 122.2 | 1.62 | 0.289 | 1.41 | 2.25 | 2.15 | 22.29 | 99.92 | 0 | 0 | 0 | 0.94 |
| 2026-09-13 | confirmed deaths | joint | 1 | 63.97 | 1.66 | 0.241 | 1.57 | 1.96 | 1.89 | 13.39 | 50.58 | 0 | 0 | 0 | 0.91 |
| 2026-09-15 | confirmed deaths | joint | 1 | 76.48 | 1.88 | 0.309 | 1.77 | 2.89 | 2.75 | 13.58 | 62.9 | 0 | 0 | 0 | 1 |
| 2026-09-16 | confirmed deaths | joint | 1 | 79.12 | 1.73 | 0.327 | 1.62 | 2.77 | 2.61 | 14.9 | 64.22 | 0 | 0 | 0 | 0.98 |
| 2026-09-19 | confirmed deaths | joint | 1 | 82.47 | 5.28 | 0.329 | 4.64 | 5.33 | 4.68 | 12.84 | 69.62 | 0 | 0 | 0 | 0.95 |
| 2026-07-01 | isolation beds | joint | 4 | 90.19 | 1.45 | 0.138 | 1.48 | 13.48 | 0 | 76.71 | 0 | 0 | -0.99 | ||
| 2026-07-06 | isolation beds | joint | 4 | 42.87 | 0.66 | 0.066 | 0.67 | 21.07 | 0 | 21.8 | 0 | 1 | -0.64 | ||
| 2026-07-08 | isolation beds | joint | 4 | 54.75 | 1.51 | 0.073 | 1.51 | 11.67 | 43.08 | 0 | 0 | 1 | 0.8 | ||
| 2026-07-23 | isolation beds | joint | 4 | 80.06 | 2.75 | 0.101 | 2.66 | 1.44 | 1.14 | 29.39 | 50.67 | 0 | 0 | 1 | 0.58 |
| 2026-07-25 | isolation beds | joint | 4 | 80.84 | 2.1 | 0.105 | 2.06 | 1.56 | 1.28 | 32.65 | 48.19 | 0 | 0.5 | 1 | 0.53 |
| 2026-07-26 | isolation beds | joint | 4 | 73.83 | 1.99 | 0.097 | 1.93 | 1.2 | 0.96 | 36.96 | 36.87 | 0 | 0.5 | 1 | 0.46 |
| 2026-07-27 | isolation beds | joint | 4 | 71.58 | 2.47 | 0.093 | 2.37 | 1.2 | 0.95 | 39.52 | 32.06 | 0 | 0.5 | 1 | 0.44 |
| 2026-07-31 | isolation beds | joint | 4 | 71.05 | 1.67 | 0.088 | 1.62 | 0.86 | 0.67 | 51.69 | 19.36 | 0 | 0.75 | 1 | 0.34 |
| 2026-08-01 | isolation beds | joint | 4 | 72 | 1.13 | 0.094 | 1.1 | 0.81 | 0.61 | 64.51 | 7.48 | 0.02 | 1 | 1 | 0.18 |
| 2026-08-02 | isolation beds | joint | 4 | 83.69 | 1.65 | 0.102 | 1.5 | 0.99 | 0.72 | 52.67 | 31.02 | 0 | 0.75 | 1 | 0.39 |
| 2026-08-03 | isolation beds | joint | 4 | 78.83 | 1.74 | 0.099 | 1.61 | 0.99 | 0.74 | 60.42 | 18.41 | 0 | 1 | 1 | 0.3 |
| 2026-08-04 | isolation beds | joint | 4 | 100.74 | 1.48 | 0.137 | 1.42 | 1.16 | 0.98 | 63.47 | 37.28 | 0 | 0.75 | 1 | 0.38 |
| 2026-08-07 | isolation beds | joint | 4 | 83.81 | 1.39 | 0.122 | 1.55 | 0.8 | 0.71 | 69.03 | 0 | 14.78 | 1 | 1 | -0.24 |
| 2026-08-11 | isolation beds | joint | 4 | 74.71 | 0.44 | 0.109 | 0.44 | 0.73 | 0.64 | 72.48 | 0 | 2.23 | 1 | 1 | -0.08 |
| 2026-08-15 | isolation beds | joint | 4 | 80.96 | 0.94 | 0.092 | 0.85 | 0.63 | 0.45 | 71.72 | 9.24 | 0 | 1 | 1 | 0.17 |
| 2026-08-17 | isolation beds | joint | 4 | 95.08 | 1.39 | 0.106 | 1.21 | 0.92 | 0.66 | 67.35 | 27.74 | 0 | 1 | 1 | 0.33 |
| 2026-08-22 | isolation beds | joint | 4 | 93.15 | 1.5 | 0.098 | 1.3 | 0.64 | 0.45 | 78.98 | 14.18 | 0 | 1 | 1 | 0.23 |
| 2026-08-24 | isolation beds | joint | 4 | 90.98 | 1.81 | 0.096 | 1.54 | 0.72 | 0.53 | 66.3 | 24.67 | 0 | 0.75 | 1 | 0.34 |
| 2026-08-25 | isolation beds | joint | 4 | 75.54 | 1.1 | 0.082 | 0.96 | 0.57 | 0.43 | 71.77 | 3.74 | 0.02 | 1 | 1 | 0.08 |
| 2026-08-30 | isolation beds | joint | 3 | 71.79 | 1.76 | 0.079 | 1.58 | 0.58 | 0.47 | 54.67 | 17.12 | 0 | 0.67 | 1 | 0.31 |
| 2026-08-31 | isolation beds | joint | 3 | 60.95 | 1.33 | 0.069 | 1.26 | 0.52 | 0.43 | 54.18 | 6.23 | 0.54 | 1 | 1 | 0.15 |
| 2026-09-01 | isolation beds | joint | 3 | 70.87 | 1.85 | 0.087 | 1.97 | 0.61 | 0.57 | 57.32 | 0 | 13.55 | 1 | 1 | -0.22 |
| 2026-09-06 | isolation beds | joint | 2 | 53.07 | 1.09 | 0.063 | 1.08 | 0.47 | 0.43 | 44.04 | 0 | 9.03 | 1 | 1 | -0.21 |
| 2026-09-10 | isolation beds | joint | 2 | 53.64 | 1.33 | 0.061 | 1.29 | 0.4 | 0.35 | 44.4 | 0.27 | 8.96 | 1 | 1 | -0.18 |
| 2026-09-12 | isolation beds | joint | 2 | 144.42 | 2.34 | 0.151 | 2.13 | 1.09 | 0.84 | 62.01 | 82.41 | 0 | 0.5 | 1 | 0.58 |
| 2026-09-13 | isolation beds | joint | 1 | 131.39 | 2.73 | 0.139 | 2.53 | 1.24 | 1 | 52.89 | 78.51 | 0 | 0 | 1 | 0.68 |
| 2026-09-15 | isolation beds | joint | 1 | 92.68 | 2.73 | 0.094 | 2.55 | 0.83 | 0.66 | 51.52 | 41.16 | 0 | 0 | 1 | 0.57 |
| 2026-09-16 | isolation beds | joint | 1 | 94.95 | 3.97 | 0.095 | 3.57 | 0.84 | 0.66 | 56.51 | 38.44 | 0 | 0 | 1 | 0.53 |
| 2026-09-19 | isolation beds | joint | 1 | 266.13 | 4 | 0.282 | 3.54 | 2.63 | 2.11 | 53.06 | 213.08 | 0 | 0 | 0 | 0.91 |
| 2026-08-02 | onset reports | joint | 3 | 80.68 | 0.59 | 0.101 | 0.6 | 0.76 | 0.59 | 77.91 | 0 | 2.77 | 1 | 1 | -0.13 |
| 2026-08-03 | onset reports | joint | 3 | 87.1 | 1.31 | 0.119 | 0.97 | 0.88 | 0.76 | 76.49 | 10.61 | 0 | 1 | 1 | 0.22 |
| 2026-08-04 | onset reports | joint | 3 | 83.71 | 0.68 | 0.13 | 0.63 | 0.61 | 0.5 | 74.12 | 2.17 | 7.42 | 1 | 1 | 0 |
| 2026-08-07 | onset reports | joint | 3 | 279.15 | 0.85 | 0.388 | 0.84 | 0.67 | 0.59 | 69 | 0 | 210.15 | 0 | 0.67 | -0.83 |
| 2026-08-11 | onset reports | joint | 3 | 192.72 | 1.2 | 0.285 | 1.24 | 0.8 | 0.67 | 83.45 | 0 | 109.26 | 0.33 | 1 | -0.59 |
| 2026-08-15 | onset reports | joint | 3 | 173.32 | 1.95 | 0.159 | 1.34 | 0.47 | 0.57 | 107.05 | 66.26 | 0 | 0.33 | 1 | 0.44 |
| 2026-08-17 | onset reports | joint | 2 | 102.22 | 1.63 | 0.133 | 1.26 | 0.42 | 0.53 | 78.83 | 23.39 | 0 | 1 | 1 | 0.27 |
| 2026-08-22 | onset reports | joint | 2 | 68.05 | 0.58 | 0.134 | 0.74 | 0.57 | 0.65 | 67.44 | 0 | 0.61 | 1 | 1 | -0.05 |
| 2026-08-24 | onset reports | joint | 1 | 63.9 | 0.89 | 0.303 | 1.8 | 0.76 | 0.78 | 57.5 | 0 | 6.4 | 1 | 1 | -0.2 |
| 2026-08-25 | onset reports | joint | 1 | 62.88 | 0.28 | 0.312 | 0.56 | 0.67 | 0.62 | 61.19 | 1.69 | 0 | 1 | 1 | 0.08 |
| 2026-07-01 | recovered | joint | 3 | 312.69 | 6.63 | 0.446 | 1.94 | 289.55 | 23.14 | 0 | 1 | 1 | 0.27 | ||
| 2026-07-06 | recovered | joint | 4 | 85.76 | 0.8 | 0.407 | 0.88 | 68.39 | 0 | 17.37 | 1 | 1 | -0.33 | ||
| 2026-07-08 | recovered | joint | 4 | 63.08 | 0.76 | 0.292 | 1 | 44.51 | 0 | 18.57 | 1 | 1 | -0.38 | ||
| 2026-09-15 | recovered | joint | 1 | 8.92 | 1.05 | 0.049 | 0.96 | 8.81 | 0.11 | 0 | 1 | 1 | 0.09 | ||
| 2026-09-16 | recovered | joint | 1 | 8.66 | 0.8 | 0.049 | 0.7 | 8.25 | 0.41 | 0 | 1 | 1 | 0.15 | ||
| 2026-09-19 | recovered | joint | 1 | 10.18 | 0.66 | 0.056 | 0.63 | 8.89 | 0 | 1.29 | 1 | 1 | -0.23 |
Forecasts made at each release against the value observed since, one panel per stream and horizon, the observed value in black. The median and 90% interval are coloured by fit role: the persistence baseline, the stream's individual fit and the joint. The x-axis is the date each forecast was made, so an incident stream's observed window pairs unambiguously with the forecast that made it. Each panel's axis is cropped to a small multiple of what that stream actually reached, so one very wide interval cannot squash every other series flat. An interval or median too wide for the panel is clamped at the top and marked with an open triangle rather than silently cut off.
Forecasts-versus-now overlay
forecast_overlay_fig = plot_forecast_overlay(
scored_overlay(forecast_overlay_df)
);
Frozen-fit forecast evaluation
The current model, frozen at earlier data cut-offs (see Forecast-versus-frozen evaluation), is scored the same way as the cross-release forecasts above, against the same persistence baseline. The tables in this section are the frozen joint model's, one row per stream. Each stream's own frozen fit is also scored where one exists, at the one-week-back cut-off and for still-reported streams only, and is carried by the skill figures rather than by the tables. Every other cut-off carries the joint alone. The May cut-offs predate the first reported bed occupancy and the first reported recoveries, so those windows are left unscored rather than scored against a series that had not started. The baseline carries a weaker data-vintage guarantee than the cross-release one, since its snapshot was taken weeks after the frozen cut-off and can hold later revisions to earlier days (see forecast scoring against a persistence baseline).
Load and summarise the frozen-fit forecast scores
frozen_scores_df = _release_data(
"forecast_scores_frozen.csv",
(;
release = String, made_date = Date, stream = String, horizon = Int,
target_date = Date, fit = String, crps = Float64,
log_crps = Float64, dispersion = Float64, overprediction = Float64,
underprediction = Float64, coverage_50 = Float64,
coverage_90 = Float64,
bias = Float64, n_samples = Int,
log_rel_to_baseline = Float64,
)
)
frozen_overlay_df = _release_data(
"forecast_overlay_frozen.csv",
(;
release = String, made_date = Date, stream = String, horizon = Int,
target_date = Date, fit = String, observed = Float64,
median = Float64, lo30 = Float64, hi30 = Float64, lo60 = Float64,
hi60 = Float64, lo90 = Float64, hi90 = Float64,
)
)
# Rows a superseded forecaster produced are dropped before anything is
# summarised or drawn, from the scores and the overlay alike, so the
# tables and the figures rest on one set of rows. See
# `drop_superseded_forecasts` for the one exclusion in force and why.
frozen_scores_df = _drop_rescanned(
drop_superseded_forecasts(frozen_scores_df)
)
frozen_overlay_df = _drop_rescanned(
drop_superseded_forecasts(frozen_overlay_df)
)
# The frozen joint carries `FROZEN_FIT`, so it is named as the joint role
# here and compared against each stream's own frozen fit. A release
# published before the archive had a `fit` column carries joint rows only.
frozen_score_overview_table = forecast_score_overview(
frozen_scores_df; joint_fit = FROZEN_FIT
)
frozen_score_by_horizon_table = forecast_score_by_horizon(
frozen_scores_df; joint_fit = FROZEN_FIT
)
frozen_score_by_release_table = forecast_score_by_release(
frozen_scores_df; joint_fit = FROZEN_FIT
)
# The tables show the frozen joint alone, as the cross-release tables show
# the joint alone, so a row reads as one model at one cut-off rather than a
# stream interleaving two fits. The archive's single-stream frozen fits stay
# in the scored data and in the figures, which compare the roles against
# each other. Selecting the joint role leaves `fit` single-valued, so it is
# dropped and the model named in the prose instead.
_frozen_joint_only(tbl) = drop_degenerate_fit_column(
select_fit_role(tbl, "joint")
)
frozen_score_overview_display = _frozen_joint_only(
frozen_score_overview_table
)
frozen_score_by_horizon_display = _frozen_joint_only(
frozen_score_by_horizon_table
)
frozen_score_by_release_display = _frozen_joint_only(
frozen_score_by_release_table
)
# One row per release for the cut-offs more than one release forecast.
# See the comment above `joint_score_by_release_table`'s assignment for why
# this setup chunk's last statement needs a trailing `;`.
frozen_score_by_vintage_table = forecast_score_by_vintage(
frozen_scores_df; joint_fit = FROZEN_FIT
)
frozen_score_by_vintage_display = _frozen_joint_only(
frozen_score_by_vintage_table
);| stream | n | crps | rel_to_baseline | log_crps | log_rel_to_baseline | rel_to_individual | log_rel_to_individual | dispersion | overprediction | underprediction | coverage_50 | coverage_90 | bias |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| confirmed cases | 247 | 292.73 | 2.42 | 0.364 | 1.15 | 0.47 | 0.55 | 151.03 | 124.9 | 16.81 | 0.41 | 0.79 | 0.27 |
| confirmed deaths | 191 | 46.85 | 0.88 | 0.369 | 0.58 | 2.26 | 2.19 | 27.8 | 13.99 | 5.05 | 0.54 | 0.87 | -0.05 |
| isolation beds | 217 | 89.04 | 0.78 | 0.14 | 0.58 | 0.76 | 0.6 | 45.94 | 24.91 | 18.18 | 0.5 | 0.98 | 0.1 |
| onset reports | 28 | 145.82 | 1.02 | 0.232 | 0.86 | 73.42 | 21.29 | 51.1 | 0.57 | 0.93 | -0.11 | ||
| recovered | 97 | 296.03 | 5.18 | 0.545 | 3.35 | 152.09 | 140.85 | 3.09 | 0.58 | 0.69 | 0.38 |
The same relative skill against the baseline, by horizon, for the frozen cut-offs.
frozen_relative_skill_fig = plot_forecast_relative_skill(
frozen_score_by_horizon_table
);
What that error is made of, by horizon, as in the cross-release section above.
frozen_crps_by_horizon_fig = plot_forecast_crps_by_horizon(
frozen_score_by_horizon_table;
title = "CRPS decomposition by horizon, frozen cut-offs"
);
Scores by horizon
| stream | horizon | n | crps | rel_to_baseline | log_crps | log_rel_to_baseline | rel_to_individual | log_rel_to_individual | dispersion | overprediction | underprediction | coverage_50 | coverage_90 | bias |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| confirmed cases | 7 | 120 | 93.74 | 1.11 | 0.396 | 0.78 | 0.49 | 0.56 | 34.81 | 24.34 | 34.59 | 0.4 | 0.71 | -0.06 |
| confirmed cases | 14 | 56 | 263.28 | 3.81 | 0.285 | 3.36 | 0.46 | 0.52 | 140.12 | 123.15 | 0 | 0.46 | 0.89 | 0.57 |
| confirmed cases | 21 | 52 | 610.68 | 3.92 | 0.422 | 2.66 | 289.25 | 321.44 | 0 | 0.27 | 0.77 | 0.65 | ||
| confirmed cases | 28 | 19 | 766.13 | 1.88 | 0.239 | 1.14 | 538.92 | 227.21 | 0 | 0.68 | 1 | 0.41 | ||
| confirmed deaths | 7 | 106 | 19.84 | 0.8 | 0.51 | 0.62 | 2.31 | 2.24 | 7.12 | 3.64 | 9.09 | 0.47 | 0.78 | -0.36 |
| confirmed deaths | 14 | 42 | 47.96 | 1.12 | 0.173 | 0.7 | 2.22 | 2.1 | 31.64 | 16.27 | 0.05 | 0.79 | 0.98 | 0.3 |
| confirmed deaths | 21 | 38 | 98.54 | 0.72 | 0.221 | 0.34 | 71.4 | 27.14 | 0 | 0.55 | 1 | 0.34 | ||
| confirmed deaths | 28 | 5 | 217.35 | 1.83 | 0.168 | 1.63 | 102.93 | 114.42 | 0 | 0 | 1 | 0.63 | ||
| isolation beds | 7 | 60 | 58.32 | 1.33 | 0.094 | 0.94 | 0.55 | 0.45 | 29.48 | 26.03 | 2.81 | 0.62 | 0.92 | 0.31 |
| isolation beds | 14 | 56 | 79.77 | 1.54 | 0.129 | 1.09 | 1.24 | 0.97 | 43.78 | 32.92 | 3.07 | 0.68 | 1 | 0.32 |
| isolation beds | 21 | 52 | 95.44 | 0.57 | 0.151 | 0.43 | 51.27 | 19.28 | 24.89 | 0.35 | 1 | -0.12 | ||
| isolation beds | 28 | 49 | 130.45 | 0.6 | 0.197 | 0.45 | 62.91 | 20.38 | 47.15 | 0.31 | 1 | -0.2 | ||
| onset reports | 7 | 14 | 98.9 | 0.68 | 0.272 | 0.7 | 52.93 | 14.87 | 31.11 | 0.57 | 0.93 | -0.09 | ||
| onset reports | 14 | 10 | 146.14 | 1.34 | 0.173 | 1.26 | 80.8 | 17.44 | 47.9 | 0.7 | 0.9 | -0.07 | ||
| onset reports | 21 | 4 | 309.22 | 1.39 | 0.238 | 1.34 | 126.71 | 53.42 | 129.09 | 0.25 | 1 | -0.27 | ||
| recovered | 7 | 30 | 117.5 | 5.74 | 0.535 | 3.85 | 42.81 | 73.03 | 1.66 | 0.47 | 0.8 | 0.45 | ||
| recovered | 14 | 26 | 243.96 | 8.62 | 0.548 | 5.33 | 96.3 | 145.18 | 2.48 | 0.54 | 0.58 | 0.43 | ||
| recovered | 21 | 22 | 363.06 | 4.87 | 0.546 | 2.95 | 176.98 | 182.42 | 3.66 | 0.64 | 0.64 | 0.34 | ||
| recovered | 28 | 19 | 571.55 | 4.26 | 0.554 | 2.17 | 372.16 | 193.89 | 5.5 | 0.74 | 0.74 | 0.26 |
The same relative skill against the baseline, cut-off by cut-off, pooled over the horizons each cut-off forecast.
frozen_skill_by_cutoff_fig = plot_forecast_skill_by_cutoff(
frozen_score_by_release_table;
xlabel = "Frozen cut-off",
title = "Relative skill against the baseline, by frozen cut-off"
);
Scores by frozen cut-off
| made_date | stream | n | crps | rel_to_baseline | log_crps | log_rel_to_baseline | rel_to_individual | log_rel_to_individual | dispersion | overprediction | underprediction | coverage_50 | coverage_90 | bias |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 2026-05-23 | confirmed cases | 30 | 28.11 | 0.34 | 0.181 | 0.3 | 19.73 | 0 | 8.37 | 0.7 | 1 | -0.32 | ||
| 2026-05-27 | confirmed cases | 30 | 141.72 | 0.79 | 0.945 | 0.76 | 12.13 | 0 | 129.59 | 0 | 0.1 | -0.94 | ||
| 2026-06-08 | confirmed cases | 90 | 367.57 | 7.44 | 0.402 | 4.21 | 157.96 | 209.62 | 0 | 0.26 | 0.82 | 0.68 | ||
| 2026-07-16 | confirmed cases | 4 | 294.68 | 0.47 | 0.168 | 0.29 | 283.46 | 10.98 | 0.24 | 1 | 1 | 0.07 | ||
| 2026-07-18 | confirmed cases | 4 | 361.26 | 0.78 | 0.185 | 0.52 | 333.85 | 27.41 | 0 | 1 | 1 | 0.15 | ||
| 2026-07-19 | confirmed cases | 4 | 439.62 | 1.09 | 0.209 | 0.72 | 351.83 | 87.79 | 0 | 1 | 1 | 0.3 | ||
| 2026-07-20 | confirmed cases | 4 | 385.62 | 0.87 | 0.185 | 0.56 | 332.6 | 53.02 | 0 | 1 | 1 | 0.22 | ||
| 2026-07-24 | confirmed cases | 4 | 422.92 | 1.34 | 0.192 | 0.95 | 343.7 | 79.22 | 0 | 1 | 1 | 0.32 | ||
| 2026-07-25 | confirmed cases | 4 | 460.72 | 2.03 | 0.209 | 1.54 | 356.82 | 103.91 | 0 | 1 | 1 | 0.34 | ||
| 2026-07-26 | confirmed cases | 4 | 315.56 | 1.48 | 0.164 | 1.27 | 284.59 | 30.97 | 0 | 1 | 1 | 0.24 | ||
| 2026-07-27 | confirmed cases | 4 | 346.39 | 1.76 | 0.176 | 1.33 | 306.97 | 39.42 | 0 | 1 | 1 | 0.27 | ||
| 2026-07-28 | confirmed cases | 4 | 396.78 | 1.34 | 0.156 | 0.84 | 361.52 | 35.26 | 0 | 1 | 1 | 0.22 | ||
| 2026-07-31 | confirmed cases | 4 | 498.38 | 4.08 | 0.213 | 2.74 | 369.58 | 128.8 | 0 | 0.75 | 1 | 0.38 | ||
| 2026-08-04 | confirmed cases | 4 | 281.57 | 2.97 | 0.156 | 2.7 | 253.99 | 27.59 | 0 | 1 | 1 | 0.18 | ||
| 2026-08-08 | confirmed cases | 4 | 253.51 | 3.22 | 0.15 | 2.27 | 246.67 | 6.12 | 0.72 | 1 | 1 | 0.03 | ||
| 2026-08-10 | confirmed cases | 4 | 244.51 | 3.74 | 0.15 | 2.78 | 241 | 1.7 | 1.81 | 1 | 1 | -0.01 | ||
| 2026-08-15 | confirmed cases | 4 | 623.4 | 11.74 | 0.281 | 6.2 | 384.1 | 239.3 | 0 | 0.25 | 1 | 0.52 | ||
| 2026-08-17 | confirmed cases | 4 | 426.55 | 5.49 | 0.234 | 3.51 | 166.54 | 260.01 | 0 | 0 | 1 | 0.75 | ||
| 2026-08-18 | confirmed cases | 4 | 468.25 | 3.91 | 0.276 | 2.8 | 155.86 | 312.4 | 0 | 0 | 0.75 | 0.85 | ||
| 2026-08-23 | confirmed cases | 4 | 562.74 | 7.99 | 0.314 | 6.34 | 140.78 | 421.96 | 0 | 0 | 0.75 | 0.88 | ||
| 2026-08-24 | confirmed cases | 4 | 437.04 | 6.82 | 0.246 | 5.48 | 160.51 | 276.53 | 0 | 0 | 0.75 | 0.82 | ||
| 2026-08-25 | confirmed cases | 4 | 288.32 | 4.34 | 0.176 | 4.06 | 113.18 | 175.14 | 0 | 0 | 1 | 0.74 | ||
| 2026-08-30 | confirmed cases | 3 | 126.37 | 2.5 | 0.094 | 1.82 | 79.52 | 46.86 | 0 | 0.67 | 1 | 0.44 | ||
| 2026-09-03 | confirmed cases | 3 | 199.66 | 3.57 | 0.141 | 3.08 | 73.77 | 125.89 | 0 | 0 | 1 | 0.68 | ||
| 2026-09-05 | confirmed cases | 3 | 86.86 | 1.33 | 0.07 | 1.29 | 71.99 | 14.41 | 0.46 | 1 | 1 | 0.12 | ||
| 2026-09-06 | confirmed cases | 2 | 171.32 | 5.6 | 0.16 | 4.43 | 71.07 | 100.25 | 0 | 0 | 1 | 0.65 | ||
| 2026-09-08 | confirmed cases | 2 | 177.68 | 3.46 | 0.172 | 2.96 | 0.3 | 0.33 | 73.15 | 104.53 | 0 | 0 | 1 | 0.68 |
| 2026-09-09 | confirmed cases | 2 | 253.51 | 3.2 | 0.246 | 2.75 | 0.42 | 0.43 | 79.73 | 173.78 | 0 | 0 | 0.5 | 0.81 |
| 2026-09-12 | confirmed cases | 2 | 381.77 | 2.59 | 0.41 | 2.2 | 0.53 | 0.59 | 65.93 | 315.84 | 0 | 0 | 0 | 0.96 |
| 2026-09-14 | confirmed cases | 1 | 223.9 | 1.76 | 0.407 | 1.6 | 0.54 | 0.62 | 31.54 | 192.36 | 0 | 0 | 0 | 0.98 |
| 2026-09-15 | confirmed cases | 1 | 255.02 | 2.34 | 0.463 | 2.07 | 0.63 | 0.69 | 33.78 | 221.24 | 0 | 0 | 0 | 1 |
| 2026-09-18 | confirmed cases | 1 | 227.71 | 2.72 | 0.461 | 2.39 | 0.58 | 0.66 | 27.64 | 200.07 | 0 | 0 | 0 | 0.99 |
| 2026-09-19 | confirmed cases | 1 | 183.32 | 4.12 | 0.365 | 3.58 | 0.62 | 0.68 | 33.5 | 149.82 | 0 | 0 | 0 | 0.97 |
| 2026-05-23 | confirmed deaths | 30 | 8.15 | 0.33 | 0.355 | 0.25 | 3.47 | 0 | 4.68 | 0.4 | 1 | -0.51 | ||
| 2026-05-27 | confirmed deaths | 30 | 27.84 | 0.86 | 1.184 | 0.99 | 2.11 | 0 | 25.72 | 0 | 0.4 | -0.92 | ||
| 2026-06-08 | confirmed deaths | 90 | 48.08 | 0.7 | 0.207 | 0.46 | 39.61 | 7.94 | 0.54 | 0.88 | 1 | 0.11 | ||
| 2026-08-17 | confirmed deaths | 4 | 91.87 | 1.81 | 0.097 | 1.27 | 59.3 | 32.57 | 0 | 0.5 | 1 | 0.44 | ||
| 2026-08-18 | confirmed deaths | 4 | 115.9 | 1.32 | 0.134 | 1.02 | 55.91 | 59.99 | 0 | 0 | 1 | 0.63 | ||
| 2026-08-23 | confirmed deaths | 4 | 145.19 | 1.72 | 0.166 | 1.51 | 51.71 | 93.48 | 0 | 0 | 1 | 0.72 | ||
| 2026-08-24 | confirmed deaths | 4 | 110.91 | 1.55 | 0.12 | 1.37 | 55.2 | 55.71 | 0 | 0.25 | 1 | 0.53 | ||
| 2026-08-25 | confirmed deaths | 4 | 87.42 | 1.25 | 0.1 | 1.22 | 44.65 | 42.77 | 0 | 0.25 | 1 | 0.53 | ||
| 2026-08-30 | confirmed deaths | 3 | 47.79 | 1.03 | 0.077 | 1.14 | 29.41 | 18.38 | 0 | 0.67 | 1 | 0.47 | ||
| 2026-09-03 | confirmed deaths | 3 | 66.07 | 1.5 | 0.096 | 1.3 | 29.06 | 37.01 | 0 | 0.33 | 1 | 0.48 | ||
| 2026-09-05 | confirmed deaths | 3 | 37.51 | 0.92 | 0.066 | 0.86 | 28.76 | 7.49 | 1.26 | 1 | 1 | 0.1 | ||
| 2026-09-06 | confirmed deaths | 2 | 29.36 | 1.4 | 0.071 | 1.45 | 23.42 | 5.32 | 0.62 | 1 | 1 | 0.14 | ||
| 2026-09-08 | confirmed deaths | 2 | 63.06 | 1.87 | 0.129 | 1.71 | 1.76 | 1.59 | 27.01 | 36.05 | 0 | 0.5 | 1 | 0.62 |
| 2026-09-09 | confirmed deaths | 2 | 85.22 | 1.76 | 0.179 | 1.67 | 2.39 | 2.07 | 28.32 | 56.89 | 0 | 0 | 1 | 0.76 |
| 2026-09-12 | confirmed deaths | 2 | 114.03 | 1.54 | 0.265 | 1.33 | 1.96 | 1.81 | 23.44 | 90.59 | 0 | 0 | 0 | 0.94 |
| 2026-09-14 | confirmed deaths | 1 | 60.69 | 1.44 | 0.241 | 1.39 | 2.15 | 2.1 | 11.71 | 48.98 | 0 | 0 | 0 | 0.95 |
| 2026-09-15 | confirmed deaths | 1 | 75.86 | 1.66 | 0.309 | 1.58 | 2.62 | 2.5 | 11.29 | 64.57 | 0 | 0 | 0 | 0.99 |
| 2026-09-18 | confirmed deaths | 1 | 90.94 | 2.09 | 0.406 | 1.92 | 2.69 | 2.5 | 11.2 | 79.75 | 0 | 0 | 0 | 1 |
| 2026-09-19 | confirmed deaths | 1 | 70.77 | 5.18 | 0.29 | 4.63 | 5.27 | 4.67 | 10.71 | 60.06 | 0 | 0 | 0 | 0.97 |
| 2026-06-08 | isolation beds | 120 | 83.01 | 0.49 | 0.155 | 0.4 | 44.92 | 8.42 | 29.68 | 0.52 | 1 | -0.13 | ||
| 2026-07-16 | isolation beds | 4 | 73.22 | 2.35 | 0.096 | 2.24 | 20.01 | 53.22 | 0 | 0 | 1 | 0.6 | ||
| 2026-07-18 | isolation beds | 4 | 77.78 | 2.45 | 0.103 | 2.33 | 18.71 | 59.07 | 0 | 0 | 1 | 0.61 | ||
| 2026-07-19 | isolation beds | 4 | 100.01 | 3.48 | 0.132 | 3.31 | 22.38 | 77.63 | 0 | 0 | 1 | 0.64 | ||
| 2026-07-20 | isolation beds | 4 | 82.23 | 2.79 | 0.106 | 2.64 | 19.89 | 62.33 | 0 | 0.25 | 1 | 0.61 | ||
| 2026-07-24 | isolation beds | 4 | 76.61 | 2.6 | 0.096 | 2.44 | 10.14 | 66.47 | 0 | 0 | 1 | 0.73 | ||
| 2026-07-25 | isolation beds | 4 | 106.43 | 2.83 | 0.136 | 2.73 | 13.84 | 92.59 | 0 | 0 | 0.75 | 0.73 | ||
| 2026-07-26 | isolation beds | 4 | 94.88 | 2.43 | 0.122 | 2.29 | 22.61 | 72.27 | 0 | 0.25 | 0.75 | 0.63 | ||
| 2026-07-27 | isolation beds | 4 | 85.56 | 2.77 | 0.113 | 2.68 | 38.92 | 46.65 | 0 | 0.5 | 1 | 0.48 | ||
| 2026-07-28 | isolation beds | 4 | 153.08 | 2.9 | 0.201 | 2.6 | 41.15 | 111.94 | 0 | 0.5 | 0.75 | 0.67 | ||
| 2026-07-31 | isolation beds | 4 | 119.06 | 3.04 | 0.139 | 2.78 | 41.36 | 77.7 | 0 | 0.5 | 0.75 | 0.57 | ||
| 2026-08-04 | isolation beds | 4 | 110.51 | 1.45 | 0.153 | 1.39 | 63.26 | 47.24 | 0 | 0.75 | 0.75 | 0.42 | ||
| 2026-08-08 | isolation beds | 4 | 59.17 | 0.93 | 0.078 | 0.95 | 51.54 | 7.15 | 0.48 | 0.75 | 1 | 0.16 | ||
| 2026-08-10 | isolation beds | 4 | 55.99 | 1.13 | 0.079 | 1.18 | 55.83 | 0.02 | 0.15 | 1 | 1 | 0 | ||
| 2026-08-15 | isolation beds | 4 | 109.36 | 1.22 | 0.115 | 1.01 | 74.07 | 35.3 | 0 | 1 | 1 | 0.34 | ||
| 2026-08-17 | isolation beds | 4 | 103.6 | 2.03 | 0.111 | 1.73 | 72.62 | 30.98 | 0 | 0.75 | 1 | 0.43 | ||
| 2026-08-18 | isolation beds | 4 | 93.5 | 1.23 | 0.1 | 1.03 | 71.31 | 22.19 | 0 | 0.75 | 1 | 0.34 | ||
| 2026-08-23 | isolation beds | 4 | 145.69 | 3.68 | 0.149 | 3.15 | 60.67 | 85.02 | 0 | 0 | 1 | 0.66 | ||
| 2026-08-24 | isolation beds | 4 | 108.37 | 2.49 | 0.113 | 2.11 | 68.47 | 39.9 | 0 | 0.5 | 1 | 0.46 | ||
| 2026-08-25 | isolation beds | 4 | 71.1 | 1.04 | 0.087 | 1.02 | 60.24 | 0 | 10.86 | 1 | 1 | -0.27 | ||
| 2026-08-30 | isolation beds | 3 | 61.34 | 1.5 | 0.077 | 1.55 | 50.26 | 0 | 11.08 | 1 | 1 | -0.2 | ||
| 2026-09-03 | isolation beds | 3 | 68.39 | 0.85 | 0.085 | 0.83 | 43.71 | 0 | 24.68 | 0.67 | 1 | -0.42 | ||
| 2026-09-05 | isolation beds | 3 | 75.38 | 1.73 | 0.094 | 1.84 | 54.64 | 0 | 20.74 | 0.67 | 1 | -0.34 | ||
| 2026-09-06 | isolation beds | 2 | 237.05 | 5.49 | 0.533 | 10.43 | 154.34 | 0 | 82.72 | 0.5 | 1 | -0.47 | ||
| 2026-09-08 | isolation beds | 2 | 72.9 | 1.39 | 0.076 | 1.24 | 0.5 | 0.38 | 64.61 | 6.77 | 1.52 | 1 | 1 | 0.05 |
| 2026-09-09 | isolation beds | 2 | 90.52 | 1.79 | 0.089 | 1.48 | 0.66 | 0.47 | 69.77 | 20.75 | 0 | 1 | 1 | 0.3 |
| 2026-09-12 | isolation beds | 2 | 172.61 | 3.08 | 0.18 | 2.78 | 1.38 | 1.1 | 52.96 | 119.65 | 0 | 0 | 1 | 0.72 |
| 2026-09-14 | isolation beds | 1 | 93.69 | 1.59 | 0.101 | 1.54 | 0.84 | 0.7 | 36.94 | 56.75 | 0 | 0 | 1 | 0.75 |
| 2026-09-15 | isolation beds | 1 | 66.1 | 2 | 0.069 | 1.91 | 0.55 | 0.46 | 37.72 | 28.38 | 0 | 0 | 1 | 0.52 |
| 2026-09-18 | isolation beds | 1 | 55.42 | 1.08 | 0.062 | 1.06 | 0.46 | 0.43 | 28.75 | 26.67 | 0 | 0 | 1 | 0.57 |
| 2026-09-19 | isolation beds | 1 | 77.62 | 1.17 | 0.09 | 1.14 | 0.73 | 0.68 | 38.49 | 39.13 | 0 | 0 | 1 | 0.57 |
| 2026-07-26 | onset reports | 2 | 67.72 | 2.22 | 0.119 | 2.02 | 65.22 | 2.5 | 0 | 1 | 1 | 0.12 | ||
| 2026-07-27 | onset reports | 2 | 68.01 | 1.04 | 0.12 | 0.85 | 56.66 | 1.35 | 10.01 | 1 | 1 | -0.15 | ||
| 2026-07-28 | onset reports | 2 | 78.72 | 0.49 | 0.129 | 0.38 | 61.39 | 6.66 | 10.67 | 1 | 1 | -0.07 | ||
| 2026-07-31 | onset reports | 2 | 117.02 | 0.69 | 0.239 | 0.6 | 75.72 | 41.3 | 0 | 0.5 | 1 | 0.4 | ||
| 2026-08-04 | onset reports | 3 | 93.15 | 0.75 | 0.136 | 0.64 | 67.9 | 1.33 | 23.92 | 1 | 1 | -0.13 | ||
| 2026-08-08 | onset reports | 3 | 339.7 | 0.73 | 0.476 | 0.64 | 71.38 | 0 | 268.33 | 0 | 0.33 | -0.88 | ||
| 2026-08-10 | onset reports | 3 | 199.84 | 1.86 | 0.31 | 1.83 | 66.1 | 0 | 133.74 | 0 | 1 | -0.7 | ||
| 2026-08-15 | onset reports | 3 | 267.22 | 3.06 | 0.221 | 1.9 | 135.96 | 131.25 | 0 | 0 | 1 | 0.66 | ||
| 2026-08-17 | onset reports | 2 | 85.09 | 1.29 | 0.181 | 1.59 | 71.82 | 0 | 13.26 | 1 | 1 | -0.26 | ||
| 2026-08-18 | onset reports | 2 | 113.52 | 1.37 | 0.238 | 1.68 | 78.01 | 0 | 35.51 | 0.5 | 1 | -0.32 | ||
| 2026-08-23 | onset reports | 1 | 65.01 | 0.97 | 0.223 | 1.38 | 58.23 | 0 | 6.78 | 1 | 1 | -0.2 | ||
| 2026-08-24 | onset reports | 1 | 69.42 | 0.87 | 0.319 | 1.74 | 62.25 | 0 | 7.17 | 1 | 1 | -0.19 | ||
| 2026-08-25 | onset reports | 1 | 117.72 | 0.55 | 0.335 | 0.64 | 35.28 | 82.44 | 0 | 0 | 1 | 0.8 | ||
| 2026-09-09 | onset reports | 1 | 70.84 | 0.53 | 0.13 | 0.24 | 58.46 | 12.38 | 0 | 1 | 1 | 0.26 | ||
| 2026-07-16 | recovered | 4 | 139.34 | 1.07 | 0.469 | 1.06 | 135.5 | 0 | 3.84 | 1 | 1 | -0.1 | ||
| 2026-07-18 | recovered | 4 | 149.61 | 2.25 | 0.455 | 2.19 | 146.94 | 2.67 | 0 | 1 | 1 | 0.1 | ||
| 2026-07-19 | recovered | 4 | 181.47 | 2.29 | 0.482 | 2.16 | 179.35 | 2.12 | 0 | 1 | 1 | 0.07 | ||
| 2026-07-20 | recovered | 4 | 171.81 | 2.04 | 0.417 | 1.84 | 169.63 | 2.18 | 0 | 1 | 1 | 0.06 | ||
| 2026-07-24 | recovered | 4 | 179.37 | 2.38 | 0.409 | 2.01 | 175.36 | 4.01 | 0 | 1 | 1 | 0.13 | ||
| 2026-07-25 | recovered | 4 | 177.7 | 2.08 | 0.379 | 1.7 | 173.52 | 4.18 | 0 | 1 | 1 | 0.12 | ||
| 2026-07-26 | recovered | 4 | 139.99 | 1.56 | 0.381 | 1.66 | 138.99 | 0 | 1 | 1 | 1 | -0.05 | ||
| 2026-07-27 | recovered | 4 | 219.87 | 2.18 | 0.483 | 1.85 | 218.38 | 0 | 1.49 | 1 | 1 | -0.06 | ||
| 2026-07-28 | recovered | 4 | 544.07 | 3.96 | 0.369 | 0.9 | 543.25 | 0.5 | 0.33 | 1 | 1 | 0.02 | ||
| 2026-07-31 | recovered | 4 | 249.16 | 2.45 | 0.402 | 1.51 | 242.91 | 6.25 | 0 | 1 | 1 | 0.12 | ||
| 2026-08-04 | recovered | 4 | 157.98 | 2.25 | 0.457 | 2.57 | 146.41 | 0 | 11.57 | 1 | 1 | -0.19 | ||
| 2026-08-08 | recovered | 4 | 125.59 | 1.62 | 0.417 | 2.14 | 109.72 | 0 | 15.87 | 1 | 1 | -0.23 | ||
| 2026-08-10 | recovered | 4 | 157.1 | 1.85 | 0.537 | 2.38 | 116.31 | 0 | 40.79 | 1 | 1 | -0.32 | ||
| 2026-08-15 | recovered | 4 | 384.45 | 11.89 | 0.442 | 5.52 | 335.62 | 48.83 | 0 | 1 | 1 | 0.29 | ||
| 2026-08-17 | recovered | 4 | 548.58 | 22.7 | 0.779 | 9.99 | 117.93 | 430.64 | 0 | 0 | 0 | 0.94 | ||
| 2026-08-18 | recovered | 4 | 596.27 | 24.45 | 0.834 | 11.41 | 99.02 | 497.25 | 0 | 0 | 0 | 0.95 | ||
| 2026-08-23 | recovered | 4 | 553.29 | 28.69 | 0.739 | 14.14 | 114.01 | 439.28 | 0 | 0 | 0.25 | 0.92 | ||
| 2026-08-24 | recovered | 4 | 518.58 | 28.3 | 0.726 | 14.89 | 112.37 | 406.22 | 0 | 0 | 0 | 0.94 | ||
| 2026-08-25 | recovered | 4 | 500.24 | 32.49 | 0.716 | 16.48 | 90.53 | 409.71 | 0 | 0 | 0 | 0.96 | ||
| 2026-08-30 | recovered | 3 | 355.34 | 23.6 | 0.641 | 12.58 | 77.58 | 277.76 | 0 | 0 | 0.33 | 0.92 | ||
| 2026-09-03 | recovered | 3 | 399.71 | 31.33 | 0.706 | 17.62 | 72.05 | 327.66 | 0 | 0 | 0.33 | 0.9 | ||
| 2026-09-05 | recovered | 3 | 306.82 | 21.73 | 0.594 | 12.7 | 69.91 | 236.9 | 0 | 0 | 0.33 | 0.9 | ||
| 2026-09-06 | recovered | 2 | 130.92 | 10.43 | 0.349 | 6.54 | 63.38 | 67.54 | 0 | 0 | 1 | 0.65 | ||
| 2026-09-08 | recovered | 2 | 307.35 | 28.32 | 0.718 | 15.82 | 61.07 | 246.29 | 0 | 0 | 0.5 | 0.88 | ||
| 2026-09-09 | recovered | 2 | 325.78 | 17.68 | 0.814 | 10.94 | 60.31 | 265.48 | 0 | 0 | 0 | 0.95 | ||
| 2026-09-12 | recovered | 2 | 291.73 | 27.95 | 0.675 | 15.17 | 64.47 | 227.26 | 0 | 0 | 0.5 | 0.9 | ||
| 2026-09-14 | recovered | 1 | 152.31 | 13.74 | 0.558 | 8.49 | 31.66 | 120.65 | 0 | 0 | 0 | 0.9 | ||
| 2026-09-15 | recovered | 1 | 156.43 | 17.2 | 0.58 | 10.52 | 38.33 | 118.1 | 0 | 0 | 1 | 0.86 | ||
| 2026-09-18 | recovered | 1 | 166.45 | 19.95 | 0.632 | 12.78 | 28.76 | 137.69 | 0 | 0 | 1 | 0.89 | ||
| 2026-09-19 | recovered | 1 | 164.68 | 10.93 | 0.57 | 6.58 | 33.81 | 130.86 | 0 | 0 | 1 | 0.86 |
Frozen skill by release
Skill at each cut-off more than one release forecast, one point per release rather than pooled across releases. Releases run in the order they were cut, evenly spaced rather than to calendar scale.
Frozen skill per release
frozen_skill_by_vintage_fig = plot_forecast_skill_by_vintage(
frozen_score_by_vintage_table
);
Frozen scores by release
| stream | release | release_date | n | crps | rel_to_baseline | log_crps | log_rel_to_baseline | rel_to_individual | log_rel_to_individual | dispersion | overprediction | underprediction | coverage_50 | coverage_90 | bias |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| confirmed cases | results-1359 | 2026-07-16 | 5 | 242.1 | 3 | 0.454 | 1.08 | 121.44 | 95.46 | 25.2 | 0.6 | 1 | 0.07 | ||
| confirmed cases | results-1391 | 2026-07-18 | 5 | 242.1 | 2.94 | 0.454 | 1.04 | 121.44 | 95.46 | 25.2 | 0.6 | 1 | 0.07 | ||
| confirmed cases | results-1394 | 2026-07-19 | 5 | 242.1 | 3 | 0.454 | 1.07 | 121.44 | 95.46 | 25.2 | 0.6 | 1 | 0.07 | ||
| confirmed cases | results-1441 | 2026-07-20 | 5 | 245.99 | 3.05 | 0.466 | 1.08 | 113.62 | 106.92 | 25.45 | 0.2 | 0.8 | 0.16 | ||
| confirmed cases | results-1446 | 2026-07-24 | 5 | 245.99 | 2.94 | 0.466 | 1.07 | 113.62 | 106.92 | 25.45 | 0.2 | 0.8 | 0.16 | ||
| confirmed cases | results-v1.12.0 | 2026-07-25 | 5 | 245.99 | 2.97 | 0.466 | 1.08 | 113.62 | 106.92 | 25.45 | 0.2 | 0.8 | 0.16 | ||
| confirmed cases | results-1462 | 2026-07-26 | 5 | 247.61 | 3.03 | 0.458 | 1.06 | 122.27 | 99.46 | 25.89 | 0.6 | 0.8 | 0.13 | ||
| confirmed cases | results-1469 | 2026-07-27 | 5 | 247.61 | 2.96 | 0.458 | 1.07 | 122.27 | 99.46 | 25.89 | 0.6 | 0.8 | 0.13 | ||
| confirmed cases | results-1479 | 2026-07-28 | 5 | 247.61 | 2.97 | 0.458 | 1.04 | 122.27 | 99.46 | 25.89 | 0.6 | 0.8 | 0.13 | ||
| confirmed cases | results-1489 | 2026-07-31 | 5 | 247.61 | 3.04 | 0.458 | 1.06 | 122.27 | 99.46 | 25.89 | 0.6 | 0.8 | 0.13 | ||
| confirmed cases | results-v1.13.2 | 2026-08-04 | 5 | 247.61 | 3.06 | 0.458 | 1.08 | 122.27 | 99.46 | 25.89 | 0.6 | 0.8 | 0.13 | ||
| confirmed cases | results-1505 | 2026-08-08 | 5 | 247.61 | 2.99 | 0.458 | 1.06 | 122.27 | 99.46 | 25.89 | 0.6 | 0.8 | 0.13 | ||
| confirmed cases | results-1527 | 2026-08-10 | 5 | 247.61 | 3.17 | 0.458 | 1.08 | 122.27 | 99.46 | 25.89 | 0.6 | 0.8 | 0.13 | ||
| confirmed cases | results-1573 | 2026-08-15 | 5 | 256.51 | 3.1 | 0.471 | 1.08 | 131.58 | 99.04 | 25.89 | 0.4 | 0.8 | 0.13 | ||
| confirmed cases | results-1591 | 2026-08-17 | 5 | 304.06 | 3.67 | 0.509 | 1.19 | 85.78 | 190.69 | 27.59 | 0.2 | 0.6 | 0.3 | ||
| confirmed cases | results-v1.15.0 | 2026-08-18 | 5 | 304.06 | 3.74 | 0.509 | 1.18 | 85.78 | 190.69 | 27.59 | 0.2 | 0.6 | 0.3 | ||
| confirmed cases | results-v1.16.0 | 2026-08-23 | 5 | 318.57 | 3.64 | 0.513 | 1.18 | 95.65 | 195.73 | 27.19 | 0.2 | 0.4 | 0.3 | ||
| confirmed cases | results-1625 | 2026-08-24 | 5 | 318.42 | 3.9 | 0.513 | 1.22 | 95.56 | 195.73 | 27.13 | 0.2 | 0.4 | 0.3 | ||
| confirmed cases | results-v1.17.0 | 2026-08-25 | 5 | 278.34 | 3.41 | 0.471 | 1.1 | 82.69 | 170.13 | 25.51 | 0.2 | 0.4 | 0.28 | ||
| confirmed cases | results-v1.18.0 | 2026-08-30 | 5 | 278.34 | 3.43 | 0.471 | 1.11 | 82.69 | 170.13 | 25.51 | 0.2 | 0.4 | 0.28 | ||
| confirmed cases | results-1739 | 2026-09-03 | 5 | 288.7 | 3.5 | 0.475 | 1.1 | 92.73 | 169.11 | 26.86 | 0.2 | 0.6 | 0.22 | ||
| confirmed cases | results-1828 | 2026-09-05 | 5 | 285.09 | 3.46 | 0.505 | 1.19 | 102.17 | 151.58 | 31.35 | 0 | 0.6 | 0.15 | ||
| confirmed cases | results-1858 | 2026-09-06 | 5 | 290.99 | 3.57 | 0.509 | 1.18 | 88.02 | 171.62 | 31.35 | 0 | 0.6 | 0.14 | ||
| confirmed cases | results-1970 | 2026-09-08 | 5 | 295.58 | 3.45 | 0.518 | 1.17 | 96.92 | 166.9 | 31.77 | 0 | 0.6 | 0.15 | ||
| confirmed cases | results-v2.1.0 | 2026-09-09 | 5 | 295.58 | 3.7 | 0.518 | 1.27 | 96.92 | 166.9 | 31.77 | 0 | 0.6 | 0.15 | ||
| confirmed cases | results-2177 | 2026-09-12 | 5 | 311.38 | 4 | 0.501 | 1.2 | 106.74 | 175.69 | 28.95 | 0 | 0.6 | 0.19 | ||
| confirmed cases | results-2360 | 2026-09-14 | 5 | 174.79 | 2.14 | 0.422 | 0.99 | 66.84 | 74.44 | 33.51 | 0 | 0.8 | 0.07 | ||
| confirmed cases | results-2506 | 2026-09-15 | 5 | 140.97 | 1.73 | 0.362 | 0.86 | 58.18 | 53.18 | 29.61 | 0.2 | 0.8 | 0.02 | ||
| confirmed cases | results-2536 | 2026-09-18 | 5 | 135.09 | 1.6 | 0.366 | 0.84 | 48.92 | 55.08 | 31.09 | 0.2 | 0.8 | 0.03 | ||
| confirmed cases | results-2720 | 2026-09-19 | 5 | 161.24 | 1.98 | 0.399 | 0.96 | 56.22 | 73.12 | 31.89 | 0 | 0.8 | 0.08 | ||
| confirmed deaths | results-1359 | 2026-07-16 | 5 | 36.61 | 0.69 | 0.553 | 0.69 | 28.04 | 0.07 | 8.49 | 0.6 | 0.8 | -0.39 | ||
| confirmed deaths | results-1391 | 2026-07-18 | 5 | 36.61 | 0.7 | 0.553 | 0.71 | 28.04 | 0.07 | 8.49 | 0.6 | 0.8 | -0.39 | ||
| confirmed deaths | results-1394 | 2026-07-19 | 5 | 36.61 | 0.7 | 0.553 | 0.69 | 28.04 | 0.07 | 8.49 | 0.6 | 0.8 | -0.39 | ||
| confirmed deaths | results-1441 | 2026-07-20 | 5 | 37.95 | 0.74 | 0.579 | 0.74 | 28.76 | 0.44 | 8.76 | 0.6 | 0.8 | -0.35 | ||
| confirmed deaths | results-1446 | 2026-07-24 | 5 | 37.95 | 0.74 | 0.579 | 0.74 | 28.76 | 0.44 | 8.76 | 0.6 | 0.8 | -0.35 | ||
| confirmed deaths | results-v1.12.0 | 2026-07-25 | 5 | 37.95 | 0.71 | 0.579 | 0.73 | 28.76 | 0.44 | 8.76 | 0.6 | 0.8 | -0.35 | ||
| confirmed deaths | results-1462 | 2026-07-26 | 5 | 37.32 | 0.7 | 0.635 | 0.79 | 27.48 | 0 | 9.84 | 0.6 | 0.8 | -0.43 | ||
| confirmed deaths | results-1469 | 2026-07-27 | 5 | 37.32 | 0.73 | 0.635 | 0.82 | 27.48 | 0 | 9.84 | 0.6 | 0.8 | -0.43 | ||
| confirmed deaths | results-1479 | 2026-07-28 | 5 | 37.32 | 0.71 | 0.635 | 0.8 | 27.48 | 0 | 9.84 | 0.6 | 0.8 | -0.43 | ||
| confirmed deaths | results-1489 | 2026-07-31 | 5 | 37.32 | 0.7 | 0.635 | 0.79 | 27.48 | 0 | 9.84 | 0.6 | 0.8 | -0.43 | ||
| confirmed deaths | results-v1.13.2 | 2026-08-04 | 5 | 37.32 | 0.69 | 0.635 | 0.78 | 27.48 | 0 | 9.84 | 0.6 | 0.8 | -0.43 | ||
| confirmed deaths | results-1505 | 2026-08-08 | 5 | 37.32 | 0.7 | 0.635 | 0.8 | 27.48 | 0 | 9.84 | 0.6 | 0.8 | -0.43 | ||
| confirmed deaths | results-1527 | 2026-08-10 | 5 | 37.32 | 0.7 | 0.635 | 0.81 | 27.48 | 0 | 9.84 | 0.6 | 0.8 | -0.43 | ||
| confirmed deaths | results-1573 | 2026-08-15 | 5 | 37.79 | 0.71 | 0.631 | 0.78 | 27.84 | 0.14 | 9.82 | 0.6 | 0.8 | -0.4 | ||
| confirmed deaths | results-1591 | 2026-08-17 | 5 | 36.94 | 0.71 | 0.288 | 0.37 | 20.9 | 12.14 | 3.9 | 0.6 | 1 | 0 | ||
| confirmed deaths | results-v1.15.0 | 2026-08-18 | 5 | 36.94 | 0.72 | 0.288 | 0.37 | 20.9 | 12.14 | 3.9 | 0.6 | 1 | 0 | ||
| confirmed deaths | results-v1.16.0 | 2026-08-23 | 5 | 38.99 | 0.75 | 0.27 | 0.34 | 24.17 | 11.59 | 3.22 | 0.6 | 1 | 0.04 | ||
| confirmed deaths | results-1625 | 2026-08-24 | 5 | 38.96 | 0.78 | 0.27 | 0.35 | 24.15 | 11.59 | 3.22 | 0.6 | 1 | 0.05 | ||
| confirmed deaths | results-v1.17.0 | 2026-08-25 | 5 | 35.05 | 0.67 | 0.256 | 0.32 | 21.96 | 10.14 | 2.94 | 0.6 | 1 | -0.03 | ||
| confirmed deaths | results-v1.18.0 | 2026-08-30 | 5 | 35.05 | 0.67 | 0.256 | 0.32 | 21.96 | 10.14 | 2.94 | 0.6 | 1 | -0.03 | ||
| confirmed deaths | results-1739 | 2026-09-03 | 5 | 34.71 | 0.66 | 0.274 | 0.34 | 22.91 | 8.35 | 3.45 | 0.6 | 1 | -0.02 | ||
| confirmed deaths | results-1828 | 2026-09-05 | 5 | 28.72 | 0.55 | 0.295 | 0.38 | 20.39 | 3.26 | 5.07 | 0.6 | 0.8 | -0.21 | ||
| confirmed deaths | results-1858 | 2026-09-06 | 5 | 35.33 | 0.68 | 0.314 | 0.4 | 21.97 | 8.26 | 5.1 | 0.6 | 0.8 | -0.17 | ||
| confirmed deaths | results-1970 | 2026-09-08 | 5 | 31.57 | 0.59 | 0.296 | 0.37 | 22.6 | 4.24 | 4.73 | 0.6 | 0.8 | -0.19 | ||
| confirmed deaths | results-v2.1.0 | 2026-09-09 | 5 | 31.57 | 0.6 | 0.296 | 0.37 | 22.6 | 4.24 | 4.73 | 0.6 | 0.8 | -0.19 | ||
| confirmed deaths | results-2177 | 2026-09-12 | 5 | 39.44 | 0.77 | 0.293 | 0.38 | 25.67 | 9.91 | 3.86 | 0.6 | 1 | -0.05 | ||
| confirmed deaths | results-2360 | 2026-09-14 | 5 | 41.87 | 0.8 | 0.294 | 0.38 | 23.54 | 14.65 | 3.68 | 0.4 | 1 | 0.01 | ||
| confirmed deaths | results-2506 | 2026-09-15 | 5 | 28.5 | 0.55 | 0.252 | 0.32 | 20.71 | 4.24 | 3.55 | 0.8 | 1 | -0.1 | ||
| confirmed deaths | results-2536 | 2026-09-18 | 5 | 31.72 | 0.62 | 0.275 | 0.36 | 20.54 | 7.35 | 3.83 | 0.8 | 1 | -0.08 | ||
| confirmed deaths | results-2720 | 2026-09-19 | 5 | 33.37 | 0.64 | 0.273 | 0.35 | 20.93 | 8.92 | 3.52 | 0.6 | 1 | -0.01 | ||
| isolation beds | results-1359 | 2026-07-16 | 4 | 77.62 | 0.47 | 0.158 | 0.41 | 41.55 | 1.54 | 34.54 | 0.5 | 1 | -0.22 | ||
| isolation beds | results-1391 | 2026-07-18 | 4 | 77.62 | 0.46 | 0.158 | 0.41 | 41.55 | 1.54 | 34.54 | 0.5 | 1 | -0.22 | ||
| isolation beds | results-1394 | 2026-07-19 | 4 | 77.62 | 0.45 | 0.158 | 0.4 | 41.55 | 1.54 | 34.54 | 0.5 | 1 | -0.22 | ||
| isolation beds | results-1441 | 2026-07-20 | 4 | 77.32 | 0.46 | 0.158 | 0.41 | 38.49 | 1.02 | 37.81 | 0.5 | 1 | -0.22 | ||
| isolation beds | results-1446 | 2026-07-24 | 4 | 77.32 | 0.45 | 0.158 | 0.39 | 38.49 | 1.02 | 37.81 | 0.5 | 1 | -0.22 | ||
| isolation beds | results-v1.12.0 | 2026-07-25 | 4 | 77.32 | 0.46 | 0.158 | 0.4 | 38.49 | 1.02 | 37.81 | 0.5 | 1 | -0.22 | ||
| isolation beds | results-1462 | 2026-07-26 | 4 | 71.12 | 0.42 | 0.144 | 0.37 | 38.04 | 3.53 | 29.56 | 0.5 | 1 | -0.2 | ||
| isolation beds | results-1469 | 2026-07-27 | 4 | 71.12 | 0.42 | 0.144 | 0.37 | 38.04 | 3.53 | 29.56 | 0.5 | 1 | -0.2 | ||
| isolation beds | results-1479 | 2026-07-28 | 4 | 71.12 | 0.41 | 0.144 | 0.36 | 38.04 | 3.53 | 29.56 | 0.5 | 1 | -0.2 | ||
| isolation beds | results-1489 | 2026-07-31 | 4 | 71.12 | 0.41 | 0.144 | 0.36 | 38.04 | 3.53 | 29.56 | 0.5 | 1 | -0.2 | ||
| isolation beds | results-v1.13.2 | 2026-08-04 | 4 | 71.12 | 0.43 | 0.144 | 0.38 | 38.04 | 3.53 | 29.56 | 0.5 | 1 | -0.2 | ||
| isolation beds | results-1505 | 2026-08-08 | 4 | 71.12 | 0.44 | 0.144 | 0.39 | 38.04 | 3.53 | 29.56 | 0.5 | 1 | -0.2 | ||
| isolation beds | results-1527 | 2026-08-10 | 4 | 71.12 | 0.42 | 0.144 | 0.37 | 38.04 | 3.53 | 29.56 | 0.5 | 1 | -0.2 | ||
| isolation beds | results-1573 | 2026-08-15 | 4 | 76.5 | 0.47 | 0.154 | 0.41 | 35.78 | 2.15 | 38.57 | 0.5 | 1 | -0.22 | ||
| isolation beds | results-1591 | 2026-08-17 | 4 | 73.46 | 0.43 | 0.147 | 0.37 | 36.1 | 2.13 | 35.23 | 0.5 | 1 | -0.2 | ||
| isolation beds | results-v1.15.0 | 2026-08-18 | 4 | 73.46 | 0.45 | 0.147 | 0.39 | 36.1 | 2.13 | 35.23 | 0.5 | 1 | -0.2 | ||
| isolation beds | results-v1.16.0 | 2026-08-23 | 4 | 73.46 | 0.44 | 0.147 | 0.39 | 35.25 | 2.05 | 36.16 | 0.5 | 1 | -0.2 | ||
| isolation beds | results-1625 | 2026-08-24 | 4 | 73.46 | 0.44 | 0.147 | 0.38 | 35.25 | 2.05 | 36.16 | 0.5 | 1 | -0.2 | ||
| isolation beds | results-v1.17.0 | 2026-08-25 | 4 | 74.84 | 0.45 | 0.151 | 0.39 | 39.27 | 1.44 | 34.13 | 0.5 | 1 | -0.23 | ||
| isolation beds | results-v1.18.0 | 2026-08-30 | 4 | 74.84 | 0.44 | 0.151 | 0.39 | 39.27 | 1.44 | 34.13 | 0.5 | 1 | -0.23 | ||
| isolation beds | results-1739 | 2026-09-03 | 4 | 75.35 | 0.44 | 0.155 | 0.39 | 40.75 | 0.98 | 33.63 | 0.5 | 1 | -0.24 | ||
| isolation beds | results-1828 | 2026-09-05 | 4 | 73.29 | 0.44 | 0.149 | 0.39 | 35.51 | 1.81 | 35.98 | 0.5 | 1 | -0.24 | ||
| isolation beds | results-1858 | 2026-09-06 | 4 | 67.65 | 0.41 | 0.136 | 0.36 | 36.96 | 1.31 | 29.39 | 0.75 | 1 | -0.2 | ||
| isolation beds | results-1970 | 2026-09-08 | 4 | 76.59 | 0.46 | 0.156 | 0.41 | 37.54 | 0.88 | 38.17 | 0.5 | 1 | -0.28 | ||
| isolation beds | results-v2.1.0 | 2026-09-09 | 4 | 76.59 | 0.46 | 0.156 | 0.41 | 37.54 | 0.88 | 38.17 | 0.5 | 1 | -0.28 | ||
| isolation beds | results-2177 | 2026-09-12 | 4 | 76.8 | 0.46 | 0.156 | 0.41 | 34.07 | 1.3 | 41.43 | 0.5 | 1 | -0.24 | ||
| isolation beds | results-2360 | 2026-09-14 | 4 | 205.6 | 1.19 | 0.241 | 0.61 | 126.52 | 79.08 | 0 | 0.25 | 1 | 0.58 | ||
| isolation beds | results-2506 | 2026-09-15 | 4 | 131.19 | 0.77 | 0.179 | 0.46 | 85.36 | 45.83 | 0 | 0.75 | 1 | 0.46 | ||
| isolation beds | results-2536 | 2026-09-18 | 4 | 101.7 | 0.61 | 0.147 | 0.39 | 72.29 | 29.41 | 0 | 0.75 | 1 | 0.4 | ||
| isolation beds | results-2720 | 2026-09-19 | 4 | 122.9 | 0.76 | 0.167 | 0.45 | 77.55 | 45.34 | 0 | 0.5 | 1 | 0.45 |
The frozen forecasts made at each cut-off against the value observed since, one panel per stream and horizon, the observed value in black. Each panel carries the frozen forecast and the persistence baseline, coloured as in the cross-release overlay above, and the x-axis is the cut-off each forecast was made from.
Frozen-fit forecasts-versus-now overlay
# The frozen joint and the persistence baseline only. A single-stream
# frozen fit exists at the one-week-back cut-off alone, so its series lands
# on one made date of a panel spanning every cut-off, overplotting the
# joint point it sits beside rather than reading as a second series. The
# single-stream frozen fits are compared against the joint in the skill
# figures and in the validation plot at that cut-off.
frozen_overlay_fig = plot_forecast_overlay(
scored_overlay(
vcat(
select_fit_role(frozen_overlay_df, "joint"),
select_fit_role(frozen_overlay_df, "baseline")
)
)
);
The frozen re-fits below freeze the renewal data to an earlier cut-off and re-fit, so that a change driven by newer data can be distinguished from one driven by a change of method. Each uses the full headline settings: 1000 draws across two chains.
Freeze the renewal data to a cut-off and re-fit
# Frozen re-fits and released_df are prepared in the setup block above.Individual fits against the baseline
This section carries the same cross-release forecast scoring as Forecast scoring across releases above, for each stream's own individual fit rather than the joint, against the same persistence baseline.
Individual-fit rows of the cross-release scores
# The relative skill against a stream's individual fit is only ever
# computed on the joint model's row, so on these rows it is missing by
# construction and the column is dropped rather than shown empty.
individual_score_overview_table = drop_individual_fit_columns(
select_fit_role(forecast_score_overview_table, "individual")
)
individual_score_by_horizon_table = drop_individual_fit_columns(
select_fit_role(forecast_score_by_horizon_table, "individual")
)
# See the comment above `joint_score_by_release_table`'s assignment for why
# this setup chunk's last statement needs a trailing `;`.
individual_score_by_release_table = drop_individual_fit_columns(
select_fit_role(forecast_score_by_release_table, "individual")
);| stream | fit | n | crps | rel_to_baseline | log_crps | log_rel_to_baseline | dispersion | overprediction | underprediction | coverage_50 | coverage_90 | bias |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| confirmed cases | confirmed | 83 | 316.9 | 2.68 | 0.227 | 2.52 | 261.03 | 54.47 | 1.4 | 0.92 | 0.93 | 0.16 |
| confirmed deaths | confirmed_deaths | 83 | 249.82 | 3.09 | 0.423 | 3.68 | 198.77 | 24.01 | 27.04 | 0.82 | 1 | -0.05 |
| isolation beds | treatment | 83 | 99.35 | 1.74 | 0.15 | 2.03 | 87.34 | 0.19 | 11.82 | 0.96 | 1 | -0.18 |
| onset reports | onsets | 24 | 208.1 | 1.48 | 0.321 | 1.48 | 110.94 | 30.06 | 67.11 | 0.62 | 1 | -0.12 |
The same relative skill against the baseline, by horizon, one panel per stream (dataset), for each stream's own individual fit.
individual_relative_skill_fig = plot_forecast_relative_skill(
individual_score_by_horizon_table;
empty_message = "Empty: no release old enough for its targets to " *
"have been observed carries an individual-stream " *
"forecast. Not a missing forecast."
);
Scores by horizon
| stream | horizon | fit | n | crps | rel_to_baseline | log_crps | log_rel_to_baseline | dispersion | overprediction | underprediction | coverage_50 | coverage_90 | bias |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| confirmed cases | 7 | confirmed | 26 | 151.94 | 3.4 | 0.261 | 3.13 | 80.72 | 68.88 | 2.35 | 0.81 | 0.81 | 0.19 |
| confirmed cases | 14 | confirmed | 22 | 253.1 | 3.34 | 0.212 | 3.04 | 193.29 | 57.72 | 2.09 | 0.91 | 0.95 | 0.13 |
| confirmed cases | 21 | confirmed | 19 | 374.84 | 2.72 | 0.199 | 2.32 | 342.42 | 31.98 | 0.43 | 1 | 1 | 0.13 |
| confirmed cases | 28 | confirmed | 16 | 603.87 | 2.21 | 0.224 | 1.69 | 550.52 | 53.26 | 0.09 | 1 | 1 | 0.17 |
| confirmed deaths | 7 | confirmed_deaths | 26 | 72.4 | 2.65 | 0.397 | 3.99 | 49.02 | 3.36 | 20.02 | 0.69 | 1 | -0.1 |
| confirmed deaths | 14 | confirmed_deaths | 22 | 175.78 | 3.27 | 0.458 | 4.93 | 130.05 | 9.32 | 36.4 | 0.77 | 1 | -0.12 |
| confirmed deaths | 21 | confirmed_deaths | 19 | 316.5 | 2.99 | 0.442 | 3.58 | 256.12 | 24.22 | 36.16 | 0.95 | 1 | -0.05 |
| confirmed deaths | 28 | confirmed_deaths | 16 | 560.75 | 3.19 | 0.393 | 2.46 | 468.49 | 77.51 | 14.75 | 0.94 | 1 | 0.13 |
| isolation beds | 7 | treatment | 26 | 101.64 | 2.6 | 0.156 | 3.07 | 88.68 | 0.19 | 12.77 | 1 | 1 | -0.16 |
| isolation beds | 14 | treatment | 22 | 98.41 | 1.99 | 0.148 | 2.29 | 92.15 | 0.06 | 6.2 | 1 | 1 | -0.12 |
| isolation beds | 21 | treatment | 19 | 97.29 | 1.43 | 0.144 | 1.62 | 84.62 | 0.28 | 12.39 | 0.95 | 1 | -0.19 |
| isolation beds | 28 | treatment | 16 | 99.39 | 1.2 | 0.151 | 1.4 | 81.79 | 0.26 | 17.34 | 0.88 | 1 | -0.3 |
| onset reports | 7 | onsets | 10 | 114.48 | 0.86 | 0.4 | 1.22 | 79 | 6.51 | 28.97 | 0.9 | 1 | -0.06 |
| onset reports | 14 | onsets | 8 | 230.69 | 2.22 | 0.267 | 2.21 | 116.28 | 44.15 | 70.26 | 0.5 | 1 | -0.08 |
| onset reports | 21 | onsets | 6 | 334.03 | 1.67 | 0.26 | 1.62 | 157.03 | 50.52 | 126.48 | 0.33 | 1 | -0.28 |
Scores by release
| made_date | stream | fit | n | crps | rel_to_baseline | log_crps | log_rel_to_baseline | dispersion | overprediction | underprediction | coverage_50 | coverage_90 | bias |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 2026-07-23 | confirmed cases | confirmed | 4 | 327.81 | 0.86 | 0.206 | 0.82 | 319.43 | 4.84 | 3.55 | 1 | 1 | -0.03 |
| 2026-07-25 | confirmed cases | confirmed | 4 | 346.24 | 1.52 | 0.213 | 1.55 | 343.88 | 2.3 | 0.06 | 1 | 1 | 0.02 |
| 2026-07-26 | confirmed cases | confirmed | 4 | 299.07 | 1.42 | 0.211 | 1.67 | 291.39 | 0.16 | 7.51 | 1 | 1 | -0.12 |
| 2026-07-27 | confirmed cases | confirmed | 4 | 267.62 | 1.38 | 0.171 | 1.35 | 262.03 | 5.38 | 0.21 | 1 | 1 | 0.04 |
| 2026-07-31 | confirmed cases | confirmed | 4 | 402.87 | 3.31 | 0.219 | 2.82 | 383.82 | 19.05 | 0 | 1 | 1 | 0.09 |
| 2026-08-01 | confirmed cases | confirmed | 4 | 336.31 | 2.93 | 0.209 | 3.06 | 322.98 | 13.33 | 0 | 1 | 1 | 0.08 |
| 2026-08-02 | confirmed cases | confirmed | 4 | 296.98 | 2.16 | 0.171 | 1.97 | 286.15 | 6.72 | 4.11 | 1 | 1 | -0.03 |
| 2026-08-03 | confirmed cases | confirmed | 4 | 291.8 | 1.5 | 0.175 | 1.18 | 281.42 | 10.08 | 0.3 | 1 | 1 | 0.05 |
| 2026-08-04 | confirmed cases | confirmed | 4 | 350.84 | 3.85 | 0.191 | 3.45 | 323.41 | 27.4 | 0.04 | 1 | 1 | 0.11 |
| 2026-08-07 | confirmed cases | confirmed | 4 | 308.4 | 3.9 | 0.192 | 3.01 | 294.77 | 9.51 | 4.12 | 1 | 1 | -0.01 |
| 2026-08-11 | confirmed cases | confirmed | 4 | 335.75 | 7.53 | 0.191 | 5.54 | 307.3 | 27.62 | 0.84 | 1 | 1 | 0.1 |
| 2026-08-15 | confirmed cases | confirmed | 4 | 312.22 | 5.27 | 0.211 | 4.16 | 308.06 | 1.82 | 2.34 | 1 | 1 | -0.03 |
| 2026-08-17 | confirmed cases | confirmed | 4 | 299.38 | 4.01 | 0.228 | 3.64 | 293.33 | 0 | 6.06 | 1 | 1 | -0.09 |
| 2026-08-22 | confirmed cases | confirmed | 4 | 335.33 | 5.02 | 0.206 | 4.11 | 293.02 | 42.31 | 0 | 1 | 1 | 0.15 |
| 2026-08-24 | confirmed cases | confirmed | 4 | 315.97 | 5.19 | 0.185 | 4.41 | 253.05 | 62.92 | 0 | 1 | 1 | 0.26 |
| 2026-08-25 | confirmed cases | confirmed | 4 | 302.15 | 4.88 | 0.184 | 4.27 | 236.93 | 65.23 | 0 | 1 | 1 | 0.27 |
| 2026-08-30 | confirmed cases | confirmed | 3 | 257.62 | 5.12 | 0.177 | 3.34 | 185.65 | 71.97 | 0 | 1 | 1 | 0.34 |
| 2026-08-31 | confirmed cases | confirmed | 3 | 203.03 | 3.88 | 0.158 | 3.28 | 165.77 | 37.26 | 0 | 1 | 1 | 0.22 |
| 2026-09-01 | confirmed cases | confirmed | 3 | 242.92 | 3.96 | 0.173 | 2.91 | 189.51 | 53.41 | 0 | 1 | 1 | 0.24 |
| 2026-09-06 | confirmed cases | confirmed | 2 | 159.63 | 5.08 | 0.176 | 4.79 | 136.12 | 23.51 | 0 | 1 | 1 | 0.23 |
| 2026-09-10 | confirmed cases | confirmed | 2 | 216.46 | 2.14 | 0.222 | 1.92 | 135.59 | 80.87 | 0 | 0.5 | 1 | 0.43 |
| 2026-09-12 | confirmed cases | confirmed | 2 | 715.77 | 4.76 | 0.695 | 3.68 | 64.25 | 651.52 | 0 | 0 | 0 | 1 |
| 2026-09-13 | confirmed cases | confirmed | 1 | 409.59 | 6.76 | 0.609 | 5.28 | 39.18 | 370.41 | 0 | 0 | 0 | 0.99 |
| 2026-09-15 | confirmed cases | confirmed | 1 | 410.16 | 4.15 | 0.669 | 3.24 | 42.16 | 368 | 0 | 0 | 0 | 1 |
| 2026-09-16 | confirmed cases | confirmed | 1 | 375.69 | 4.8 | 0.629 | 3.79 | 43.88 | 331.81 | 0 | 0 | 0 | 1 |
| 2026-09-19 | confirmed cases | confirmed | 1 | 297.61 | 5.98 | 0.542 | 4.81 | 41.56 | 256.05 | 0 | 0 | 0 | 1 |
| 2026-07-23 | confirmed deaths | confirmed_deaths | 4 | 701.54 | 4.53 | 0.448 | 2.4 | 383.29 | 318.25 | 0 | 0.25 | 1 | 0.56 |
| 2026-07-25 | confirmed deaths | confirmed_deaths | 4 | 237.78 | 1.99 | 0.234 | 1.6 | 214.28 | 23.5 | 0 | 1 | 1 | 0.18 |
| 2026-07-26 | confirmed deaths | confirmed_deaths | 4 | 256.46 | 2.3 | 0.255 | 2.02 | 231.65 | 24.81 | 0 | 1 | 1 | 0.13 |
| 2026-07-27 | confirmed deaths | confirmed_deaths | 4 | 310.27 | 2.88 | 0.252 | 1.92 | 280.84 | 29.43 | 0 | 1 | 1 | 0.21 |
| 2026-07-31 | confirmed deaths | confirmed_deaths | 4 | 312.36 | 2.7 | 0.289 | 2.15 | 292.21 | 20.08 | 0.07 | 1 | 1 | 0.08 |
| 2026-08-01 | confirmed deaths | confirmed_deaths | 4 | 280.92 | 2.4 | 0.253 | 1.7 | 261.46 | 19.46 | 0 | 1 | 1 | 0.1 |
| 2026-08-02 | confirmed deaths | confirmed_deaths | 4 | 256.05 | 2.73 | 0.276 | 2.38 | 238.23 | 16.88 | 0.94 | 1 | 1 | 0.03 |
| 2026-08-03 | confirmed deaths | confirmed_deaths | 4 | 224.5 | 1.62 | 0.245 | 1.22 | 212.2 | 10.83 | 1.46 | 1 | 1 | 0.02 |
| 2026-08-04 | confirmed deaths | confirmed_deaths | 4 | 248.77 | 3.56 | 0.283 | 3.44 | 242.12 | 4.29 | 2.35 | 1 | 1 | -0.02 |
| 2026-08-07 | confirmed deaths | confirmed_deaths | 4 | 231.5 | 3.23 | 0.325 | 3.08 | 223.68 | 1.02 | 6.79 | 1 | 1 | -0.11 |
| 2026-08-11 | confirmed deaths | confirmed_deaths | 4 | 244.6 | 10.68 | 0.337 | 10.13 | 233.59 | 1.95 | 9.06 | 1 | 1 | -0.13 |
| 2026-08-15 | confirmed deaths | confirmed_deaths | 4 | 244.83 | 6.12 | 0.34 | 5.64 | 239.91 | 0.04 | 4.89 | 1 | 1 | -0.1 |
| 2026-08-17 | confirmed deaths | confirmed_deaths | 4 | 251.32 | 5.1 | 0.297 | 3.95 | 246.09 | 3.93 | 1.3 | 1 | 1 | -0.02 |
| 2026-08-22 | confirmed deaths | confirmed_deaths | 4 | 242 | 2.71 | 0.482 | 3.89 | 219.73 | 0 | 22.27 | 1 | 1 | -0.18 |
| 2026-08-24 | confirmed deaths | confirmed_deaths | 4 | 220.02 | 3.2 | 0.543 | 6.42 | 144.48 | 0 | 75.54 | 1 | 1 | -0.4 |
| 2026-08-25 | confirmed deaths | confirmed_deaths | 4 | 247.19 | 3.62 | 0.796 | 9.93 | 151.31 | 0 | 95.88 | 0.75 | 1 | -0.45 |
| 2026-08-30 | confirmed deaths | confirmed_deaths | 3 | 215.22 | 4.78 | 0.916 | 14.32 | 98.9 | 0 | 116.32 | 0.33 | 1 | -0.53 |
| 2026-08-31 | confirmed deaths | confirmed_deaths | 3 | 199.79 | 3.07 | 0.782 | 7.79 | 109.79 | 0 | 90 | 1 | 1 | -0.42 |
| 2026-09-01 | confirmed deaths | confirmed_deaths | 3 | 203.76 | 4.02 | 0.932 | 12.09 | 89.67 | 0 | 114.09 | 0.33 | 1 | -0.52 |
| 2026-09-06 | confirmed deaths | confirmed_deaths | 2 | 189.46 | 10.43 | 1.189 | 27.19 | 45.04 | 0 | 144.42 | 0 | 1 | -0.69 |
| 2026-09-10 | confirmed deaths | confirmed_deaths | 2 | 123.89 | 1.66 | 0.747 | 4.03 | 67.86 | 0 | 56.04 | 0.5 | 1 | -0.46 |
| 2026-09-12 | confirmed deaths | confirmed_deaths | 2 | 54.2 | 0.72 | 0.135 | 0.66 | 27.69 | 26.52 | 0 | 0 | 1 | 0.56 |
| 2026-09-13 | confirmed deaths | confirmed_deaths | 1 | 32.7 | 0.85 | 0.127 | 0.83 | 14.54 | 18.16 | 0 | 0 | 1 | 0.63 |
| 2026-09-15 | confirmed deaths | confirmed_deaths | 1 | 26.42 | 0.65 | 0.112 | 0.64 | 16.22 | 10.2 | 0 | 1 | 1 | 0.49 |
| 2026-09-16 | confirmed deaths | confirmed_deaths | 1 | 28.53 | 0.62 | 0.125 | 0.62 | 15.91 | 12.62 | 0 | 0 | 1 | 0.56 |
| 2026-09-19 | confirmed deaths | confirmed_deaths | 1 | 15.48 | 0.99 | 0.07 | 0.99 | 14.59 | 0.89 | 0 | 1 | 1 | 0.13 |
| 2026-07-23 | isolation beds | treatment | 4 | 55.73 | 1.91 | 0.089 | 2.32 | 47.79 | 0 | 7.94 | 1 | 1 | -0.21 |
| 2026-07-25 | isolation beds | treatment | 4 | 51.68 | 1.34 | 0.082 | 1.6 | 47.14 | 0.01 | 4.52 | 1 | 1 | -0.14 |
| 2026-07-26 | isolation beds | treatment | 4 | 61.67 | 1.66 | 0.1 | 2 | 54.82 | 0.23 | 6.63 | 1 | 1 | -0.12 |
| 2026-07-27 | isolation beds | treatment | 4 | 59.47 | 2.05 | 0.098 | 2.5 | 54.67 | 0 | 4.8 | 1 | 1 | -0.18 |
| 2026-07-31 | isolation beds | treatment | 4 | 82.76 | 1.94 | 0.132 | 2.41 | 68.17 | 0 | 14.6 | 0.75 | 1 | -0.28 |
| 2026-08-01 | isolation beds | treatment | 4 | 88.62 | 1.4 | 0.153 | 1.79 | 73.94 | 0 | 14.67 | 0.75 | 1 | -0.25 |
| 2026-08-02 | isolation beds | treatment | 4 | 84.37 | 1.66 | 0.141 | 2.07 | 69.7 | 0 | 14.67 | 0.75 | 1 | -0.28 |
| 2026-08-03 | isolation beds | treatment | 4 | 79.93 | 1.77 | 0.134 | 2.18 | 71.91 | 0 | 8.01 | 1 | 1 | -0.21 |
| 2026-08-04 | isolation beds | treatment | 4 | 87.06 | 1.28 | 0.141 | 1.45 | 82.73 | 1.22 | 3.11 | 1 | 1 | -0.03 |
| 2026-08-07 | isolation beds | treatment | 4 | 104.98 | 1.74 | 0.171 | 2.17 | 85.76 | 0 | 19.21 | 1 | 1 | -0.29 |
| 2026-08-11 | isolation beds | treatment | 4 | 102.61 | 0.61 | 0.171 | 0.7 | 90.93 | 0 | 11.68 | 1 | 1 | -0.21 |
| 2026-08-15 | isolation beds | treatment | 4 | 127.51 | 1.48 | 0.204 | 1.88 | 98.57 | 0 | 28.94 | 1 | 1 | -0.33 |
| 2026-08-17 | isolation beds | treatment | 4 | 103.76 | 1.52 | 0.161 | 1.84 | 93.32 | 0 | 10.44 | 1 | 1 | -0.19 |
| 2026-08-22 | isolation beds | treatment | 4 | 144.98 | 2.33 | 0.218 | 2.89 | 120.25 | 0 | 24.73 | 1 | 1 | -0.22 |
| 2026-08-24 | isolation beds | treatment | 4 | 127.24 | 2.53 | 0.181 | 2.9 | 115.13 | 1.05 | 11.06 | 1 | 1 | -0.11 |
| 2026-08-25 | isolation beds | treatment | 4 | 131.92 | 1.91 | 0.191 | 2.22 | 111.86 | 0 | 20.06 | 1 | 1 | -0.2 |
| 2026-08-30 | isolation beds | treatment | 3 | 123.9 | 3.03 | 0.169 | 3.38 | 114.88 | 1.72 | 7.3 | 1 | 1 | -0.07 |
| 2026-08-31 | isolation beds | treatment | 3 | 117.93 | 2.57 | 0.161 | 2.94 | 108.45 | 0.05 | 9.43 | 1 | 1 | -0.14 |
| 2026-09-01 | isolation beds | treatment | 3 | 117.14 | 3.05 | 0.153 | 3.47 | 112.33 | 0 | 4.8 | 1 | 1 | -0.09 |
| 2026-09-06 | isolation beds | treatment | 2 | 113.98 | 2.35 | 0.149 | 2.55 | 110.81 | 0 | 3.16 | 1 | 1 | -0.09 |
| 2026-09-10 | isolation beds | treatment | 2 | 133.86 | 3.31 | 0.174 | 3.66 | 115.73 | 0 | 18.12 | 1 | 1 | -0.14 |
| 2026-09-12 | isolation beds | treatment | 2 | 132 | 2.14 | 0.181 | 2.55 | 113.46 | 0 | 18.54 | 1 | 1 | -0.16 |
| 2026-09-13 | isolation beds | treatment | 1 | 106.22 | 2.21 | 0.139 | 2.52 | 105.35 | 0 | 0.87 | 1 | 1 | -0.06 |
| 2026-09-15 | isolation beds | treatment | 1 | 112.09 | 3.3 | 0.143 | 3.87 | 109.36 | 0 | 2.73 | 1 | 1 | -0.08 |
| 2026-09-16 | isolation beds | treatment | 1 | 113.01 | 4.72 | 0.143 | 5.4 | 99.88 | 0 | 13.13 | 1 | 1 | -0.2 |
| 2026-09-19 | isolation beds | treatment | 1 | 101.37 | 1.52 | 0.134 | 1.68 | 101.12 | 0.25 | 0 | 1 | 1 | 0.03 |
| 2026-08-02 | onset reports | onsets | 3 | 123.07 | 0.9 | 0.188 | 1.13 | 96.84 | 0 | 26.23 | 1 | 1 | -0.28 |
| 2026-08-03 | onset reports | onsets | 3 | 105.78 | 1.59 | 0.166 | 1.36 | 100.32 | 1.05 | 4.41 | 1 | 1 | -0.03 |
| 2026-08-04 | onset reports | onsets | 3 | 140.89 | 1.15 | 0.265 | 1.28 | 88.34 | 0.02 | 52.52 | 0.67 | 1 | -0.26 |
| 2026-08-07 | onset reports | onsets | 3 | 379.32 | 1.15 | 0.634 | 1.37 | 82.32 | 0 | 297 | 0 | 1 | -0.8 |
| 2026-08-11 | onset reports | onsets | 3 | 241.79 | 1.51 | 0.427 | 1.86 | 85.91 | 0 | 155.87 | 0.33 | 1 | -0.64 |
| 2026-08-15 | onset reports | onsets | 3 | 371.88 | 4.19 | 0.281 | 2.37 | 205.04 | 166.83 | 0 | 0.33 | 1 | 0.57 |
| 2026-08-17 | onset reports | onsets | 2 | 244.44 | 3.9 | 0.252 | 2.39 | 153.61 | 90.83 | 0 | 0.5 | 1 | 0.46 |
| 2026-08-22 | onset reports | onsets | 2 | 119.29 | 1.02 | 0.207 | 1.15 | 104.12 | 15.18 | 0 | 1 | 1 | 0.21 |
| 2026-08-24 | onset reports | onsets | 1 | 84.59 | 1.18 | 0.391 | 2.32 | 82.09 | 0 | 2.5 | 1 | 1 | -0.11 |
| 2026-08-25 | onset reports | onsets | 1 | 94.28 | 0.42 | 0.505 | 0.91 | 88.57 | 5.71 | 0 | 1 | 1 | 0.17 |
Saving forecast outputs
The one-week-back validation forecast, in the same archive format as the release forecast, so the frozen "last week versus now" forecast is recorded as a release asset alongside the forecast it is scored against.
Write forecast outputs
output_dir = get(
ENV, "BVD_OUTPUT_DIR",
joinpath(pkgdir(BVDOutbreakSize), "output")
)
mkpath(output_dir)
CSV.write(
joinpath(output_dir, "forecast_validation.csv"),
forecast_archive(
[(7, validation_forecast)];
made_date = frozen_lastweek.o.cutoff, thin = 5
)
)"/home/runner/work/BVDOutbreakSize/BVDOutbreakSize/output/forecast_validation.csv"Write the summary bullets
# The bullets under the summary heading at the top of the page. They read
# tables built further down, so they are written here and read back when
# the site is assembled.
evaluation_forecast_national_summary = let
fmt(x) = ismissing(x) || !isfinite(x) ? "n/a" :
string(round(x; digits = 2))
scored(tbl) = filter(r -> !ismissing(r.rel_to_baseline), tbl)
function beat(label, tbl)
rows = scored(tbl)
size(rows, 1) == 0 &&
return string("- **", label, ":** no scored forecasts yet.")
return string(
"- **", label, ":** beat the baseline on ",
count(<(1), rows.rel_to_baseline), " of ", size(rows, 1),
" streams."
)
end
function block(lead, tbl)
rows = scored(tbl)
size(rows, 1) == 0 && return nothing
return join(
vcat(
[string("**", lead, "**"), ""],
[
string(
"- ", r.stream, ": relative skill ",
fmt(r.rel_to_baseline), ", 90% coverage ",
fmt(r.coverage_90), ", bias ", fmt(r.bias), " over ",
r.n, " forecasts."
)
for r in eachrow(rows)
]
), "\n"
)
end
frozen_joint = select_fit_role(frozen_score_overview_table, "joint")
overall = [
beat("Joint model across releases", joint_score_overview_table),
beat("Frozen joint model", frozen_joint),
]
blocks = filter(
!isnothing,
[
block("Across releases", joint_score_overview_table),
block("Frozen fits", frozen_joint),
]
)
join(vcat([join(overall, "\n")], blocks), "\n\n")
end
dashboard_dir = joinpath(
pkgdir(BVDOutbreakSize), "docs", "src", "summary_assets"
)
mkpath(dashboard_dir)
write(
joinpath(dashboard_dir, "evaluation_forecast_national.md"),
evaluation_forecast_national_summary
);