A forecast round binds everything that produced a forecast – the
model and its calibration, the data vintage, the filtration, the
forecast with its conditions and judgment – into one object that can
be saved, reloaded, re-run, and compared with later rounds via
compare_rounds(). This is the object an institution archives: next
quarter, "why did the forecast move?" is answered from the rounds, not
from memory.
Usage
qpm_round(
name,
model,
data,
observables = NULL,
horizon = 12,
bands = c(0.5, 0.7, 0.9),
measurement_error = 0,
kappa = 1e+06
)Arguments
- name
Round name, e.g.
"2026-Q3 September".- model
A
qpm_model.- data
Data frame in levels with a
periodcolumn; passed toqpm_filter(). Quarter labels ("2026-Q3"style) are required for cross-round comparison.- observables
Columns treated as observed (default: all columns matching declared variables).
- horizon
Forecast horizon in quarters.
- bands
Fan coverage levels.
- measurement_error, kappa
Passed to
qpm_filter().
Details
qpm_round() runs the standard pipeline (solve, filter, baseline
forecast). Conditions, scenarios, and judgment are then applied to the
round directly: qpm_condition(), qpm_scenario(), and
add_judgment() all accept a round and update its forecast.
Examples
m <- qpm_template("bkl")
sol <- qpm_solve(m)
obs <- simulate(sol, nsim = 40, seed = 1, burn = 20)
obs$period <- next_quarters("2016-Q1", 40)
r <- qpm_round("test round", m, obs[, c("period", "pi", "i", "q")],
horizon = 8)
r
#> <qpm_round> test round
#> created 2026-09-19 07:26 - qpmR 1.1.0
#> model: Canonical small open economy QPM (BKL, stationary trends) - 25 parameters
#> data: 2016-Q2 ... 2026-Q1 (40 quarters) - observables: pi, i, q
#> filter: log-likelihood -195.15
#> forecast: 8 quarters (2026-Q2 ... 2028-Q1) - 0 conditions, 0 judgment entries