MCFEVDTABLE Procedure |
@MCFEVDTABLE generates error bands for the FEVD (forecast error variance decomposition) in a VAR using the output from a Monte Carlo (MC) or bootstrapping procedure such as @MCVARDODRAWS. (It uses the %%RESPONSES information). For each draw, it computes a separate FEVD and computes statistics on those across draws. Note: this assumes that the shocks used in generating the IRF's are orthogonal and produce a complete factorization of the covariance matrix. It cannot be used with isolated shocks (from, for instance, sign restrictions).
FEVD's have highly asymmetrical distributions which are pinned between 0 and 1 by construction. As a result, moment-based statistics such as means and standard errors provide poor measures of the center and spread of the distribution. Percentiles (such as a 16%-84% range) are much better. However, the point estimate (the FEVD at the least squares estimates) could easily fall outside even those. That's the nature of the FEVD calculation—since both positive and negative responses get squared, and are thus indistinguishable, an IRF which is close to zero in the point estimate, and statistically insignificant, will likely lie outside its FEVD bounds since the randomness of the Monte Carlo integration process will generally give a combination of larger positive and negative responses.
The "center" estimates are medians, not means. However, with more than two variables, they can add to a number well below 100%. (With two variables, if 50% of the draws have an FEVD below \(\alpha\), 50% of the draws for the other variable have to be above \(1-\alpha\) so by construction, their medians will have to sum to 1). While we provide this procedure, you will likely find that point estimates of the FEVD combined with error bands on the IRF's themselves provide better information.
@MCFEVDTABLE(MODEL=model used in generating responses,other options)
Options
SHOCKLABELS=VECT[STRINGS] of labels for the shocks [dependent variables of model]
VARLABELS=VECT[STRING] of labels for the variables [dependent variables of model]
INCLUDE=||list of dependent variables to show (in order, by position in model)|| [all]
INCLUDE can be used to eliminate some variables which aren't of special interest or to rearrange the panes on a graph. For instance, in a 6 variable VAR, INCLUDE=||6,1,3,4|| will show only the responses of those four variables (based upon their positions in the model) and will put the 6th variable in the top left.
HORIZONS=VECT[INT] of forecast horizons to include [||1,2,3,4,8,12,40||]
PERCENTILES=||percentiles for lower and upper bounds|| [||.16,.84||]
STDDEV=# of standard deviations from mean for lower and upper bounds [not used]
STDDEV is used for doing error bands based upon multiples of the sample standard deviations. For instance, STDDEV=1.0 will give upper and lower bounds that are one standard deviation above and below the mean response. PERCENTILES is the default. Because the FEVD's are very asymmetrical, the use of the symmetric bands with STDDEV isn't recommended.
TABLE=[BYVARIABLE]/BYSHOCK
Organization for the table
PICTURE=picture code for displaying percentages ["##.#"]
Example
*
* Replication for Blanchard and Quah(1989), "The Dynamic Effects of
* Aggregate Demand and Supply Disturbances", AER, vol 79, no. 4, pp
* 655-673.
*
* This includes the figures and tables that require simulations. Note
* that BQ used bootstrapping, which did not work well in this case. This
* is a point made in Sims and Zha(1999), "Error Bands for Impulse
* Responses", Econometrica, vol 67, no. 5, pp 1113-1156. These are done
* by Monte Carlo integration with the standard "Jeffreys'" prior.
*
cal(q) 1948
open data bqdata.xls
data(format=xls,org=cols) 1948:1 1987:4 gnp gd87 lhmur
*
* Generate log real GNP from the gnp and the price deflator
*
set loggnp = log(gnp)
set loggd = log(gd87)
set logrgnp = loggnp-loggd+log(100)
set dlogrgnp = 100.0*(logrgnp-logrgnp{1})
*
* BQ de-mean the GNP growth data with separate values for two subsamples.
*
set dummy1 = t<=1973:4
set dummy2 = t>1973:4
*
linreg dlogrgnp
# dummy1 dummy2
set gnpadjust = %resids
prj removed
*
* The unemployment rate is detrended
*
filter(remove=trend) lhmur / uradjust
*
*****************************************
compute [vect[strings]] shocklabels=||"Supply","Demand"||
compute [vect[strings]] varlabels=||"Output","Unemployment"||
*
system(model=varmodel)
var gnpadjust uradjust
lags 1 to 8
det constant
end(system)
*
estimate(noprint)
@BQDoDraws(model=varmodel)
@MCGraphIRF(model=varmodel,shocklabels=shocklabels,varlabels=varlabels)
*
disp "Table 2-Variance Decomposition. Output growth break; Unemployment Detrended"
@MCFEVDTable(model=varmodel,horizons=||1,2,3,4,8,12,40||,$
varlabels=varlabels,shocklabels=shocklabels,table=byshocks)
Sample Output
This is the output from the example above. This includes only certain horizons since the FEVD's change very slowly after the first ten of so steps. Note how asymmetrical the distributions are, particularly at the short horizons. For instance, the first table has the one step response of Output to Supply as a median of 9.0% with a 16-84% range of (0.9%,36.8%).
Percentage of Variance due to Supply
Horizon Output Unemployment
1 9.0 39.1
0.9,36.8 8.3,77.2
2 8.3 29.1
1.4,33.3 5.1,67.4
3 9.1 22.6
1.5,35.4 4.0,59.4
4 10.3 18.6
1.9,38.0 4.1,53.1
8 25.3 18.4
9.9,56.7 8.3,42.5
12 38.3 21.9
17.2,67.2 11.0,42.4
40 65.3 23.0
45.8,83.7 11.5,43.3
Percentage of Variance due to Demand
Horizon Output Unemployment
1 91.0 60.9
63.2,99.1 22.8,91.7
2 91.7 70.9
66.7,98.6 32.6,94.9
3 90.9 77.4
64.6,98.5 40.6,96.0
4 89.7 81.4
62.0,98.1 46.9,95.9
8 74.7 81.6
43.3,90.1 57.5,91.7
12 61.7 78.1
32.8,82.8 57.6,89.0
40 34.7 77.0
16.3,54.2 56.7,88.5
Copyright © 2026 Thomas A. Doan