16  Estimating Dynamic Multipliers

This section will cover the specifications commonly used to estimate dynamic causal effect. Just like in cross-sectional analysis, regression techniques can always be applied as long as the time series are covariance stationary without an emphasis on causality. However, we pay special attention to causal inferences, as we are more interested in understanding the causality rather than mere correlations in most empirical researches. We start with the case where the structural shock is directly observed and move on to the cases where the structural shocks need to be constructed.

16.1 Distributed Lags

The easiest approach to estimate dynamic causal effect is to include lags in the specification:

\[ y_t = \beta_0\epsilon_t + \beta_1\epsilon_{t-1} + \cdots + \beta_p\epsilon_{t-p} + u_t, \]

where \(\epsilon_t\) is the structural shock, \(u_t\) is everything that otherwise influences \(y_t\). Since \(\epsilon_t\) happens randomly, we have \(\mathbb E(u_t |\epsilon_{t-j}) = 0\). Thus, the \(\beta\)s, which capture the dynamic causal effect, would be consistently estimated by OLS.

Note that we call it a specification, in a sense that the joint distribution of the random variables is unknown, which distinguishes itself from the DGP model in Chapter 6. But it does not stop us from uncovering the causal effect, as long as the exogenous condition holds.

The effect of a unit change in \(\epsilon\) on \(y\) after \(h\) periods, which is \(\beta_{h}\), is also called the \(h\)-period dynamic multiplier. Sometimes, we are interested in the accumulated effect over time, \(\beta_0+\beta_1+\cdots+\beta_h\), which is called cumulative dynamic multiplier.

Because \(u_t\) is the linear combination of all other current and past shocks, it is likely serially correlated. So HAC standard errors are required for robust inferences.

Proposition 16.1 Assumptions for a consistent estimation of dynamic causal effects with distributed lag models:

  1. \(\epsilon\) is an exogenous shock, \(\mathbb E(u_t|\epsilon_t,\epsilon_{t-1},...)=0\);
  2. All variables are stationary;
  3. Regular conditions for OLS to work.

To reduce the serial correlations \(\{u_t\}\), and also allow for slow adjustment of \(y_t\), we can also include lagged dependent variables in the specification, which becomes an autoregressive distributed lag (ADL) specification:

\[ y_t = \phi_1 y_{t-1} + \cdots + \phi_p y_{t-p} + \beta_0\epsilon_t + \beta_1\epsilon_{t-1} + \cdots + \beta_p\epsilon_{t-p} + u_t, \]

or

\[ \phi(L) y_t = \beta(L) \epsilon_t + u_t. \]

When lags of the dependent variable are included as regressors, strict exogeneity fails for sure, because \(X=\{y_{t-1},\dots,\epsilon_t, \epsilon_{t-1},\dots\}\) is correlated with past errors \(u_{t-1}\), despite it is uncorrelated with the contemporary error \(u_t\). The OLS is consistent so long as \(\{u_t\}\) are not serially correlated. Otherwise, \(u_t\) would be correlated with \(X\) through \(u_{t-1}\). The serial correlation can be tested with Durbin-Watson test or Breusch-Godfrey test.

The dynamic causal effect is more convoluted with the ADL specification though,

\[ \hat\theta(L) = \hat\phi^{-1}(L) \hat\beta(L). \]

ADL also require truncated lags. \(p\) and \(q\) are chosen as an increasing function of the sample size. In general, choosing \(p\) and \(q\) to be of order \(T^{1/3}\) would be sufficient for consistency.

16.2 Local Projections

Dynamic causal effect can also be estimated by projecting future outcomes directly on the shock. Jordà (2005) named it local projections (LP).

\[ y_{t+h} = \theta_h \epsilon_t + u_{t+h}. \]

By assumption, \(\mathbb E(u_{t+h}|\epsilon_t)=0\). So \(\hat\theta_h\) is a consistent estimate of the \(h\)-period dynamic multiplier. HAC standard errors are also required in local projections, as \(u_{t+h}\) in are usually serially correlated.

Readers may wonder, since ADL and LP both give consistent estimates of the dynamic multipliers, what is the difference between them. There are two obvious differences:

  1. Lagged shocks do not appear in LP specifications as they do in distributed lag specifications.
  2. The LP method requires running separate regressions for each \(h\). The dynamic response \(\{\theta_0,\theta_1,\theta_2, \dots\}\) are estimated through multiple regressions rather than one.

The error structure is also different. To see this, suppose the DGP is an MA(\(\infty\)) process

\[ y_t = \epsilon_t + \theta_1\epsilon_{t-1} + \theta_2\epsilon_{t-2} +\cdots \]

If we estimate it with a DL specification with two lags,

\[ y_t = \beta_0\epsilon_t + \beta_1\epsilon_{t-1} + u_t, \]

where \(u_t = \sum_{j=2}^{\infty}\theta_j\epsilon_{t-j}\). Exogeneity would ensure \(\hat\beta_1 \to \theta_1\).

We can also estimate it with a local projection (suppose we are interested in the one-step-ahead dynamic multiplier):

\[ y_{t+1} = \psi_1\epsilon_t + u_{t+1}. \]

Again, we have consistency \(\hat\psi_1\to\theta_1\). But the error structure is different \(u_{t+1} = \epsilon_{t+1} + \sum_{j=2}^{\infty}\theta_j\epsilon_{t-j}\).

Both the DL and LP specifications may include additional control variables, which can reduce the variance of the residuals and improve the efficiency of the estimators.

16.3 Example of Observable Exogenous Shocks

