The effects of monetary policy: Vector Autoregressions

Jaromír Baxa & Eva Hromádková

IES FSV UK

Introduction

Macroeconomists often want to:

  • Forecast the most important macroeconomic indicators.

  • Infer causal relationships.

  • Predict the effects of policy changes, such as of interest rate cuts.

Vector autoregressions can help us with all these tasks.

Introduction: Monetary policy shocks

First of all, not all changes of interest rate are policy changes (so-called policy shocks).

Monetary policy follows anticipated changes in inflation and economic activity (some rule is followed, at least implicitly).

Our main intention is to infer the effects of changes in policy, and so we need to identify the policy shocks first. Usually, economists do both steps at once, either using structural or vector autoregressive models.

Outline

  • Definition of VAR models

  • Example: Effects of monetary policy

  • Estimation issues

  • Impulse responses

  • Forecasting

  • What do we know about the effects of monetary policy

  • What do we know about the effects of fiscal policy

Vector Autoregressions

Vector autoregression (VAR) model is given by:

\[ y_{1,t} = b_1 + \sum_{i=1}^p \gamma_{11}^i y_{1,t-i} + \sum_{i=1}^p \gamma_{12}^i y_{2,t-i} + u_{1,t} \]

\[ y_{2,t} = b_2 + \sum_{i=1}^p \gamma_{21}^i y_{1,t-i} + \sum_{i=1}^p \gamma_{22}^i y_{2,t-i} + u_{2,t} \]

In short:

\[ y_{t} = A_0 + A_{1} y_{t-1} + ... + A_{p} y_{t-p} + u_{t} \]

  • VAR is an extension of the AR model to a multivariate case. The variable \(y_{it}\) is regressed on constant, its past observations and on past observations of all other variables.

  • All variables evolve dynamically, their dynamics is interrelated, and there are as many shocks as many variables are included in VAR.

VARs and the effects of monetary policy

Popular applications of VAR models:

  • Estimation of the effects of monetary policy.

  • Estimation of the effects of fiscal policy

  • Forecasting

For the effects of monetary policy, the vector of variables \(y_t\) contains the real GDP, inflation, interest rate, and other variables that are supposed to play a role in transmission of monetary policy, or in the formation of inflation expectations.

Note that the VAR model \(y_t = A_0 + A_1 y_{t-1} + u_t\) is a so-called reduced form. It does not include the contemporaneous terms.

The corresponding structural form is \(B y_t = BA_0 + BA_1y_{t-1} + ε_t\) with \(u_t = B^{-1}ε_t\) , and \(\varepsilon_t\) are structural (policy) shocks that are uncorrelated with each other.

This structural form cannot be estimated directly – the presence of contemporaneous terms leads to endogeneity.

Matrix \(B\) indicates the contemporaneous correlations among variables. To assure identification, matrix \(B\) is supposed to be lower triangular (other, more complex approaches exist as well).

Identification of monetary shocks

How does triangularization of \(B\) helps with identification?

Consider matrix \(B^{-1}\):

\[ \begin{pmatrix}1 & 0 & 0 & 0\\b_1 & 1 & 0 & 0 \\ b_2 & b_3 & 1 & 0 \\ b_4 & b_5 & b_6 & 1\end{pmatrix} \begin{pmatrix} \varepsilon_y \\ \varepsilon_p \\ \varepsilon_i \\ \varepsilon_x \end{pmatrix} = \begin{pmatrix} u_1 \\ u_2 \\ u_3 \\ u_4 \end{pmatrix} \]

  • Contemporaneously, the GDP is affected by itself, the price level is affected by itself and by the GDP, and the interest rate is contemporaneously affected by both variables ordered above it:

    \[ i_t = \color{red} {\mu_0 + \gamma_{3,1} y_{t-1} + \gamma_{3,2} p_{t-1} + \gamma_{3,3} i_{t-1} + \gamma_{3,4} x_{t-1} } + \color{green} { b_2 \varepsilon_{y,t} + b_3 \varepsilon_{p,t} + \varepsilon_{i,t} } \]

    \[ y_t = \color{red} {A_0 + A_1 y_{t-1}} \color{green} {+ B^{-1} \varepsilon_t} \]

  • The \(b_2 ε_y + b_3 ε_p\) account for endogenous responses of interest rate to output and price level.

  • Identification of monetary policy shock is achieved!

Estimation of VAR models

What do we need to do before estimating the VAR model?

  • Choice of variables

  • Choice of ordering

  • Stability issues

  • Lag length selection

Estimation of VAR models

Lag length: information criteria (AIC, BIC) or rule of thumb depending on frequency of the data (4 lags for quarterly data, for example), likelihood ratio tests.

