dake-li / lp_var_simul

Simulation study of Local Projections, VARs, and related estimators
MIT License
30 stars 25 forks source link

Simulation study of Local Projections, VARs, and related estimators

Matlab code for large-scale simulation studies of impulse response estimators, including Local Projections (LPs), Vector Autoregressions (VARs), and several variants of these

Reference: Li, Dake, Mikkel Plagborg-Møller, and Christian K. Wolf (2024), "Local Projections vs. VARs: Lessons From Thousands of DGPs", Journal of Econometrics (published version, working paper, supplement)

Tested in: Matlab R2023a on Windows 10 PC (64-bit)

Contents

Documents: Paper, supplement, and documentation

Estimation_Routines: General-purpose impulse response estimation functions

DFM: Simulation study based on encompassing Dynamic Factor Model (DFM)

Replication

Main results

  1. Estimate IRFs from simulated data: Run the following scripts to select 6000 DGPs (under observed-shock identification), repeat 5000 Monte Carlo simulations for each DGP, and apply multiple estimators for each simulation. This step produces the raw IRF estimates.

    • In Settings/shared.m, set settings.specifications.random_n_spec = 100, and settings.simul.n_MC = 5000.
    • In run_dfm.m, first set estimand_type = 'ObsShock', lag_type = 4, and mode_type = 1.
    • After the setup above, run run_dfm.m 60 times, by varying the following, to iterate through 6000 DGPs:
      • dgp_type from 'G' (for fiscal policy type) to 'MP' (for monetary policy type);
      • spec_id from 1 to 30 (for 30 distinct seeds, where each seed draws 100 random DGPs). (Note: The code has been set up this way to allow the simulations to be split into several independent jobs on a research computing cluster.)
    • Raw IRF estimates will be saved in the directory "DFM/Results/". (Warning: File sizes will be very large.)
  2. Summarize key statistics: Run the following scripts to obtain summary statistics of raw IRF estimates across 5000 simulations. This step reduces the dimensionality of the results.

    • In run_combine.m, first set spec_id_array = [1:30], dgp_type = 'G' (or 'MP'). Additionally, specify estimand_type, lag_type, and mode_type to be consistent with Step 1.
    • Finally, run run_combine.m once to summarize the 5000 simulations as 9 summary statistics for each DGP.
    • These summary statistics will also be saved in the directory "DFM/Results/".
  3. Properties of selected DGPs and true IRFs: Run the following scripts to summarize the properties of the selected DGPs and their true IRFs (Section 3.4).

    • In Reporting/run_plot_dgp.m, set mode_select = 1, lags_select = 2, and exper_select_group = {[2,5]}.
    • Then run Reporting/run_plot_dgp.m to summarize selected DGPs (Table 1) and plot examples of true IRFs (Figure 1). (Warning: In Table 1, the row "IV first stage F-statistic" will be computed in Step 5 below.)
    • Outputs are all saved in the directory "Reporting/fig/".
  4. Evaluate loss for observed-shock estimators: Run the following scripts to show bias and variance profiles of each estimator under observed shock identification, and compare their loss at different bias weights and target horizons (Sections 5.1-5.3).

    • Always set mode_select = 1, lags_select = 2, and exper_select_group = {[2,5]} below.
    • Run Reporting/run_plot_loss.m to get bias and variance profiles separately for each estimator (Figures 2-3).
    • Run Reporting/run_plot_tradeoff.m to get head-to-head loss comparison between two estimators (Figures 4-5 and 7-9).
    • Run the Jupyter Notebook Reporting/plot_best_method.ipynb (with folder set to the output directory in Step 3), to depict the optimal estimator given different bias weights and target horizons (Figure 6).
    • Outputs are all saved in the directory "Reporting/fig/".
  5. Evaluate loss for IV estimators: Run the following scripts to get bias and variance profiles for estimators under IV identification (Figures 10-11).

    • Redo Steps 1-4, but change estimand_type = 'IV' in Steps 1-2, and exper_select_group = {[1,4]} in Steps 3-4.

Additional results in the online appendix

  1. Examples of estimated IRFs: Run the following scripts to plot examples of IRF estimates, as in Appendix E.

  2. Further evaluations for IV estimators: Run the following scripts to further examine bias and variance profiles of IV estimators, as in Appendix F.1.

    • Figures F.1-F.2 should have been generated in the outputs of Step 5.
    • For Figures F.3-F.4, repeat Step 5, but specify DGP_select to 2 (low degree of invertibility) or 3 (high degree of invertibility) in Reporting/run_plot_loss.m.
  3. Robustness checks: Run the following scripts to revisit the bias and variance trade-off in various extensions (Appendices F.2-F.10).

    • Each of the sub-steps below requires repeating Steps 1-4, but with slight adjustments.
    • Stationary DGPs (Table F.1, Figures F.5-F.7): change mode_type = 6 in Steps 1-2, and mode_select = 6 in Steps 3-4.
    • Recursive identification (Table F.2, Figures F.8-F.10): change estimand_type = 'Recursive' in Steps 1-2, and exper_select_group = {[3,6]} in Steps 3-4.
    • Salient observables (Figures F.11-F.13): change mode_type = 4 in Steps 1-2, and mode_select = 4 in Steps 3-4. (Warning: In Step 1, the code will not execute for sufficiently large values of spec_id, since the total number of available DGPs is exhausted. Simply skip to the next step when this happens.)
    • 90th percentile loss (Figures F.14-F.16): change loss_quant = 0.9 in Step 4.
    • Fiscal and monetary shocks (Figures F.17-F.20): change exper_select_group = {[2]} (to display fiscal shocks only) or exper_select_group = {[5]} (to display monetary shocks only) in Steps 3-4.
    • Longer estimation lag length (Figures F.21-F.23): change lag_type = 8 in Steps 1-2, and lags_select = 3 in Steps 3-4.
    • Smaller sample size (Figure F.24-F.26): change mode_type = 2 in Steps 1-2, and mode_select = 2 in Steps 3-4.
    • Larger sample size and estimation lag length (Figures F.27-F.29): change mode_type = 3 and lag_type = 12 in Steps 1-2, coupled with mode_select = 3 and lags_select = 4 in Steps 3-4.
    • More observables (Figure F.30-F.32): change mode_type = 5 in Steps 1-2, and mode_select = 5 in Steps 3-4. Also redo Step 5 for IV estimators.
  4. Splitting by variable categories: Table F.3 should have been generated in the outputs after finishing Steps 1-4 (Appendix F.11).

Acknowledgements

We rely on BVAR code by Domenico Giannone, Michele Lenza & Giorgio Primiceri, penalized LP code by Regis Barnichon & Christian Brownlees, as well as VAR model averaging code by Bruce Hansen. We have slightly modified these sets of code to improve their run-time without affecting their numerical output. We also use Dynamic Factor Model code and data by Eben Lazarus, Daniel Lewis, Jim Stock & Mark Watson.

Plagborg-Møller acknowledges that this material is based upon work supported by the NSF under Grant #2238049, and Wolf does the same for Grant #2314736.