Directly observable exogenous shocks are rare. Here we use an example from Stock and Watson’s textbook, which explores the dynamic causal effect of cold weather on orange juice prices. Cold weather is bad for orange production. Orange trees cannot withstand freezing temperatures that last for more than a few hours. Florida accounts for more than 98 percent of U.S. production of frozen concentrated orange juice. Therefore, the frozen weather in Florida would reduce the supply and orange juice and raise the price. The dataset includes the number of freezing degree days in Florida and the average producer price for orange juice. Cold weather is plausibly exogenous, which allows us the utilize the regression framework above to estimate the dynamic causal effect.

library(AER)
library(dynlm)
library(lmtest)

data("FrozenJuice") # load data

# compute percentage change on price
pchg = 100*diff(log(FrozenJuice[, 'price']))
sample = ts.union(fdd = FrozenJuice[,'fdd'], pchg)

# distributed lag model
mod = dynlm(pchg ~ L(fdd, 0:6), data = sample)

# compute Newey-West standard error
coeftest(mod, vcov. = NeweyWest)

t test of coefficients:

              Estimate Std. Error t value  Pr(>|t|)    
(Intercept)  -0.418188   0.227219 -1.8405 0.0661952 .  
L(fdd, 0:6)0  0.484907   0.135850  3.5694 0.0003865 ***
L(fdd, 0:6)1  0.139460   0.084986  1.6410 0.1013277    
L(fdd, 0:6)2  0.057297   0.057063  1.0041 0.3157410    
L(fdd, 0:6)3  0.068637   0.043709  1.5703 0.1168703    
L(fdd, 0:6)4  0.035142   0.028405  1.2372 0.2165036    
L(fdd, 0:6)5  0.048680   0.028938  1.6822 0.0930485 .  
L(fdd, 0:6)6  0.040545   0.045168  0.8976 0.3697343    
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# To plot the dynamic multiplier, the following code creates 
# a custom function that manually plots the coefficients and 
# the confidence intervals
plotDM <- function(mod, 
                   horizon = 0:5, 
                   vcov = "NeweyWest", 
                   col = "red") {
  
  # only Newey-West standard error is supported
  if (vcov == "NeweyWest") {
    ci = coefci(mod, vcov. = sandwich::NeweyWest)
  } 
  
  # extract coefficients of the lagged regressors
  plot(horizon, mod$coefficients[-1], type = "l", 
       col = col, ylim = c(min(ci[-1,]), max(ci[-1,])), 
       xlab = "Lags", ylab = "Dynamic Multiplier")
  
  # horizontal zero
  abline(h = 0, col = "gray")
  
  # confidence intervals
  lines(horizon, ci[-1,1], lty = 2, col = col)
  lines(horizon, ci[-1,2], lty = 2, col = col)
}

plotDM(mod, horizon = 0:6)

We can also use local projections. Note that local projections require estimating multiple regressions. The coefficients from each of the regressions constitute the dynamic multiplier.

# apply local projection for horizons 0-6
lps = sapply(0:6, function(h) {
  
  # regress future price change on fdd
  lp = dynlm(L(pchg, -h) ~ fdd, data = sample)
  
  # Newey-West confidence interval
  ci = coefci(lp, vcov. = NeweyWest)
  
  # extract coefficients and CIs
  c(lp$coefficients[-1], ci[-1,]) # remove intercept
}) |> t() # transpose it

# plot the LP coefficients
{
  plot(0:6, lps[,'fdd'], type = "l", col = 2, ylim = c(-0.05,0.75), ann = F)
  abline(h = 0, col = "gray")
  lines(0:6, lps[,'2.5 %'], lty = 2, col = 2)
  lines(0:6, lps[,'97.5 %'], lty = 2, col = 2)
}

16.4 Example of Constructed Structural Shocks

Most structural shocks in economics are not directly observed, such as monetary policy shocks, or fiscal policy shocks, yet they are of profound interest of researchers. As we have explained before, regressing output or inflation on interest rate does not give a plausible estimation of the causal effect of monetary policy, due to the endogeneity problem. Thus, we need to isolate the exogenous part of the monetary policy from observed variables. The method to achieve this is an active research field in itself.

We may utilize the high-frequency price changes of fed fund futures around the window of monetary policy announcement to approximate the monetary policy shock. The rationale of this construction is that, the price of the financial instrument reflects the expected interest rate by market participants based on the economic conditions. Therefore, the sudden change of the price in the tiny window of monetary policy announcement captures the unexpected part of the monetary policy.

# load US monthly data
data = read.csv("data/usmd.csv") 

# convert to time series
ffr = ts(data[, 'FEDFUNDS'], start = c(1990,1), frequency = 12)
mps = ts(data[, 'MPS'], start = c(1990,1), frequency = 12)

# interest rate changes and MP shocs are different
plot(cbind(ffr, mps), main = "Monetary Policy Shocks")

We estimate the dynamic causal effect of monetary policy shocks on stock market returns. We employ the simplest regression specification. Note that there is quite a difference when using changes in the FF rate directly versus using identified monetary policy shocks. In the regression using the FF rate, the coefficient is not statistically significant. One might tempt one to conclude that monetary policy has no impact on stock market returns based this result. However, this conclusion is misleading because common factors, such as overall economic conditions, influence both stock market returns and the FF rate. In our second experiment—where we regress stock market returns on the identified monetary policy shocks—we observe a much larger coefficient and a significant negative impact, especially in the month immediately following the shock.

# monthly S&P 500 returns
ret = data[, 'SP500'] |> 
  ts(start = c(1990,1), frequency = 12) |> 
  log() |> 
  diff()

# regression on FF rate changes
mod_1 = dynlm(ret ~ L(d(ffr), 0:6)) 

# plot dynamic multiplier
plotDM(mod_1, horizon = 0:6)

# regression with MP shocks
mod_2 = dynlm(ret ~ L(mps, 0:6)) 

# plot dynamic multiplier
plotDM(mod_2, horizon = 0:6, col = "blue")