Stability: AR and MA time series models require the assumption of stationarity (constant mean, constant variance and mean-reversion), VAR models are not so strict.

  • If variables are nonstationary, we might 1) include linear trend 2) transform variables (first differences, gaps, y-o-y changes might work as well).

  • First differences cancel out long-term comovement, that’s why log-levels are used quite often (but their forecasts might diverge) => there is not just one “correct” approach.

Ordering of variables: The convention is to order the most exogenous variable first, the variable that reacts fastest on all others as the last one (the contemporaneous reactions of the upper variable on other variables are restricted to zero for computational reasons that are above the aim of this course).

Estimation of the Effects of Monetary Policy using VAR

Data: U.S., FRED database, sample 1960:1-2008:3 (other samples follow).

Quarterly data, 6 lags (recommended by the AIC criterion)

Variables and ordering:

  1. Real GDP: gdpc1 (log, seasonal differences, multiplied by 100)

  2. Prices: cpiaucsl (log, seasonal differences, multiplied by 100)

  3. Fed funds rate (fedfunds, %)

  4. Commodity prices inflation: ppiaco (log, first differences, multiplied by 100)

Sensitivity analysis - different transformations of variables, such as GDP gap derived as the difference between GDP and potential GDP estimated at BEA (gdppot); unemployment rate as other variable representing economic activity (unrate); or different samples: extending the sample, using shadow interest rate, inclusion of credit spreads and spread between long-term and short-term interest rates… => many options!

Code for the dataset

library(xts)
library(pdfetch) #Library for loading FRED data
library(ggplot2) #Library for plotting
library(mFilter) #Library for HP filter
library(tsbox)   #Library for time series conversion
library(forecast)#Library for simple plotting

data_var <- pdfetch_FRED(c("GDP", "GDPC1", "GDPPOT", "FEDFUNDS", "CPIAUCSL", "PPIACO", "UNRATE", "M2SL", "GS10"))
data_var <- to.period(data_var, period = "quarter", OHLC = FALSE)
data_var <- ts_first_of_period(data_var) #to assure consistency in dates across time series objects

data_var2 <- pdfetch_FRED(c("T10Y3M", "DBAA")) #spread + corporate bond rate on daily frequency
data_var2 <- to.quarterly(data_var2,OHLC=FALSE)
data_var2 <- ts_first_of_period(data_var2)

#Transformations

data_var$lgdp <- log(data_var$GDPC1) # Log of real GDP
data_var$lgdp_pot <- log(data_var$GDPPOT) # Log of potential GDP
data_var$gdpgap <- 100*(data_var$lgdp - data_var$lgdp_pot) # Gap as a difference between actual and potential output
hp_gdp <- hpfilter(data_var$lgdp, freq = 1600, type="lambda")
data_var$gdpgap_hp <- 100*hp_gdp$cycle
data_var$d_lgdp <- 100*diff(data_var$lgdp,1) #first differences
data_var$gdp_growth <- 100*diff(data_var$lgdp,4) #seasonal difference (annual growth), in percent

data_var$l_cpi <- log(data_var$CPIAUCSL)
data_var$inflation <- 100*diff(data_var$l_cpi, 4) #inflation as y-o-y change in CPI, in percent
#data_var$infrate <- 1/4*(data_var$inflation + lag(data_var$inflation, k=1) + lag(data_var$inflation, k=2) + lag(data_var$inflation, k=3))

data_var$l_ppiaco <- log(data_var$PPIACO)
data_var$ppiaco_ld <- 100*diff(data_var$l_ppiaco,4)

data_var$unrate <- data_var$UNRATE
data_var$fedfunds <- data_var$FEDFUNDS
data_var$gs10 <- data_var$GS10
data_var$creditspread <- data_var2$DBAA - data_var$GS10 
data_var$termstructure <- data_var2$T10Y3M

data_var$m2 <- data_var$M2SL
data_var$m2_l <- log(data_var$m2)
data_var$m2_ld <- 100*diff(data_var$m2_l,4)

#Shadow rate - construction from the federal funds rate and the shadow rate from Cynthia Wu's website
data_shadow6008 <- data_var$FEDFUNDS["1959-01-01/2008-12-31"]
data_shadow0915 <- ts(c(0.75,0.02,-0.41,-0.15,-0.48,-0.54,-0.80,-0.88,-0.99,-1.12,-1.40,-1.47,-1.27,-1.11,-1.36,-1.43,-1.44,-0.97,-1.80,-2.13,-2.62,-2.89,-2.81,-2.42,-1.81,-1.38,-0.74,-0.004),start=c(2009,01), frequency = 4)
data_shadow0915 <- ts_xts(data_shadow0915)
data_shadow1620 <- data_var$FEDFUNDS["2016-01-01/2020-03-01"]
data_shadow2021 <- ts(c(0.40,0.08,-0.29,-1.56,-1.83,-1.81,-1.15), start = c(2020,02), frequency = 4)
data_shadow2021 <- ts_xts(data_shadow2021)
data_shadow22end <- data_var$FEDFUNDS["2022-01-01/"]
data_var$shadowrate <- rbind(data_shadow6008,data_shadow0915,data_shadow1620,data_shadow2021,data_shadow22end)
autoplot(data_var$shadowrate)

