8. Scenario plausibility
A conditional forecast always succeeds. You impose a path, RISE finds shocks that deliver it, and a chart comes back. There is no path so absurd that no shock sequence produces it, so success carries no information.
What the chart does not say is whether those shocks are mild judgment or a sequence the model would never generate. Two runs can publish the same path while demanding wildly different things of the model.
rise.scenario.plausibility puts a number on the difference.
sp = simplan(m, [0, 12], 1);
sp = free_shocks(sp, 'all', 1);
sp = append(sp, 'Y', 1, 0.6);
db = simulate(m, 'simul_historical_data', sp, 'simul_periods', 12);
rep = rise.scenario.plausibility(m, db);
Scenario plausibility
----------------------------------------------------------
shock slots scored 3 (3 shocks x 1 periods)
largest move EPS_S at period 1, -0.42 sigma
sum of squares 0.200 (tail probability 0.9776)
divergence from the model 0.1001
q 0.6270 a scenario the model is comfortable with
----------------------------------------------------------
8.1. How to read it
q is the headline. It lives in [0.5, 1] and is the bias of a coin that
would be as far from a fair one as the scenario is from the model. Near 0.5
the model would hardly notice; near 1 it would essentially never produce this
on its own.
largest move names the shock doing most of the work, in units of its own standard deviation, and the period it happens in. This is the Leeper–Zha reading: is the intervention modest?
sum of squares and its tail probability treat the shocks jointly. Useful, but it is the divergence — scaled by the number of shock slots — that discriminates between scenarios of different length.
Note
q is not a test. It has no size and no critical value, and the verdicts
the report prints are a reading aid. What q is good at is comparison:
this scenario against that one, this attribution rule against another, on
the same model.
8.2. What it is measuring
The model believes its structural shocks are standard normal over the nh
slots the scenario touches. A scenario implies a different distribution, with
mean u and variance S. The distance between the two is the
Kullback–Leibler divergence
D = 0.5 * ( trace(S) + u'u - nh - log(det(S)) )
calibrated onto [0.5, 1] by
q = ( 1 + sqrt(1 - exp(-2*D/nh)) ) / 2
The calibration is against a binomial rather than a Bernoulli, which is what
keeps q from drifting to one merely because the scenario is long.
A hard conditional forecast returns one shock path rather than a distribution,
so S defaults to the identity: the scenario shifts the shocks’ mean and
leaves their spread alone, and D is half the sum of squared standardized
shocks. Where a forecast carries shock uncertainty, pass its covariance
through Covariance.
8.3. Who is made to do the work
The most useful thing the metric exposes is a choice that used to be invisible. Impose the same target twice — once letting every shock share it, once insisting a single shock is responsible:
rule sum of squares q worst move
all shocks share 0.2001 0.6270 EPS_S -0.42 sd
EPS_D alone 2.5208 0.8770 EPS_D +1.59 sd
The published path is identical. Attributing the move to demand alone costs twelve times the model violence, and moves the verdict from “comfortable” to “being leaned on”. That is a modelling assumption with a price, and now the price is printed.
8.4. Options
Periods which forecast periods to score (default: every period
in which some shock is non-zero)
Shocks which shocks to score (default: all of the model's)
Covariance the scenario's shock covariance, nh by nh
Print show the report (default true)
8.5. What it refuses
noShocksToScore every shock is zero: the model was asked for
nothing, so there is no distance to measure
unknownShock a name that is not an exogenous variable
noShocksInDatabank the databank carries none of the model's shocks
periodOutOfRange a period the forecast does not reach
badCovariance the covariance is not nh by nh
All carry the prefix RISE:scenario:. A scenario that asks for nothing
raises an error rather than returning a flattering q = 0.5.
8.6. References
Antolín-Díaz, Petrella and Rubio-Ramírez (2021), “Structural scenario analysis with SVARs”, Journal of Monetary Economics 117, 798–815 — the divergence and its calibration.
Leeper and Zha (2003), “Modest policy interventions”, Journal of Monetary Economics 50, 1673–1700 — the per-shock reading.
McCulloch (1989), “Local model influence”, JASA 84, 473–478 — calibrating a divergence against a coin.