VAR model I: 1960 - 2008

# Libraries for VAR models
library(vars) #main library for VAR models in R
library(svars) #used for plotting of impulse responses

data_6208 <- data_var["1962-01-01/2008-07-01"]
vardata1 <- data_6208[,c("gdp_growth", "inflation", "fedfunds", "ppiaco_ld")]
autoplot(vardata1) #simple plot for a brief check of the data, for outliers seasonality etc.

#Lag length selection
var1.select <- VARselect(vardata1, lag.max=6, type ="const")
var1.select$selection

#Estimation of VAR model
var1 <- VAR(vardata1, p=6, type = "const")
summary(var1)
#plot(var1) #plot of fitted values, residuals, autocorrelation functions of residuals

VAR model I: 1960 - 2008

VAR model I: 1960 - 2008

AIC(n)  HQ(n)  SC(n) FPE(n) 
     6      6      2      6 

VAR Estimation Results:
========================= 
Endogenous variables: gdp_growth, inflation, fedfunds, ppiaco_ld 
Deterministic variables: const 
Sample size: 181 
Log Likelihood: -873.078 
Roots of the characteristic polynomial:
0.9327 0.9327 0.8589 0.8589 0.8429 0.8429 0.8415 0.8415 0.8373 0.8373 0.8189 0.8189 0.8159 0.8159 0.8095 0.8095 0.7989 0.7989 0.6489 0.6489 0.5537 0.4841 0.4091 0.05831
Call:
VAR(y = vardata1, p = 6, type = "const")


Estimation results for equation gdp_growth: 
=========================================== 
gdp_growth = gdp_growth.l1 + inflation.l1 + fedfunds.l1 + ppiaco_ld.l1 + gdp_growth.l2 + inflation.l2 + fedfunds.l2 + ppiaco_ld.l2 + gdp_growth.l3 + inflation.l3 + fedfunds.l3 + ppiaco_ld.l3 + gdp_growth.l4 + inflation.l4 + fedfunds.l4 + ppiaco_ld.l4 + gdp_growth.l5 + inflation.l5 + fedfunds.l5 + ppiaco_ld.l5 + gdp_growth.l6 + inflation.l6 + fedfunds.l6 + ppiaco_ld.l6 + const 

              Estimate Std. Error t value Pr(>|t|)    
gdp_growth.l1  0.96418    0.08310  11.603  < 2e-16 ***
inflation.l1  -0.20489    0.16184  -1.266 0.207419    
fedfunds.l1    0.08431    0.05840   1.444 0.150853    
ppiaco_ld.l1   0.01276    0.05627   0.227 0.820844    
gdp_growth.l2  0.08361    0.11262   0.742 0.458917    
inflation.l2   0.00779    0.21916   0.036 0.971691    
fedfunds.l2   -0.25389    0.07092  -3.580 0.000458 ***
ppiaco_ld.l2   0.02948    0.07567   0.390 0.697398    
gdp_growth.l3 -0.08739    0.10851  -0.805 0.421860    
inflation.l3  -0.02149    0.19786  -0.109 0.913659    
fedfunds.l3   -0.06699    0.07429  -0.902 0.368583    
ppiaco_ld.l3   0.05404    0.07120   0.759 0.449039    
gdp_growth.l4 -0.29792    0.10589  -2.814 0.005530 ** 
inflation.l4   0.13116    0.19071   0.688 0.492645    
fedfunds.l4    0.01958    0.07644   0.256 0.798213    
ppiaco_ld.l4  -0.05753    0.06957  -0.827 0.409595    
gdp_growth.l5  0.22791    0.10968   2.078 0.039355 *  
inflation.l5   0.01027    0.20756   0.049 0.960613    
fedfunds.l5   -0.03427    0.07695  -0.445 0.656628    
ppiaco_ld.l5   0.05017    0.07400   0.678 0.498825    
gdp_growth.l6  0.07058    0.07662   0.921 0.358430    
inflation.l6   0.15881    0.15295   1.038 0.300729    
fedfunds.l6    0.18096    0.06287   2.879 0.004556 ** 
ppiaco_ld.l6  -0.10612    0.05423  -1.957 0.052172 .  
const          0.26782    0.31446   0.852 0.395699    
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1


Residual standard error: 0.8236 on 156 degrees of freedom
Multiple R-Squared: 0.8725, Adjusted R-squared: 0.8529 
F-statistic: 44.47 on 24 and 156 DF,  p-value: < 2.2e-16 


Estimation results for equation inflation: 
========================================== 
inflation = gdp_growth.l1 + inflation.l1 + fedfunds.l1 + ppiaco_ld.l1 + gdp_growth.l2 + inflation.l2 + fedfunds.l2 + ppiaco_ld.l2 + gdp_growth.l3 + inflation.l3 + fedfunds.l3 + ppiaco_ld.l3 + gdp_growth.l4 + inflation.l4 + fedfunds.l4 + ppiaco_ld.l4 + gdp_growth.l5 + inflation.l5 + fedfunds.l5 + ppiaco_ld.l5 + gdp_growth.l6 + inflation.l6 + fedfunds.l6 + ppiaco_ld.l6 + const 

               Estimate Std. Error t value Pr(>|t|)    
gdp_growth.l1  0.083488   0.058514   1.427  0.15564    
inflation.l1   1.027560   0.113964   9.017 6.65e-16 ***
fedfunds.l1    0.121705   0.041122   2.960  0.00356 ** 
ppiaco_ld.l1   0.025922   0.039622   0.654  0.51391    
gdp_growth.l2 -0.118042   0.079298  -1.489  0.13862    
inflation.l2   0.053376   0.154326   0.346  0.72991    
fedfunds.l2   -0.102247   0.049940  -2.047  0.04230 *  
ppiaco_ld.l2  -0.002044   0.053284  -0.038  0.96945    
gdp_growth.l3  0.034610   0.076410   0.453  0.65121    
inflation.l3   0.198890   0.139322   1.428  0.15542    
fedfunds.l3    0.046954   0.052309   0.898  0.37076    
ppiaco_ld.l3  -0.046795   0.050137  -0.933  0.35209    
gdp_growth.l4  0.131084   0.074562   1.758  0.08070 .  
inflation.l4  -0.694738   0.134291  -5.173 6.97e-07 ***
fedfunds.l4   -0.109095   0.053825  -2.027  0.04438 *  
ppiaco_ld.l4   0.057279   0.048991   1.169  0.24411    
gdp_growth.l5 -0.089703   0.077234  -1.161  0.24724    
inflation.l5   0.372420   0.146156   2.548  0.01180 *  
fedfunds.l5   -0.042365   0.054183  -0.782  0.43546    
ppiaco_ld.l5   0.017702   0.052107   0.340  0.73453    
gdp_growth.l6  0.039184   0.053955   0.726  0.46878    
inflation.l6   0.020230   0.107698   0.188  0.85125    
fedfunds.l6    0.070659   0.044267   1.596  0.11247    
ppiaco_ld.l6  -0.041708   0.038189  -1.092  0.27645    
const         -0.106184   0.221431  -0.480  0.63223    
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1


Residual standard error: 0.58 on 156 degrees of freedom
Multiple R-Squared: 0.9597, Adjusted R-squared: 0.9535 
F-statistic: 154.8 on 24 and 156 DF,  p-value: < 2.2e-16 


Estimation results for equation fedfunds: 
========================================= 
fedfunds = gdp_growth.l1 + inflation.l1 + fedfunds.l1 + ppiaco_ld.l1 + gdp_growth.l2 + inflation.l2 + fedfunds.l2 + ppiaco_ld.l2 + gdp_growth.l3 + inflation.l3 + fedfunds.l3 + ppiaco_ld.l3 + gdp_growth.l4 + inflation.l4 + fedfunds.l4 + ppiaco_ld.l4 + gdp_growth.l5 + inflation.l5 + fedfunds.l5 + ppiaco_ld.l5 + gdp_growth.l6 + inflation.l6 + fedfunds.l6 + ppiaco_ld.l6 + const 

               Estimate Std. Error t value Pr(>|t|)    
gdp_growth.l1  0.185829   0.119043   1.561 0.120546    
inflation.l1  -0.443238   0.231852  -1.912 0.057744 .  
fedfunds.l1    0.745767   0.083659   8.914 1.23e-15 ***
ppiaco_ld.l1   0.212795   0.080607   2.640 0.009136 ** 
gdp_growth.l2  0.092531   0.161327   0.574 0.567090    
inflation.l2   0.706905   0.313964   2.252 0.025747 *  
fedfunds.l2   -0.142462   0.101600  -1.402 0.162845    
ppiaco_ld.l2  -0.250547   0.108402  -2.311 0.022127 *  
gdp_growth.l3 -0.142363   0.155450  -0.916 0.361179    
inflation.l3   0.160777   0.283441   0.567 0.571371    
fedfunds.l3    0.372241   0.106419   3.498 0.000611 ***
ppiaco_ld.l3  -0.032458   0.102000  -0.318 0.750744    
gdp_growth.l4  0.117634   0.151690   0.775 0.439226    
inflation.l4  -0.233952   0.273204  -0.856 0.393131    
fedfunds.l4   -0.203417   0.109503  -1.858 0.065104 .  
ppiaco_ld.l4   0.066689   0.099668   0.669 0.504411    
gdp_growth.l5  0.013931   0.157128   0.089 0.929464    
inflation.l5  -0.305778   0.297344  -1.028 0.305370    
fedfunds.l5    0.318705   0.110231   2.891 0.004385 ** 
ppiaco_ld.l5   0.119950   0.106009   1.132 0.259578    
gdp_growth.l6 -0.003801   0.109768  -0.035 0.972421    
inflation.l6   0.456781   0.219104   2.085 0.038720 *  
fedfunds.l6   -0.287778   0.090058  -3.195 0.001690 ** 
ppiaco_ld.l6  -0.189018   0.077693  -2.433 0.016110 *  
const         -0.836553   0.450486  -1.857 0.065196 .  
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1


Residual standard error: 1.18 on 156 degrees of freedom
Multiple R-Squared: 0.8884, Adjusted R-squared: 0.8712 
F-statistic: 51.74 on 24 and 156 DF,  p-value: < 2.2e-16 


Estimation results for equation ppiaco_ld: 
========================================== 
ppiaco_ld = gdp_growth.l1 + inflation.l1 + fedfunds.l1 + ppiaco_ld.l1 + gdp_growth.l2 + inflation.l2 + fedfunds.l2 + ppiaco_ld.l2 + gdp_growth.l3 + inflation.l3 + fedfunds.l3 + ppiaco_ld.l3 + gdp_growth.l4 + inflation.l4 + fedfunds.l4 + ppiaco_ld.l4 + gdp_growth.l5 + inflation.l5 + fedfunds.l5 + ppiaco_ld.l5 + gdp_growth.l6 + inflation.l6 + fedfunds.l6 + ppiaco_ld.l6 + const 

               Estimate Std. Error t value Pr(>|t|)    
gdp_growth.l1  0.066248   0.170367   0.389   0.6979    
inflation.l1   0.337976   0.331811   1.019   0.3100    
fedfunds.l1    0.098940   0.119727   0.826   0.4098    
ppiaco_ld.l1   1.007253   0.115360   8.731 3.65e-15 ***
gdp_growth.l2 -0.094555   0.230880  -0.410   0.6827    
inflation.l2   0.012463   0.449325   0.028   0.9779    
fedfunds.l2   -0.006221   0.145403  -0.043   0.9659    
ppiaco_ld.l2  -0.132842   0.155138  -0.856   0.3932    
gdp_growth.l3 -0.007202   0.222470  -0.032   0.9742    
inflation.l3   0.110408   0.405643   0.272   0.7858    
fedfunds.l3   -0.186917   0.152299  -1.227   0.2216    
ppiaco_ld.l3   0.100668   0.145975   0.690   0.4915    
gdp_growth.l4  0.153149   0.217089   0.705   0.4816    
inflation.l4  -0.813920   0.390992  -2.082   0.0390 *  
fedfunds.l4   -0.077072   0.156713  -0.492   0.6236    
ppiaco_ld.l4  -0.351433   0.142638  -2.464   0.0148 *  
gdp_growth.l5 -0.186967   0.224871  -0.831   0.4070    
inflation.l5   0.581654   0.425539   1.367   0.1736    
fedfunds.l5    0.060953   0.157755   0.386   0.6997    
ppiaco_ld.l5   0.326567   0.151713   2.153   0.0329 *  
gdp_growth.l6  0.065920   0.157092   0.420   0.6753    
inflation.l6  -0.062496   0.313567  -0.199   0.8423    
fedfunds.l6   -0.001592   0.128886  -0.012   0.9902    
ppiaco_ld.l6  -0.107380   0.111189  -0.966   0.3357    
const          0.659920   0.644706   1.024   0.3076    
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1


Residual standard error: 1.689 on 156 degrees of freedom
Multiple R-Squared: 0.8776, Adjusted R-squared: 0.8587 
F-statistic: 46.59 on 24 and 156 DF,  p-value: < 2.2e-16 



Covariance matrix of residuals:
           gdp_growth inflation fedfunds ppiaco_ld
gdp_growth    0.67836   0.02258   0.4016   0.06854
inflation     0.02258   0.33636   0.1834   0.70709
fedfunds      0.40157   0.18337   1.3921   0.49411
ppiaco_ld     0.06854   0.70709   0.4941   2.85131

Correlation matrix of residuals:
           gdp_growth inflation fedfunds ppiaco_ld
gdp_growth    1.00000   0.04728   0.4132   0.04928
inflation     0.04728   1.00000   0.2680   0.72203
fedfunds      0.41323   0.26797   1.0000   0.24801
ppiaco_ld     0.04928   0.72203   0.2480   1.00000

Impulse responses

  • Output - Coefficient estimates. Often not reported at all: too many coefficients, with increasing order p many become insignificant.

  • Alternative option to present the results are impulse response functions:

  • „What happens with output if an increase in interest rate occur?” => Graphical representations of shocks and their effects at selected horizons.

  • Shocks of size 1 SD.

  • Impulse responses need to be plotted with confidence intervals (either 2 SD or 1 SD used) to assess whether the effects are statistically significant or not at a given horizon.

  • Next slides: IRF’s of monetary VAR for the U.S. (1960-2008 sample) and forecasts starting in 2008. It can be seen how large the Great Recession was and that it was hard to forecast the effects on output in advance. Still, when facing “moderate” shocks, VAR-based forecasts are reasonably reliable.

Impulse responses: VAR 1960 - 2008

var1_cholesky <- id.chol(var1) #performs Cholesky identification
var1_irf <- irf(var1_cholesky, n.ahead = 20) 
#plot(var1_irf) #plot without confidence intervals
var1_bootirf <- wild.boot(var1_cholesky, design = "fixed", distr = "gaussian", n.ahead = 20, nboot = 100) 
plot(var1_bootirf, lowerq = 0.05, upperq = 0.95)

Impulse responses: VAR 1960 - 2008

#Impulse responses from vars package not very convenient:
nAhead <- 20
var1irf <- irf(var1, n.ahead = nAhead, ci = 0.95,
               cumulative = F, boot = T, ortho = T)
#default plots from vars package
plot(var1irf) 
#plot of impulse responses of individual variables to MP shock
plot(irf(var1,impulse = "fedfunds", response = "fedfunds", n.ahead = 20)) 
plot(irf(var1,impulse = "fedfunds", response = "gdp_growth", n.ahead = 20)) 
plot(irf(var1,impulse = "fedfunds", response = "inflation", n.ahead = 20))

Forecasting: Recovery, not crisis predicted in 2008

predict(var1, n.ahead = 12, ci = 0.95) #prints forecasted values
plot(predict(var1), xlim = c(150,200))
fanchart(predict(var1), xlim = c(175,200))
$gdp_growth
          fcst      lower    upper       CI
 [1,] 1.303067 -0.3112113 2.917345 1.614278
 [2,] 2.569515  0.2649548 4.874075 2.304560
 [3,] 3.658557  0.8652433 6.451870 2.793313
 [4,] 4.709907  1.5384634 7.881352 3.171444
 [5,] 4.492092  1.0823270 7.901857 3.409765
 [6,] 4.060849  0.3198763 7.801822 3.740973
 [7,] 3.587794 -0.3501581 7.525746 3.937952
 [8,] 2.922548 -1.1525468 6.997643 4.075095
 [9,] 2.907428 -1.2762810 7.091137 4.183709
[10,] 2.937757 -1.3154048 7.190920 4.253162
[11,] 2.831485 -1.4710601 7.134030 4.302545
[12,] 2.928711 -1.3988409 7.256262 4.327552

$inflation
          fcst     lower     upper       CI
 [1,] 4.218531 3.0818270  5.355235 1.136704
 [2,] 4.528288 2.7558975  6.300679 1.772391
 [3,] 4.530570 2.2020257  6.859113 2.328544
 [4,] 4.429247 1.4660340  7.392460 2.963213
 [5,] 4.781641 1.4123193  8.150964 3.369322
 [6,] 4.852560 1.1494808  8.555638 3.703079
 [7,] 4.979024 0.9612240  8.996824 4.017800
 [8,] 5.259423 1.0013934  9.517452 4.258029
 [9,] 5.438654 0.9639075  9.913400 4.474746
[10,] 5.680420 1.0271682 10.333671 4.653252
[11,] 5.867960 1.0636931 10.672226 4.804267
[12,] 5.994641 1.0483805 10.940901 4.946261

$fedfunds
           fcst     lower    upper       CI
 [1,] 0.9548286 -1.357713 3.267370 2.312542
 [2,] 0.8374323 -2.199085 3.873950 3.036517
 [3,] 1.4022724 -1.945414 4.749959 3.347687
 [4,] 1.2544799 -2.590452 5.099412 3.844932
 [5,] 1.5972244 -2.600814 5.795263 4.198038
 [6,] 2.1281802 -2.463084 6.719445 4.591264
 [7,] 2.1150039 -2.763609 6.993617 4.878613
 [8,] 2.6927094 -2.366950 7.752369 5.059660
 [9,] 3.1931461 -2.020688 8.406980 5.213834
[10,] 3.3402093 -2.010790 8.691209 5.350999
[11,] 3.8879233 -1.593155 9.369002 5.481079
[12,] 4.2181970 -1.378162 9.814556 5.596359

$ppiaco_ld
           fcst      lower    upper       CI
 [1,] 10.814777  7.5052191 14.12434 3.309558
 [2,] 10.396799  5.4358256 15.35777 4.960973
 [3,]  8.622079  2.3971723 14.84699 6.224906
 [4,]  8.630421  1.1791936 16.08165 7.451227
 [5,]  9.361409  1.4464118 17.27641 7.914997
 [6,]  8.839733  0.5529691 17.12650 8.286764
 [7,]  9.148000  0.5578476 17.73815 8.590153
 [8,]  9.239969  0.4941085 17.98583 8.745861
 [9,]  8.701115 -0.2457893 17.64802 8.946904
[10,]  8.967816 -0.1254852 18.06112 9.093301
[11,]  8.929639 -0.2700410 18.12932 9.199680
[12,]  8.714868 -0.6060040 18.03574 9.320872

Forecasting: Recovery, not crisis predicted in 2008

Forecasting: Model extended for credit spreads and term structure

data_8608 <- data_var["1986-01-01/2008-07-01"]
vardata2b <- data_8608[,c("gdp_growth", "inflation", "creditspread", "fedfunds", "termstructure", "ppiaco_ld")]
var2b.select <- VARselect(vardata2b, lag.max=6, type ="const")
var2b.select$selection
var2b <- VAR(vardata2b, p=5, type = "const")
fanchart(predict(var2b), xlim = c(75,100))
#Note: When the period 1979 - 1985 excluded, strong price puzzle appears.

Forecasting: Model extended for credit spreads and term structure

AIC(n)  HQ(n)  SC(n) FPE(n) 
     5      1      1      3 

VAR model II: Volcker - Greenspan Era

data_7908 <- data_var["1978-01-01/2008-07-01"]
vardata2 <- data_7908[,c("gdp_growth", "inflation", "fedfunds", "ppiaco_ld")]
var2.select <- VARselect(vardata2, lag.max=6, type ="const")
var2.select$selection
var2 <- VAR(vardata2, p=6, type = "const")
summary(var2)
var2_cholesky <- id.chol(var2) #performs Cholesky identification
var2_bootirf <- wild.boot(var2_cholesky, design = "fixed", distr = "gaussian", n.ahead = 20, nboot = 100) 
plot(var2_bootirf, lowerq = 0.05, upperq = 0.95)

VAR model III: Volcker - Greenspan Era + Great Recession

data_7921 <- data_var["1978-01-01/2021-12-01"]
vardata3 <- data_7921[,c("gdp_growth", "inflation", "shadowrate", "ppiaco_ld")]
var3.select <- VARselect(vardata3, lag.max=6, type ="const")
var3.select$selection
var3 <- VAR(vardata3, p=4, type = "const") #with six lags, IRFs too volatile
summary(var3)
var3_cholesky <- id.chol(var3) #performs Cholesky identification
var3_bootirf <- wild.boot(var3_cholesky, design = "fixed", distr = "gaussian", n.ahead = 20, nboot = 100) 
plot(var3_bootirf, lowerq = 0.05, upperq = 0.95)

VAR model III: Volcker - Greenspan Era + Great Recession

Positive response of output growth and inflation to a positive interest rate shock are against our intuition.

However, such results appear quite often in applied work: Price puzzle.

Several alternative explanations:

  1. price puzzle arises when no strong monetary shocks appear in the sample (but here Volcker’s disinflation included).

  2. price puzzle arises when monetary policy passive and did not offset inflationary monetary policy shocks. Rather, the interest rate changes followed the developments in inflation and output gap passively.

  3. price puzzle arises due to misspecification of the model (however improved identification schemes that used to eliminate price puzzle five or ten years ago do not help on samples starting after 1983 anymore, see Ramey, 2016, Handbook of Macroeconomics II).

VAR model IV: Full sample + Out of sample forecast

data_full <- data_var["1962-01-01/"]
vardata4 <- data_full[,c("ppiaco_ld", "gdp_growth", "unrate", "inflation", "shadowrate", "m2_ld")]
var4.select <- VARselect(vardata4, lag.max=6, type ="const")
var4.select$selection
var4 <- VAR(vardata4, p=6, type = "const")
summary(var4)
var4_cholesky <- id.chol(var4) #performs Cholesky identification
var4_bootirf <- wild.boot(var4_cholesky, design = "fixed", distr = "gaussian", n.ahead = 20, nboot = 100) 
plot(var4_bootirf, lowerq = 0.05, upperq = 0.95)

VAR model IV: Full sample + Out of sample forecast

VAR model IV: Full sample + Out of sample forecast

#Prediction
#plot(predict(var4),xlim=c(200,260))
fanchart(predict(var4),xlim=c(200,260))

VAR model V: Out of sample prediction - Alternative specification

data_7921 <- data_var["1986-01-01/"]
vardata4b <- data_7921[,c("gdp_growth", "inflation", "shadowrate", "creditspread", "termstructure", "ppiaco_ld")]
var4b.select <- VARselect(vardata4b, lag.max=6, type ="const")
var4b.select$selection
var4b <- VAR(vardata4b, p=5, type = "const") #with six lags, IRFs too volatile
#summary(var3)
#var4b_cholesky <- id.chol(var4b) #performs Cholesky identification
#var4b_bootirf <- wild.boot(var4b_cholesky, design = "fixed", distr = "gaussian", n.ahead = 20, nboot = 100) 
#plot(var4b_bootirf, lowerq = 0.05, upperq = 0.95)
fanchart(predict(var4b))

VAR model V: Out of sample prediction - Alt. specification

VAR model V: Forecasting the post-COVID recovery

#Forecasting COVID recovery - data till the third quarter of 2020
data_6220 <- data_var["1962-01-01/2020-07-01"]
vardata5 <- data_6220[,c("ppiaco_ld", "gdp_growth", "unrate", "inflation", "shadowrate", "m2_ld")]
var5.select <- VARselect(vardata5, lag.max=6, type ="const")
var5.select$selection
var5 <- VAR(vardata5, p=6, type = "const")
summary(var5)
plot(predict(var5),xlim=c(200,250))

VAR model VI: Forecasting the post-COVID recovery

What do we know: The effects of monetary policy

  • Our results on a sample till 2008 well in line with the literature, like Christiano, Eichenbaum and Evans (1999, Handbook of Macroeconomics); the post-2008 results consistent with Ramey (2016, Handbook of Macroeconomics, 2nd ed.).

  • Consensus: Monetary policy, represented by changes in interest rate, has significant effects on economic activity and on inflation.

  • In response to increase of interest rate, the GDP decreases and the effect is strongest between 4 an 12 quarters. Response of inflation: our experiment suggests the fall of inflation after 8 quarters, Christiano et al. (1999) report the main decrease after about 6 quarters using more sophisticated identification scheme.

  • The delay of the effects of monetary policy from 6 to 8 quarters seems to be the „consensus” result of most studies and it corresponds to economic activity.

  • Structural models (e.g. New Keynesian DSGE) seem to provide similar results.

  • VAR models can be used also for evaluation of the effects of unconventional monetary policy focused on expansion of balanced sheets of the central banks, see for example an ECB WP by Geert Peersman (Macroeconomic effects of unconventional monetary policy in the euro area, 2011). According to the prevailing empirical evidence the unconventional monetary policy is believed to had a significant and positive impact on output and employment.

What do we know: Fiscal policy

  • G, T, Y or G, Y, P, i, T; various identification schemes.

  • Impulse response G => Y and T => Y give multipliers.

  • What do we know about the effects of fiscal policy? The dispersion of estimated multipliers broad, spendings multiplier often above 1, tax multiplier tend to be negative but rather insignificant.

  • However, structural models report much lower spendings multipliers and significant negative response of output to increase in taxes.

  • Causes of disagreement: Structural models are based on life time optimization of consumption, however liquidity constraints and uncertainty make optimization less feasible and consumption is to some extent determined by current income of households.

  • Other causes of dispersion of the estimates: Large differences across countries and across different instruments of fiscal policy.

  • Growing evidence that phases of business cycle affect multipliers (higher multipliers in recessions) and that fiscal multipliers have been significantly underestimated before the Great Recession. Current consensus on spendings 0.9-1.7.

Summary

  • VARs: system of equations, dependent variable regressed on past values of itself and of dependent variables in other equations.

  • Structural vs. reduced form

  • Impulse response functions: quantitative and qualitative predictions (more important than coefficients)

  • Suitable for forecasting

  • Monetary policy: increase in interest rate restrictive, strongest effect after 6 to 8 quarters, however using simple VARs price puzzle often occurs (temporary increase in inflation after rising interest rates)

  • Fiscal policy: wider disagreement. Fiscal multipliers from VAR models tend to exceed one, but not sharply. In recessions, fiscal policy has stronger effects.