Module 9: Granger Causality in Dynamic Regression

Econ 6376 — Applied Time Series Econometrics

How to Use These Notes

The main text is Core: the concepts, interpretations, and applied skills expected of everyone. Deeper Dive develops an idea further; Technical Note supplies formal qualifications; Looking Ahead prepares a later module. Those three optional layers are not required for credit. Read the Core, predict the results before running the R examples, and work through the Core Practice questions. The optional material can wait until you have a question it helps answer.

This module uses the ARDL regression you already know. We will work with one outcome equation at a time. Testing the reverse direction requires a second regression, not a new system of matrix notation. Cointegration and error correction receive only a short preview; Module 10 develops them through the same ARDL framework.

Before running the examples

Run the code in chapter order in a fresh R session. You need the packages ggplot2, knitr, and urca, plus the course files listed below. The HTML itself can be read offline; executing the examples also requires these local data and helper files.

course folder/
  data/UNRATE.csv
  data/ICSA.csv
  helpers/granger_utils.R
  notes/module_09_notes.qmd

Set R’s working directory to the course folder containing data, helpers, and notes (check it with getwd()). The setup also works from its notes subfolder, as when Quarto renders this file. If neither location contains the expected folders, correct the working directory before proceeding.

library(ggplot2)
theme_set(theme_bw())
repo_dir <- if (dir.exists("helpers")) "." else ".."
data_dir <- file.path(repo_dir, "data")
source(file.path(repo_dir, "helpers", "granger_utils.R"))
stopifnot(dir.exists(data_dir))

Core Learning Objectives

By the end of this module, you should be able to:

  1. Explain Granger causality as incremental, directional, conditional predictive information.
  2. Distinguish that information from an intervention effect, contemporaneous (instantaneous) dependence, and a claim that variables are unrelated, and explain how data timing can change the answer.
  3. Recognize how the idea has been used in economics and in the analysis of brain signals.
  4. Write a joint lag-exclusion null, fit restricted and unrestricted ARDL regressions on the same observations, and calculate their F statistic.
  5. Test both directions separately, inspect specification diagnostics, and explain why lag choices and conditioning information matter.
  6. Distinguish a restriction-test result from useful held-out forecast performance, and write a conclusion that respects the evidence.
  7. Recognize why integrated levels and possible cointegration require more analysis before applying routine stationary-regression inference.

9.1 From ARDL Models to a Predictive Question — Core

What did the added predictor buy us?

Module 8 asked whether initial unemployment-insurance claims could help predict changes in unemployment. The question was economic before it was statistical: might the arrival of new benefit claims reveal deteriorating labor-market conditions before those conditions are fully reflected in the unemployment rate?

Recall the simplest lag-only ARDL:

yt=α+ϕ1yt−1+β1xt−1+ϵt.y_t=\alpha+\phi_1y_{t-1}+\beta_1x_{t-1}+\epsilon_t.

Here yty_t is the outcome, its own lag captures persistence, and xt−1x_{t-1} supplies another piece of past information. The parameters describe the data-generating process; estimates carry hats and fitted residuals are ete_t. We begin with stationary variables and a conditional-mean equation whose disturbance contains no remaining predictable mean from the histories being modeled.

Now remove xt−1x_{t-1}. Does the forecast lose something, or did the history of yy already contain the useful information? That is the organizing question of this chapter. A large correlation between xx and yy does not settle it. Two series can move together because each is persistent, or because they respond to the same news. We need a comparison that holds the existing information fixed.

This guy again!

Clive Granger has already appeared in our discussion of spurious regression and forecast combinations. His name now appears in Granger causality: an approach to asking whether one time series adds information for predicting another. The name is memorable; its interpretation needs care. It does not give an automatic answer to what would happen if a policymaker changed xx.

Before reading on, distinguish these questions:

Question What would an answer tell us?
Do xx and yy move together? Association.
Does the past of xx improve prediction of yy beyond the history already used? Additional predictive information.
Would intervening on xx change yy? A causal intervention effect, under an appropriate identification argument.

We are learning how to investigate the middle question and how to keep it from silently becoming the last one.

9.2 What Granger Causality Means — Core

The past of xx Granger-causes yy if it contains information useful for predicting yy beyond the past of yy and the other information specified in the comparison. Our main examples concern the next observation and prediction of its mean.

Three words do much of the work:

  • Incremental: compare a forecast with the history of xx to a forecast without it. A predictor is not useful merely because it is correlated with the outcome.
  • Directional: xx helping predict yy and yy helping predict xx are different questions. Both may be true, one may be true, or neither may be true.
  • Conditional: state what else is known. A signal can be useful when another variable is missing and redundant once that variable is available.

For the one-lag equation, β1=0\beta_1=0 says that xt−1x_{t-1} contributes no additional linear predictive term after controlling for yt−1y_{t-1}. A nonzero β1\beta_1 changes the population forecast, provided the stated conditional-mean model is correct and the regressor contains variation not already duplicated by the other regressors. This is a statement about the model and population, not a guarantee that a particular sample will reveal it.

The definition and the test are not identical objects

Real histories can be long and their predictive relationships nonlinear. Our practical test uses a finite linear lag model. Its conclusion should therefore name the lags and conditioning variables used. Failure to find useful linear lag terms does not establish that every conceivable nonlinear forecast, every horizon, or the entire conditional distribution is unaffected by xx.

There is another distinction. In a population, additional information cannot make the best attainable forecast worse under the same loss. In a sample, we must estimate the coefficients. A larger estimated model can forecast worse because its extra coefficients are noisy. This is why a restriction test and a held-out forecast comparison provide related but different evidence.

Let ℐt−1−x\mathcal I_{t-1}^{-x} be the baseline history and let ℐt−1\mathcal I_{t-1} add past xx. One-step mean noncausality is

E(yt∣ℐt−1)=E(yt∣ℐt−1−x).E(y_t\mid\mathcal I_{t-1})=E(y_t\mid\mathcal I_{t-1}^{-x}).

Under squared-error loss, the conditional mean is the optimal forecast. If these conditional means differ on events with positive probability and have finite second moments, the richer information permits a strictly smaller population mean squared prediction error. Equality of the means is weaker than equality of the entire conditional distributions. Lag-coefficient restrictions represent mean noncausality only under an adequate linear conditional-mean specification; otherwise they describe a narrower linear prediction comparison. We do not develop distributional or multi-horizon noncausality in this module.

9.3 What It Does Not Establish — Core

Hamilton’s conclusion is the thesis of this module: these procedures are better described as tests of whether one series helps forecast another than as tests of whether one causes the other, and they bear on the causal question only when combined with further assumptions (pp. 307–308). His oil-price example shows that second point at work. If the major oil-price shocks were caused by events outside the U.S. economy, then no macroeconomic series should Granger-cause oil prices, and few do. The predictive test supports a causal reading there only because it is combined with that stated assumption.

An early signal need not be a lever

Suppose a deterioration in labor demand produces new unemployment-insurance claims and later appears in unemployment. Claims can be an informative signal even if changing the number written in the claims database would do nothing to employment. A good forecast variable and a useful policy lever are different objects.

The same issue arises with an omitted common driver. If zz affects an early signal xx and a later outcome yy, past xx may genuinely help forecast yy. The Granger finding need not be statistically mistaken. The mistaken step is to declare that the signal itself directly changes the outcome. Section 9.7 builds this distinction into a simulation whose mechanism we know.

Forward-looking behavior can reverse the apparent story

Hamilton’s stock-price/dividend example (pp. 306–307) is particularly useful in economics. In his present-value model, the stock price is determined by investors’ expectations of future dividends, and the market’s valuation has no effect on the dividend process. Yet in the price and dividend levels, past stock prices help predict dividends, while past dividends do not help predict prices. The price already contains what investors know about future dividends. The Granger direction runs opposite to the structural one: expected dividends determine prices, but the predictive evidence points from prices to dividends. Expectations are a reason to take this distinction seriously, not an obscure exception.

Within-period effects are a different question

Consider independent-over-time xtx_t and an outcome yt=β0xt+ϵty_t=\beta_0x_t+\epsilon_t, with independent disturbances. In a structural interpretation of this deliberately simple DGP, changing current xtx_t changes current yty_t. But yesterday’s independent xx provides no information about today’s xx or yy. A past-only Granger test can miss a contemporaneous causal effect because it asks a different question.

Conversely, common current shocks can make two variables move together without either one’s lags adding predictive content.

Adding a same-period term to the working ARDL separates the two channels in one data-generating process:

yt=α+∑j=1pϕjyt−j+β0xt⏟same period+∑ℓ=1qβℓxt−ℓ⏟past x: the Granger question+ϵt.y_t=\alpha+\sum_{j=1}^{p}\phi_j\,y_{t-j} +\underbrace{\beta_0x_t}_{\text{same period}} +\underbrace{\sum_{\ell=1}^{q}\beta_\ell\,x_{t-\ell}}_{\text{past }x\text{: the Granger question}}+\epsilon_t.

The term β0xt\beta_0x_t (ℓ=0\ell=0) is the contemporaneous channel. The Granger null concerns only β1,…,βq\beta_1,\ldots,\beta_q. Our past-only comparison does not test β0\beta_0: the tested block starts at xt−1x_{t-1}, and current xtx_t appears in neither regression. A same-period link between xx and yy is called instantaneous causality, Granger’s (1969) term. Software such as vars::causality reports a test of it alongside the Granger test. It concerns same-period dependence, for example correlation between the current innovations in the two series’ equations. That correlation is symmetric, so by itself it does not reveal which variable moved first within the period.

Data timing shapes the answer

Granger conclusions are statements about observations as they are dated and published, not about the underlying events directly. Three features of the data matter.

  • Sampling frequency and temporal aggregation. Sampling monthly rather than daily, or averaging weekly values into a monthly number, can place several within-month responses in the same observation. A response that takes a week then looks instantaneous. Aggregation can also create apparent lagged predictive content that the underlying process lacks, or remove content that it has.
  • Seasonal adjustment. Adjustment filters change the time-series properties of each series. When each series is adjusted separately, the filters can distort the lag relation between them.
  • Release timing. The observation label is not the publication date. What is actually in the information set at a forecast origin depends on when each series is released, and on whether historical values have been revised since.

Always state the frequency, the aggregation, the adjustment, and the timing of the information used.

Granger (1969) already noted that apparent instantaneous causality “often arises due to slowness in recording information or because a sufficiently wide class of possible causal variables has not been used.” Both causes are about the data and the conditioning set, not necessarily about a within-period mechanism.

Seasonal adjustment was an early concern. Sims (1974) and Wallis (1974) study how seasonal noise and seasonal-adjustment filters, particularly when applied separately to each series, can distort estimated lag relations between variables. Many official adjustment procedures are two-sided in historical data: a revised adjusted value for month tt can depend on observations after tt. That matters for a past-only comparison.

Temporal aggregation is a second source. Marcellino (1999) studies how aggregation over time changes the properties of time-series models, including Granger causality. Breitung and Swanson (2002) show how temporal aggregation can produce spurious instantaneous causality in multiple time-series models. The general lesson is that a finding at one frequency need not hold at another, and that a test at the observed frequency cannot by itself recover the timing of the underlying events.

Read both rejection and nonrejection carefully

Finding Defensible reading Overstatement to avoid
Reject zero coefficients on the specified xx lags Evidence against those linear exclusion restrictions, conditional on an adequate model and valid inference. “Changing xx will change yy.”
Do not reject These data and this specification do not provide sufficient evidence against the restrictions. “There is no relationship.”
Larger estimated model forecasts better in a held-out period Better realized prediction under the stated sample, timing, and loss. “The mechanism has been identified.”
Both directions show predictive evidence Predictive feedback under the stated histories. “We have identified both structural effects.”

Short samples, weak signals, excessive lags, and the wrong functional form can reduce detection. A tiny p-value also says little by itself about the size of a practical forecasting gain. Recall Module 8: neither the placement of a variable on the right-hand side nor white-looking residuals establishes the assumptions needed for an intervention interpretation.

9.4 Economics and Beyond — Core

Money and income

The concept was proposed by Granger (1969) and popularized by Sims (1972) (Hamilton, p. 302). Sims asked whether money helped predict income and whether the predictive direction ran the other way. This mattered for debates about money, economic activity, and policy feedback. The extra-information question was testable even when the structural interpretation remained contested.

Enders (p. 307) discusses Friedman and Kuttner’s (1992) evidence. They estimated three-variable models of nominal income, money, and government spending, so the conditioning set stayed the same throughout. What changed was the sample period. For 1960Q2–1979Q2, the F statistic for the null that the money base does not Granger-cause nominal income is 3.68, a rejection at the 1% level. For 1970Q3–1990Q4, it is only 0.82. The findings were robust to the other monetary measures: each monetary aggregate predicted nominal income at the 1% level in the earlier period, and none did in the later one. The predictive relationship changed with the period, under a fixed specification.

Results in this literature are also sensitive to the analyst’s choices. Hamilton (p. 305) observes that money–income Granger findings can change markedly with the number of lags included and with how the analyst handles possible nonstationarity, citing Christiano and Ljungqvist (1988) and Stock and Watson (1989). The instructive use of the method is to state which monetary series, which outcome, what other histories, which lags, and what period. A result is not a timeless property attached to two variable names.

Unemployment and prices

Does unemployment history add information about a subsequent price or inflation measure? This is one predictive version of a Phillips-curve question. It differs from asking what a policy-induced change in unemployment would do to prices. Cornwall, Mills, Sauley, and Weng use this setting to compare restriction-test evidence with held-out predictive evidence; we return to their paper in Section 9.9.

Economic studies of intervention effects need an identification argument beyond predictive direction. For example, Angrist and Kuersteiner (2011) distinguish Granger restrictions from effects of monetary-policy interventions. The predictive question remains useful, while the intervention question requires additional evidence.

Brain-region signals

The predictive question has spread beyond economics. With signals recorded from two brain regions, ask: does region A’s past signal help predict region B’s signal after accounting for B’s own history? The ARDL comparison is recognizable even though the variables have changed.

In functional magnetic resonance imaging (fMRI), the recorded blood-oxygen signal is an indirect, delayed measure of neural activity. Differences in that response across regions, slow sampling, and noise complicate the interpretation of an estimated predictive direction as neural influence. Wen, Rangarajan, and Ding (2013) study these complications and conditions under which comparisons remain informative. The lesson is familiar: understanding how observations are produced matters as much as pressing the test button.

9.5 Turn the Question into an ARDL Restriction — Core

The unrestricted and restricted regressions

For a stationary working model with several lags, write

yt=α+∑j=1pϕjyt−j+∑ℓ=1qβℓxt−ℓ+ϵt⏟Unrestricted model.\underbrace{y_t=\alpha+\sum_{j=1}^{p}\phi_jy_{t-j} +\sum_{\ell=1}^{q}\beta_\ell x_{t-\ell}+\epsilon_t}_{\text{Unrestricted model}}.

Here qq is the largest predictor lag, not the moving-average order used in earlier ARMA notation. The xx block starts at lag one, and current xtx_t appears in neither regression. Current xtx_t could enter in two other ways. Putting xtx_t in both regressions asks whether earlier xx adds information given current xx. Putting xtx_t inside the tested block makes the null a joint restriction on the instantaneous and lagged terms together. Neither is our past-only comparison.

The null and alternative are

H0:β1=⋯=βq=0,H1:at least one βℓ≠0.H_0:\beta_1=\cdots=\beta_q=0, \qquad H_1:\text{at least one }\beta_\ell\ne0.

In shorthand we write the null as H0:x↛yH_0: x\not\rightarrow y and the alternative as H1:x→yH_1: x\rightarrow y; the arrows stand for this joint restriction on the whole included lag block, conditional on the specified own lags, lag lengths, and other information.

Under the null, the restricted regression retains the intercept and the same pp outcome lags but removes the xx-lag block. Re-estimate all remaining coefficients. We are not setting the cross-lags to zero while freezing the unrestricted estimates of everything else.

How do you think we would do this? We already know a tool for comparing a regression with a nested version: a joint F-test. The new content is the time-series interpretation and the conditions needed to trust its reference distribution.

Hold the comparison still

Both regressions must use the same dependent observations, own-lag specification, deterministic terms, and retained controls. If one model loses twelve rows to lags and another loses only three, first restrict both to a common set of rows. Otherwise the RSS difference mixes a model change with a data change.

If other predictors are included, keep their specified histories in both models. This is a conditional Granger comparison. Adding a variable changes the information-set question; it is not automatically an improvement in the scientific design.

The null is about the whole block. An insignificant coefficient on xt−2x_{t-2} does not establish that all three included xx lags are unhelpful. Nor is this the null β1+β2+β3=0\beta_1+\beta_2+\beta_3=0: positive and negative lag effects can sum to zero while still changing next-period predictions.

9.6 Calculate and Interpret the Test — Core

Let RSSRRSS_R and RSSURSS_U be the sums of squared fitted residuals from the restricted and unrestricted regressions. Let nn count their common usable observations, and let kUk_U count all estimated unrestricted regression coefficients, including the intercept. For qq excluded coefficients,

F=(RSSR−RSSU)/qRSSU/(n−kU).F=\frac{(RSS_R-RSS_U)/q}{RSS_U/(n-k_U)}.

The numerator measures the reduction in RSS per added coefficient. The denominator estimates the unrestricted disturbance variance. On the same sample, the unrestricted model can reproduce the restricted fit by setting its extra coefficients to zero, so RSSU≤RSSRRSS_U\le RSS_R. A negative RSS reduction is a reason to check the models or data, not a surprising economic discovery.

Compare the statistic with an F(q,n−kU)F(q,n-k_U) reference distribution. With lagged dependent variables, that conventional reference is generally an approximation under maintained time-series assumptions, not an exact finite-sample law guaranteed by Gaussian shocks. An adequate stable conditional-mean model, sufficiently regular innovations, and appropriate variance assumptions matter. Diagnostics help expose some failures; passing them does not prove all the assumptions.

A small numerical example

Suppose n=120n=120, the unrestricted equation has an intercept, two own lags, and three xx lags, and its RSS is 90. The restricted RSS is 108. Then kU=6k_U=6, q=3q=3, and

F=(108−90)/390/(120−6)=7.6.F=\frac{(108-90)/3}{90/(120-6)}=7.6.

F_example <- ((108 - 90) / 3) / (90 / (120 - 6))
data.frame(F = F_example, numerator_df = 3, denominator_df = 114,
           p_value = pf(F_example, 3, 114, lower.tail = FALSE))
    F numerator_df denominator_df      p_value
1 7.6            3            114 0.0001118079

If the maintained regression conditions are adequate, this is evidence against excluding those three predictor lags. It is not a test of whether an intervention on xx changes yy.

In R, compare the actual fitted models

The following is the pattern we will use on simulated and real data. The data frame must already contain correctly dated lag columns and a common set of complete observations.

restricted <- lm(y ~ y_l1 + y_l2, data = common_data, na.action = na.fail)
unrestricted <- lm(y ~ y_l1 + y_l2 + x_l1 + x_l2 + x_l3,
                   data = common_data, na.action = na.fail)
anova(restricted, unrestricted, test = "F")

The table reports residual degrees of freedom, RSS, the restrictions added, and the test. The canonical helper granger_nested_test() in helpers/granger_utils.R also exposes the ingredients of the displayed formula and checks matching outcomes, rows, and nested design columns. It is used below to make compact comparison tables; the underlying calculation is the same.

The convenience function lmtest::grangertest(y ~ x, order = p, data = ...) fits a bivariate comparison using the same lag order for both histories. It is useful when that is the intended model. Our explicit regressions allow different own- and predictor-lag orders and additional conditioning variables. Do not silently substitute one specification for the other. See the R documentation.

Reverse the direction with another equation

To ask whether yy helps predict xx, make xtx_t the outcome, include its own lags, and test the added yy-lag block. This is a new regression and a new null. A rejection in the first equation does not answer the reverse question. Describe the resulting pattern as evidence in one direction, both directions, or neither detected, conditional on the specifications and inference being adequate.

The conventional RSS F-test uses a common disturbance-variance estimate. Conditional heteroskedasticity can require a different covariance estimator and a Wald test of the same coefficient restrictions. That changes inference, not the predictive question. Persistent residual correlation can also indicate missing conditional-mean dynamics; attaching a robust covariance estimate does not repair that omission or endogenous regressors. Hamilton §11.2 explains why the usual dynamic-regression reference is asymptotic. We do not derive robust Wald algebra or prove its limiting distribution here.

9.7 Simulate: Prediction and Interpretation — Core

Experiment A: a known one-way relationship

Consider the DGP

xt=0.55xt−1+ϵx,t,yt=0.4yt−1+0.6xt−1+ϵt,x_t=0.55x_{t-1}+\epsilon_{x,t},\qquad y_t=0.4y_{t-1}+0.6x_{t-1}+\epsilon_t,

with mutually independent, independent-over-time standard normal innovations. The second equation contains lagged xx; the first contains no lagged yy. Both autoregressive coefficients are inside one in magnitude. The for-loop makes the timing visible.

Predict before running: which direction has additional population predictive content? Would every finite sample necessarily produce one rejection and one nonrejection?

set.seed(6376091)
n <- 600
burn <- 200
total <- n + burn + 1L
epsilon_x <- rnorm(total)
epsilon <- rnorm(total)
x <- y <- numeric(total)
for (t in 2:total) {
  x[t] <- 0.55 * x[t - 1] + epsilon_x[t]
  y[t] <- 0.4 * y[t - 1] + 0.6 * x[t - 1] + epsilon[t]
}
keep <- (burn + 2L):total
sim <- data.frame(t = seq_len(n), y = y[keep], x = x[keep],
                  y_l1 = y[keep - 1L], x_l1 = x[keep - 1L])
sim_y_r <- lm(y ~ y_l1, data = sim)
sim_y_u <- lm(y ~ y_l1 + x_l1, data = sim)
sim_x_r <- lm(x ~ x_l1, data = sim)
sim_x_u <- lm(x ~ x_l1 + y_l1, data = sim)
sim_results <- rbind(
  cbind(Direction = "x history -> y", granger_nested_test(sim_y_r, sim_y_u)),
  cbind(Direction = "y history -> x", granger_nested_test(sim_x_r, sim_x_u)))
knitr::kable(transform(sim_results[, c("Direction", "n", "q", "F", "p_value")],
  p_value = format.pval(p_value, digits = 3, eps = 1e-6)), digits = 3)
Direction n q F p_value
x history -> y 600 1 259.355 <1e-06
y history -> x 600 1 1.064 0.303
anova(sim_y_r, sim_y_u, test = "F")
Analysis of Variance Table

Model 1: y ~ y_l1
Model 2: y ~ y_l1 + x_l1
  Res.Df    RSS Df Sum of Sq      F    Pr(>F)    
1    598 853.87                                  
2    597 595.27  1     258.6 259.35 < 2.2e-16 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

The simulation has x→yx\rightarrow y predictive content by construction. Its sample results are evidence generated by a known mechanism; the p-values are not definitions of that mechanism. In repeated samples we would still see sampling variation, occasional false rejections under a null, and missed detection under weak alternatives.

The unrestricted estimate of the cross-lag coefficient is 0.6, compared with the DGP value 0.6. Look at the residuals as well as the coefficient:

sim_residuals <- data.frame(t = sim$t, e = residuals(sim_y_u))
ggplot(sim_residuals, aes(t, e)) + geom_line(colour = "#315375") +
  labs(x = "Observation", y = "Fitted residual",
       title = "Known one-way DGP: residuals from the unrestricted outcome equation")

Line plot of fitted residuals from the known one-way simulation, indexed by observation.

Modify and reconcile: keep the seed and innovations fixed, replace 0.6 by zero, regenerate yy, and re-estimate. The null is now true in both directions. A sample p-value below 0.05 would be a false rejection under the chosen rule, not proof that the code secretly created an effect. Next shorten the retained sample and explain why weaker evidence does not necessarily mean a weaker DGP coefficient.

Experiment B: break the intervention interpretation

Let an unobserved piece of news ztz_t arrive independently each period. The observed signal xtx_t is noisy news; yty_t responds to yesterday’s news:

xt=zt+ηt,yt=0.4yt−1+0.8zt−1+ϵt.x_t=z_t+\eta_t,\qquad y_t=0.4y_{t-1}+0.8z_{t-1}+\epsilon_t.

All three disturbances ztz_t, ηt\eta_t, and ϵt\epsilon_t are mutually independent standard normal draws over time. There is no xx term in the structural equation for yy. Yet yesterday’s noisy signal tells us something about yesterday’s news, which matters for today’s outcome.

Predict before running: will xt−1x_{t-1} help in a regression that omits zt−1z_{t-1}? What should change once zt−1z_{t-1} is observed and included?

set.seed(6376092)
z <- rnorm(total)
eta <- rnorm(total)
epsilon <- rnorm(total)
x <- z + eta
y <- numeric(total)
for (t in 2:total) {
  y[t] <- 0.4 * y[t - 1] + 0.8 * z[t - 1] + epsilon[t]
}
driver <- data.frame(y = y[keep], y_l1 = y[keep - 1L],
                     x_l1 = x[keep - 1L], z_l1 = z[keep - 1L])
pair_r <- lm(y ~ y_l1, data = driver)
pair_u <- lm(y ~ y_l1 + x_l1, data = driver)
cond_r <- lm(y ~ y_l1 + z_l1, data = driver)
cond_u <- lm(y ~ y_l1 + z_l1 + x_l1, data = driver)
driver_results <- rbind(
  cbind(Information = "Own history only", granger_nested_test(pair_r, pair_u)),
  cbind(Information = "Own history plus z", granger_nested_test(cond_r, cond_u)))
knitr::kable(transform(driver_results[, c("Information", "n", "q", "F", "p_value")],
  p_value = format.pval(p_value, digits = 3, eps = 1e-6)), digits = 3)
Information n q F p_value
Own history only 600 1 100.286 <1e-06
Own history plus z 600 1 5.875 0.0157

The first comparison asks whether the signal helps when news is unavailable. It does in the population: the noisy signal reveals part of the news that matters for the outcome. The second comparison asks whether the noisy signal helps after the actual news has been observed. Its population cross-lag coefficient is zero. The two comparisons answer different questions.

In this particular simulated sample, the second test reports a p-value of 0.01565781 and rejects at 5%, even though its null is true by construction. This is a false rejection in this sample: a test decision can be wrong. Adding the actual driver removes xx’s additional predictive content in the population, but it does not guarantee a sample nonrejection. We keep the draw so that the distinction between a population relationship and a test decision remains visible.

Do not call the first predictive finding a false positive merely because xx does not directly cause yy. Now impose a change on recorded xx, holding zz, the outcome’s initial state, and its disturbances fixed. The structural equation for yy has not changed, so its path does not change. In observational data, xx is informative; in this specified intervention, it is not a driver.

The news is independent over time by design. Yesterday’s xx is a noisy measurement of the one news realization that enters today’s yy. Under the stated Gaussian draws, E(zt−1∣xt−1)=xt−1/2E(z_{t-1}\mid x_{t-1})=x_{t-1}/2, so the bivariate conditional mean contains 0.4xt−10.4x_{t-1}. Conditioning on zt−1z_{t-1} removes that incremental term.

Persistent hidden states can induce more complicated, potentially infinite-lag predictive dynamics. Then a short ARDL could mix the interpretation problem with a misspecified forecasting model. This experiment isolates the interpretation lesson rather than claiming that any hidden-driver DGP makes the conventional finite-lag F-test valid.

9.8 Application: Claims and Unemployment — Core

Define the economic objects and information timing

Let UtU_t be the monthly U.S. unemployment rate in percent. Let CtC_t be the mean of the weekly initial-claims observations whose week-ending Saturdays fall in month tt. Both published series are seasonally adjusted. We retain Module 8’s variables:

yt=ΔUt,xt=100ΔlogCt.y_t=\Delta U_t,\qquad x_t=100\Delta\log C_t.

Thus yy is measured in unemployment percentage points; xx is approximately a percentage change in the monthly mean of weekly claims. This average is not a monthly total. The two series measure related but different labor-market populations and events. See UNRATE and ICSA for the source definitions.

Our forecast origin waits until both previous-month measures have been released, before the target month’s unemployment release. We use completed previous months and deliberately ignore partial target-month claims. The prediction is one step ahead in the monthly index and usually a nowcast of the current calendar month, not a forecast made at the preceding month’s end. Denote the information actually allowed by this convention by ℐtrelease\mathcal I_t^{\mathrm{release}}.

The calendar behind the two series is less tidy than the monthly index suggests. The unemployment rate for month tt refers to the Current Population Survey reference week, the week containing the 12th, and is released early in month t+1t+1. Weekly initial claims are released each Thursday for the week ending the previous Saturday. Three consequences follow.

  • CtC_t averages weeks both before and after month tt’s reference week. Since yty_t is the change between the reference weeks of months t−1t-1 and tt, the later weeks inside Ct−1C_{t-1} fall within the period that yty_t measures. The monthly “lag” xt−1x_{t-1} is therefore not a clean calendar lead.
  • Each series is seasonally adjusted separately, by a different agency (BLS for unemployment, the Department of Labor for claims), and the historical adjusted values have been revised using later data.
  • By the time UtU_t is released, the claims covering month tt’s reference week have been public for about two weeks. Our past-only design deliberately excludes that timely information, which a practitioner would use. The forecast comparison below therefore understates the practical nowcasting value of claims. Using current-month claims would be the contemporaneous question from Section 9.3, not the past-only comparison taught here.

These are revised historical caches, collected at different dates. The exercise is a revised-data pseudo-out-of-sample evaluation, not a reconstruction of real-time data vintages. The observation label is not the publication date. A real deployment would need actual release calendars and vintage data.

Load and check the cached observations

All code below runs offline from the course’s data/ folder. The weekly calendar is checked before averaging; missing weeks must not be silently discarded.

u <- read.csv(file.path(data_dir, "UNRATE.csv"))
c_week <- read.csv(file.path(data_dir, "ICSA.csv"))
u$observation_date <- as.Date(u$observation_date)
c_week$observation_date <- as.Date(c_week$observation_date)
u <- u[u$observation_date >= as.Date("1988-12-01") &
         u$observation_date <= as.Date("2019-12-01"), ]
c_week <- c_week[order(c_week$observation_date), ]
stopifnot(!anyNA(u), !anyNA(c_week), all(c_week$ICSA > 0),
  identical(u$observation_date,
            seq(as.Date("1988-12-01"), as.Date("2019-12-01"), by = "month")),
  identical(c_week$observation_date,
            seq(as.Date("1989-01-07"), as.Date("2019-12-28"), by = "week")),
  all(as.POSIXlt(c_week$observation_date)$wday == 6))
u$y <- c(NA_real_, diff(u$UNRATE))
u$U_previous <- c(NA_real_, head(u$UNRATE, -1L))
u <- u[u$observation_date >= as.Date("1989-01-01"), ]
c_week$month <- as.Date(format(c_week$observation_date, "%Y-%m-01"))
stopifnot(all(table(c_week$month) %in% c(4L, 5L)))
c_month <- aggregate(ICSA ~ month, data = c_week, FUN = mean)
app <- merge(u, c_month, by.x = "observation_date", by.y = "month", all = TRUE)
names(app)[match(c("observation_date", "UNRATE", "ICSA"), names(app))] <-
  c("date", "U", "C")
stopifnot(nrow(app) == 372L, !anyNA(app))
app$x <- c(NA_real_, 100 * diff(log(app$C)))
for (j in 1:6) {
  app[[paste0("y_l", j)]] <- c(rep(NA_real_, j), head(app$y, -j))
  app[[paste0("x_l", j)]] <- c(rep(NA_real_, j), head(app$x, -j))
}
app <- app[app$date >= as.Date("1990-01-01"), ]
stopifnot(nrow(app) == 360L, !anyNA(app))
train <- app[app$date <= as.Date("2017-12-01"), ]
test <- app[app$date >= as.Date("2018-01-01"), ]
stopifnot(nrow(train) == 336L, nrow(test) == 24L)

The estimation period is January 1990–December 2017; January 2018–December 2019 is reserved for evaluating predictions. Earlier observations supply differences and lags. Restricting the exercise to this period avoids turning the pandemic into a model-selection opportunity, but it also limits what the results tell us about later periods.

Inspect the series before interpreting a test

paths <- rbind(
  data.frame(date = train$date, value = train$y,
             Series = "Unemployment change (percentage points)"),
  data.frame(date = train$date, value = train$x,
             Series = "Claims: 100 x log change"))
ggplot(paths, aes(date, value)) + geom_line(colour = "#315375") +
  facet_wrap(~ Series, ncol = 1, scales = "free_y") +
  labs(x = NULL, y = NULL, title = "Transformed training data, 1990-2017")

Two training-sample time-series panels: unemployment changes in percentage points and 100 times log changes in the monthly mean of weekly claims, from 1990 to 2017.

The transformations are a stationary working specification, not a declaration that each original level series is necessarily I(1)I(1) in every sample. Reuse Module 2’s evidence-building approach. ADF has a unit-root null; KPSS has a level-stationarity null. The ADF below includes an intercept and chooses its augmentation lag by BIC within a twelve-lag cap. That choice does not choose the ARDL’s lag orders.

stationarity <- data.frame()
for (variable in c("y", "x")) {
  adf <- urca::ur.df(train[[variable]], type = "drift", lags = 12, selectlags = "BIC")
  kpss <- urca::ur.kpss(train[[variable]], type = "mu", lags = "short")
  stationarity <- rbind(stationarity, data.frame(
    Variable = variable, ADF = as.numeric(adf@teststat[1, "tau2"]),
    ADF_5pct = as.numeric(adf@cval["tau2", "5pct"]),
    KPSS = as.numeric(kpss@teststat), KPSS_5pct = as.numeric(kpss@cval[1, "5pct"])))
}
knitr::kable(stationarity, digits = 4)
Variable ADF ADF_5pct KPSS KPSS_5pct
y -3.6919 -2.87 0.2535 0.463
x -12.7947 -2.87 0.1263 0.463

An ADF statistic more negative than its critical value rejects its null; a KPSS statistic above its critical value rejects its null. Read those decisions together with the paths, persistence, economic context, and possible breaks. They do not prove a time-invariant DGP or repair subsequent regression misspecification.

Fix the comparison, then diagnose it

Use six own lags and three predictor lags as the main teaching specification in each direction. For unemployment, this carries forward the specification reached in Module 8’s exploratory training work. It is not a fresh prespecified confirmatory test. The reverse equation uses the same compact lag lengths for comparability, not because equal lag lengths are an economic law.

Write the forward null: conditional on six lags of unemployment changes, the coefficients on the three included claims-growth lags are all zero. Write the reverse null by exchanging the two roles. The question concerns these finite lag blocks; it does not exhaust every possible history or nonlinear model.

y_r <- lm(reformulate(paste0("y_l", 1:6), response = "y"),
          data = train, na.action = na.fail)
y_u <- lm(reformulate(c(paste0("y_l", 1:6), paste0("x_l", 1:3)), response = "y"),
          data = train, na.action = na.fail)
x_r <- lm(reformulate(paste0("x_l", 1:6), response = "x"),
          data = train, na.action = na.fail)
x_u <- lm(reformulate(c(paste0("x_l", 1:6), paste0("y_l", 1:3)), response = "x"),
          data = train, na.action = na.fail)
y_test <- granger_nested_test(y_r, y_u)
x_test <- granger_nested_test(x_r, x_u)
y_bg <- granger_bg_test(y_u, order = 12)
x_bg <- granger_bg_test(x_u, order = 12)
main_results <- data.frame(
  Direction = c("Claims growth -> unemployment change", "Unemployment change -> claims growth"),
  n = c(y_test$n, x_test$n), Restrictions = c(y_test$q, x_test$q),
  F = c(y_test$F, x_test$F), Nominal_F_p = c(y_test$p_value, x_test$p_value),
  BG_12_p = c(y_bg$p_value, x_bg$p_value))
knitr::kable(transform(main_results,
  Nominal_F_p = format.pval(Nominal_F_p, digits = 3, eps = 1e-6),
  BG_12_p = format.pval(BG_12_p, digits = 3, eps = 1e-6)), digits = 3)
Direction n Restrictions F Nominal_F_p BG_12_p
Claims growth -> unemployment change 336 3 21.058 <1e-06 0.0031
Unemployment change -> claims growth 336 3 1.804 0.146 0.2549
anova(y_r, y_u, test = "F")
Analysis of Variance Table

Model 1: y ~ y_l1 + y_l2 + y_l3 + y_l4 + y_l5 + y_l6
Model 2: y ~ y_l1 + y_l2 + y_l3 + y_l4 + y_l5 + y_l6 + x_l1 + x_l2 + x_l3
  Res.Df    RSS Df Sum of Sq      F    Pr(>F)    
1    329 6.7185                                  
2    326 5.6279  3    1.0906 21.058 1.708e-12 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

The Breusch–Godfrey (BG) diagnostic asks whether residual lags through twelve help explain the fitted residual, after retaining the regression’s original regressors. Its null is no residual serial correlation through that order under its maintained conditions. The helper uses the auxiliary regression on the rows with all residual lags available; details are optional below.

In the forward equation, the nominal restriction-test p-value is 1.71e-12, while the BG p-value is 0.0031. In the reverse equation, the corresponding values are 0.146 and 0.255. At least one equation fails this residual-dynamics check at 5%. The displayed F calculations are therefore not a clean basis for a validated Granger-causality verdict. We report their nominal values to understand the mechanics, and retain the diagnostic failure as a substantive limitation.

residual_paths <- rbind(
  data.frame(date = train$date, e = residuals(y_u), Equation = "Unemployment-change outcome"),
  data.frame(date = train$date, e = residuals(x_u), Equation = "Claims-growth outcome"))
ggplot(residual_paths, aes(date, e)) + geom_line(colour = "#315375") +
  facet_wrap(~ Equation, ncol = 1, scales = "free_y") +
  labs(x = NULL, y = "Fitted residual", title = "Residual behavior is part of the evidence")

Separate panels of unrestricted-model fitted residuals over time for the unemployment-change and claims-growth outcome equations.

A limited sensitivity table, not a search for significance

Fix three specifications for this chapter: (p,q)=(3,1),(6,1),(6,3)(p,q)=(3,1),(6,1),(6,3), where pp is the outcome’s own-lag count and qq is the other variable’s lag count. All comparisons use the same 336 training observations. This illustrates what changes when the finite history changes; it does not turn the exercise into confirmatory inference. Do not select whichever row has a desired p-value.

menu <- data.frame(p = c(3, 6, 6), q = c(1, 1, 3))
sensitivity <- data.frame()
for (outcome in c("y", "x")) {
  predictor <- if (outcome == "y") "x" else "y"
  for (i in seq_len(nrow(menu))) {
    own <- paste0(outcome, "_l", seq_len(menu$p[i]))
    other <- paste0(predictor, "_l", seq_len(menu$q[i]))
    r <- lm(reformulate(own, response = outcome), data = train, na.action = na.fail)
    u_fit <- lm(reformulate(c(own, other), response = outcome), data = train, na.action = na.fail)
    result <- granger_nested_test(r, u_fit)
    diagnostic <- granger_bg_test(u_fit, order = 12)
    sensitivity <- rbind(sensitivity, data.frame(
      Outcome = outcome, p = menu$p[i], q = menu$q[i], n = result$n,
      F = result$F, Nominal_F_p = result$p_value, BG_12_p = diagnostic$p_value))
  }
}
knitr::kable(transform(sensitivity,
  Nominal_F_p = format.pval(Nominal_F_p, digits = 3, eps = 1e-6),
  BG_12_p = format.pval(BG_12_p, digits = 3, eps = 1e-6)), digits = 3)
Outcome p q n F Nominal_F_p BG_12_p
y 3 1 336 7.542 0.006356 <1e-06
y 6 1 336 11.080 0.000972 <1e-06
y 6 3 336 21.058 < 1e-06 0.0031
x 3 1 336 7.922 0.005177 0.1363
x 6 1 336 4.835 0.028578 0.2282
x 6 3 336 1.804 0.146263 0.2549

Read the table one direction at a time. In the forward equation, the nominal restriction test rejects at 5% in every row. The diagnostics tell a less comfortable story: the forward BG p-values are <1e-06 at (3,1), <1e-06 at (6,1), and 0.0031 at (6,3), so every forward specification fails the 5% residual-dynamics check, and the shorter ones fail it far more decisively. In the reverse equation, with unemployment changes predicting claims growth, the nominal p-values are 0.00518 at (3,1), 0.0286 at (6,1), and 0.146 at the main (6,3) specification: the test rejects at 5% at (3,1) and (6,1) but not at (6,3). Whether unemployment history appears to help predict claims therefore depends on the finite lag menu. The main-specification result should be reported as “not detected with these lags,” not as “unemployment changes carry no information about claims.”

This is the sensitivity Hamilton (p. 305) describes in the money–income literature, where Granger findings can change markedly with the number of lags and with the treatment of possible nonstationarity. Enders (p. 303) sets out the trade-off: too few lags leave the model misspecified, while too many spend degrees of freedom on coefficients that add little. The remedy is to choose lag lengths in advance, by a stated rule, comparing candidates on the same observations (Enders, p. 305). It is not to report whichever row gives the preferred p-value. Our main lag lengths were carried over from Module 8 for the forward equation and reused in the reverse equation for comparability, not chosen from this table; the table shows how much the conclusions lean on that choice.

Stop the illustration here. If residual dependence remains, revisit the economic specification and dynamics in a separate modeling exercise; do not keep trying lags until both the Granger test and diagnostic tell the preferred story. Heteroskedasticity and structural change are additional concerns. A broad search over samples, transformations, controls, and lag lengths changes what an eventual reported p-value means.

The auxiliary regression explains ete_t using the unrestricted regression’s original columns and et−1,…,et−12e_{t-1},\ldots,e_{t-12}. We drop the first twelve rows from all auxiliary columns. If its effective sample is nan_a and its coefficient of determination is Ra2R_a^2, the LM statistic is naRa2n_aR_a^2, compared with an asymptotic χ2(12)\chi^2(12) reference under the diagnostic’s conditions. This is not an exogeneity test. The canonical implementation is granger_bg_test() in the shared helper file. In particular, a post-selection diagnostic p-value is not an untouched confirmatory statement.

Compare forecasts separately

Use the same fixed six-own-lag restricted model and six-own/three-claims-lag unrestricted model for the unemployment outcome. Their coefficients are estimated through December 2017 and remain fixed. At each evaluation origin, newly observed previous-month values supply the lags. This is a sequence of one-step predictions, not a 24-step recursive forecast made in December 2017.

predictions <- data.frame(
  Own_history = as.numeric(predict(y_r, newdata = test)),
  Add_claims = as.numeric(predict(y_u, newdata = test)),
  No_change = rep(0, nrow(test)))
scores <- data.frame()
forecast_paths <- data.frame()
for (model in names(predictions)) {
  error <- test$y - predictions[[model]]
  level_prediction <- test$U_previous + predictions[[model]]
  stopifnot(isTRUE(all.equal(error, test$U - level_prediction)))
  scores <- rbind(scores, data.frame(Model = model, n = length(error),
    RMSE = sqrt(mean(error^2)), MAE = mean(abs(error))))
  forecast_paths <- rbind(forecast_paths,
    data.frame(date = test$date, U = level_prediction, Model = model))
}
knitr::kable(scores, digits = 4)
Model n RMSE MAE
Own_history 24 0.1129 0.0929
Add_claims 24 0.1057 0.0831
No_change 24 0.1099 0.0875
ggplot(forecast_paths, aes(date, U, colour = Model, linetype = Model)) +
  geom_line() + geom_line(data = test, aes(date, U), inherit.aes = FALSE,
                          linewidth = 0.9, colour = "black") +
  labs(x = NULL, y = "Unemployment rate (percent)",
       title = "One-step index predictions at post-release origins, 2018-2019",
       subtitle = "Black line: observed unemployment; coefficients fixed after training") +
  scale_x_date(breaks = as.Date(c("2018-01-01", "2018-07-01", "2019-01-01", "2019-07-01")),
               date_labels = "%b %Y") +
  theme(legend.position = "bottom")

Observed unemployment in black and three one-step prediction series from 2018 to 2019: own-history, added-claims, and no-change forecasts, using fixed training coefficients.

The level prediction is Ũt∣ℐtrelease=Ut−1+ỹt∣ℐtrelease\tilde U_{t\mid\mathcal I_t^{\mathrm{release}}}=U_{t-1}+\tilde y_{t\mid\mathcal I_t^{\mathrm{release}}}. Adding the same observed Ut−1U_{t-1} means the errors for the change and reconstructed level are identical. RMSE and MAE are therefore both in unemployment percentage points. A no-change level prediction corresponds to predicting yt=0y_t=0.

The added-claims model’s realized RMSE is lower than the own-history model’s over these 24 months. That is a descriptive comparison on a small, particular evaluation period. It does not repair the training diagnostics, establish an intervention effect, or ensure a future gain. The own-history baseline here holds p=6p=6 fixed for the nested comparison; it should not be confused with independently selecting an AR benchmark again.

Keep three conclusions separate:

Evidence What we can report
Nominal joint restriction tests The arithmetic results for the specified regressions, accompanied by the inference limitations.
Diagnostics and sensitivity Whether those regressions leave detectable dynamics, and how results change across the stated lag menu.
Held-out scores Realized prediction accuracy on 2018–2019 revised data at the stated origins.

We do not attach an ordinary Diebold–Mariano p-value to these nested estimated models. Forecast-comparison inference in that setting needs its own treatment. The honest conclusion of a worked application can be that a useful economic question remains unresolved by the first specifications.

9.9 Research Connection: Predictive Performance — Core

An in-sample test of a predictive idea

The F-test of Section 9.6 judges a predictive concept by in-sample fit. Why not test it out of sample? Ashley, Granger, and Schmalensee (1980) argued that credible Granger-causality testing “must rely primarily on the out-of-sample forecasting performance of models relating the original (non-prewhitened) series of interest” (as quoted in Cornwall et al.). There is a trade-off. In-sample tests can reward overfitting (Clark, 2004). A held-out evaluation period must be chosen in advance, and estimating on only part of the data costs power (Inoue and Kilian, 2005); that loss of power helps explain the continued popularity of the in-sample F-test.

Ashley and Tsang (2014) propose cross-sample validation. Split the sample at a date τ\tau. Estimate the restricted and unrestricted regressions on the observations up to τ\tau and predict the rest; then estimate on the later observations and predict the earlier ones. Every prediction uses coefficients estimated from data not used in making it, yet nearly all the data are used. The comparison is between the two models’ out-of-sample squared prediction errors, not their in-sample fits.

The paper by Cornwall, Mills, Sauley, and Weng (2019), Predictive Testing for Granger Causality via Posterior Simulation and Cross-Validation, extends that idea with cross-validation that holds out one block of observations at a time. Its motivation connects this module to Module 7: a model can pass an in-sample coefficient test yet deliver weak improvement for observations omitted from estimation. Publication and paper.

Its U.S. Phillips-curve application examines unemployment and price measures. Some in-sample rejections coexist with weak held-out predictive evidence. The empirical transformations matter: the posted manuscript analyzes differenced price measures, so its targets should not simply be relabeled as the usual annualized log inflation rate. This chapter discusses the comparison; it does not replicate the paper or convert its findings into a claim that a structural Phillips-curve mechanism is absent.

For an applied reader, the essential questions are: what was predicted, against which benchmark, on which observations, using what loss, and with what information? A disagreement between tests prompts those questions rather than a vote on whether a theory is “true.”

For a split τ\tau, Ashley and Tsang (2014) use the coefficients estimated on observations 1:τ1{:}\tau to predict τ+1:T\tau+1{:}T, and the coefficients estimated on τ+1:T\tau+1{:}T to “precast” 1:τ1{:}\tau. Summing the squared prediction errors over all TT periods gives an unrestricted and a restricted out-of-sample sum, RSSU(τ)RSS_U(\tau) and RSSR(τ)RSS_R(\tau). These replace the in-sample sums in the usual F formula to form a pseudo-F statistic.

Two features distinguish it from Section 9.6’s F. First, it is not F-distributed, and it can be negative: the restricted model can predict better out of sample, which is impossible for in-sample RSS on a common sample. Inference therefore uses the bootstrap, resampling the fitting errors, with a wild-bootstrap option when conditional heteroskedasticity is a concern; the bootstrap requires serially independent errors, so the unrestricted model needs enough lags. Second, any single τ\tau is arbitrary. Ashley and Tsang compute the pseudo-F at every feasible split and use a sample quantile of those values as the test statistic, recommending the third quartile (“CSV 75”). Their aim is “preserving most of the power of in-sample testing (by utilizing all of the sample data in the test), while also retaining most of the credibility of post-sample testing (by always basing model forecasts on data not utilized in estimating that particular model’s coefficients).” In their simulations the power lost relative to the in-sample F is manageable.

The paper uses posterior simulation to compare predictive performance under restricted and unrestricted models, including squared-error and absolute-error measures (RMSPE and MAE). Gibbs sampling yields the exact posterior predictive distribution of these measures at any sample size, avoiding the asymptotic or bootstrap approximations needed for the pseudo-F, and posterior odds compare the two models. Posterior odds are not frequentist p-values. In its Monte Carlo designs, the test’s power is close to the in-sample F-test and above the Ashley–Tsang statistic; those findings concern the designs studied.

In the posted November 18, 2018 manuscript, a held-out block and the following pp rows are removed so lagged held-out outcomes do not enter the training regressors. Estimation can still use observations before and after the block. This is not rolling-origin forecasting with only historically available training data. The manuscript’s kk denotes the held-out block size, not the conventional number of folds. The distinction helps separate held-out prediction under a model from operational forecasting. Full Bayesian machinery is outside the Core requirements.

9.10 Limits, Reporting, and Practice — Core

When the routine test is not enough

Our clean baseline is a stationary dynamic regression with an adequate conditional mean and appropriate inference. Integrated levels can give lag-exclusion statistics nonstandard reference distributions. A small p-value printed by routine software does not settle that problem. Equally, “difference everything” is not a universal remedy: two wandering levels may share a stationary long-run relationship whose adjustment contains predictive information.

Recognizing this issue is Core. Deriving the nonstandard distributions and choosing among specialized integrated-system procedures are not required here. Module 10 supplies the next piece: cointegration and error correction through the ARDL.

For stationary applications, still ask whether the lag range captures the relevant dynamics, whether the sample is long enough for the number of coefficients, whether parameters appear stable, and whether sampling frequency and release timing match the intended prediction. Good standard errors cannot substitute for a suitable economic question and model.

A reporting template

Write a short paragraph that fills in these items:

We modeled [transformed outcome and units] at [frequency] over [dates], using [own lags, predictor lags, and other information]. The null excluded [the complete specified lag block]. On [common usable sample size] observations, the joint statistic was [F and degrees of freedom], with nominal p-value [value]. [Diagnostics and specification choices] support or limit its interpretation. Thus the evidence [bounded predictive conclusion]. The separate evaluation over [dates and loss] found [forecast result, if examined]. These results do not by themselves identify an intervention effect.

If the diagnostic evidence prevents a reliable restriction-test verdict, say that explicitly. “We computed the test but cannot give it the usual interpretation under this specification” is a substantive finding, not a failed assignment.

Core Practice

  1. A researcher regresses yty_t on two of its own lags and three lags of xx. Write the null for no added linear predictive content from the included xx history. Why is testing only the third lag insufficient?
  2. Both regressions use 180 observations. The unrestricted model contains an intercept, four own lags, and two xx lags. Its RSS is 120; the restricted RSS is 126. Compute qq, kUk_U, the denominator degrees of freedom, and the F statistic. What assumptions would you need before interpreting its p-value?
  3. A restricted model uses 200 observations and an unrestricted model uses 196 because of longer lags. Explain why substituting their RSS values into the formula is not the intended nested-model test. Describe the repair.
  4. Rewrite: “Claims Granger-cause unemployment, so reducing benefit applications would reduce unemployment.” Use the common-driver experiment to explain the missing argument.
  5. Explain why one direction’s nonrejection does not establish that the variables are unrelated, and why predictive evidence in both directions does not identify two structural intervention effects.
  6. A nominal Granger test rejects, but the unrestricted regression’s BG diagnostic also rejects. What should the report say? Why is silently adding lags until both tests look favorable inappropriate?
  7. A larger regression lowers in-sample RSS but raises held-out RMSE. Is there a contradiction? Which comparison is mechanical and which is empirical?
  8. A student fits a levels regression to two series with strong evidence of unit roots and reports a routine Granger p-value. Identify the inferential concern. Why might differencing alone also be incomplete if the levels share a long-run relationship?
  9. In a daily process, xx affects yy only through a response that takes about one week. An analyst averages both series to monthly values and runs a past-only Granger test, which does not reject. Why might the effect show up instead as instantaneous causality, the β0xt\beta_0x_t term in Section 9.3’s equation? Does a same-period correlation between the two monthly innovations tell you which variable moved first?

Looking Ahead — The Same ARDL Can Describe Error Correction

Harry and Mouse wander, but the leash keeps them near one another. Karen wanders independently. Knowing Mouse’s position can tell us where Harry is even though neither position has a fixed long-run level. The useful object may be their separation, not either wandering level alone.

For two I(1)I(1) series, a stationary combination yt−c−κxty_t-c-\kappa x_t is a cointegrating relationship. A persistent departure from that relation can help predict subsequent changes. Module 10 will develop this idea and the evidence needed to support it.

We already have an algebraic entry point. Starting from the ARDL(1,1)(1,1) that includes current xtx_t,

yt=α+ϕ1yt−1+β0xt+β1xt−1+ϵt,y_t=\alpha+\phi_1y_{t-1}+\beta_0x_t+\beta_1x_{t-1}+\epsilon_t,

subtract yt−1y_{t-1} and collect terms:

Δyt=α+(ϕ1−1)yt−1+(β0+β1)xt−1+β0Δxt+ϵt.\Delta y_t=\alpha+(\phi_1-1)y_{t-1} +(\beta_0+\beta_1)x_{t-1}+\beta_0\Delta x_t+\epsilon_t.

If ϕ1≠1\phi_1\ne1, write this as

Δyt=λ(yt−1−c−κxt−1)+β0Δxt+ϵt,\Delta y_t=\lambda\bigl(y_{t-1}-c-\kappa x_{t-1}\bigr) +\beta_0\Delta x_t+\epsilon_t,

where λ=ϕ1−1\lambda=\phi_1-1, c=α/(1−ϕ1)c=\alpha/(1-\phi_1), and κ=(β0+β1)/(1−ϕ1)\kappa=(\beta_0+\beta_1)/(1-\phi_1). We use κ\kappa for the long-run slope here so that θ\theta keeps its earlier MA-coefficient meaning.

The first term is the possible “call and response” to the previous deviation; the second is the conditional association with the current change in xx. This is algebra, not proof of cointegration. The combination must actually be stationary, and estimation and structural interpretation require their own conditions. Because the equation now includes current xx, it also conditions on different information from the past-only Granger comparison taught above. We will keep that distinction visible in Module 10.

Connection to the Textbooks and Sources

  • Enders, Applied Econometric Time Series, 4th ed., Ch. 5 §8, pp. 303–309: hypothesis testing and the applied Granger-causality discussion, especially pp. 305–309. Translate his coefficient notation into the course’s ϕj\phi_j and βℓ\beta_\ell.
  • Hamilton, Time Series Analysis (1994), §11.2, pp. 302–309: prediction-based definitions, test qualifications, stock prices/dividends, and omitted information. These notes use one-step scalar regressions; the text develops a broader framework.
  • Optional integration readings: Enders Ch. 5 §8, pp. 307–309, on Granger tests with nonstationary variables (the test is nonstandard unless the causal variable can be written in first differences); Enders Ch. 6, pp. 358–359, on the Granger representation theorem and how Granger causality must be reinterpreted in a cointegrated system (one variable fails to Granger-cause another only if its lagged changes are absent from the other’s equation and the other does not respond to the deviation from long-run equilibrium), and pp. 383–384, on why there is no standard F-test of Granger causality in a cointegrated system and why differencing such a system discards information; Hamilton §18.2, p. 554, on why conventional causality-test inference can fail with unit roots.
  • Granger, C. W. J. (1969). “Investigating Causal Relations by Econometric Models and Cross-Spectral Methods,” Econometrica, 37(3), 424–438.
  • Sims, C. A. (1972). “Money, Income, and Causality,” American Economic Review, 62(4), 540–552.
  • Friedman, B. M., and Kuttner, K. N. (1992). “Money, Income, Prices, and Interest Rates,” American Economic Review, 82(3), 472–492. Discussed in Enders, p. 307.
  • Christiano and Ljungqvist (1988); Stock and Watson (1989). Money–income Granger-causality studies cited by Hamilton, p. 305, for the sensitivity of results to lag length and to the treatment of nonstationarity. See Hamilton’s references for full citations.
  • Sims, C. A. (1974). “Seasonality in Regression,” Journal of the American Statistical Association, 69(347), 618–626.
  • Wallis, K. F. (1974). “Seasonal Adjustment and Relations Between Variables,” Journal of the American Statistical Association, 69(345), 18–31.
  • Marcellino, M. (1999). “Some Consequences of Temporal Aggregation in Empirical Analysis,” Journal of Business & Economic Statistics, 17(1), 129–136.
  • Breitung, J., and Swanson, N. R. (2002). “Temporal Aggregation and Spurious Instantaneous Causality in Multiple Time Series Models,” Journal of Time Series Analysis, 23(6), 651–665.
  • Cornwall, G. J., Mills, J. A., Sauley, B. A., and Weng, H. (2019). “Predictive Testing for Granger Causality via Posterior Simulation and Cross-Validation,” Advances in Econometrics, 40A, 275–292. Publication; author’s posted manuscript. The method description here follows the posted manuscript dated November 18, 2018.
  • Ashley, R., Granger, C. W. J., and Schmalensee, R. (1980). “Advertising and Aggregate Consumption: An Analysis of Causality,” Econometrica, 48(5), 1149–1167. Quoted here as in Cornwall et al.
  • Ashley, R. A., and Tsang, K. P. (2014). “Credible Granger-Causality Inference with Modest Sample Lengths: A Cross-Sample Validation Approach,” Econometrics, 2(1), 72–91. Article.
  • Clark, T. E. (2004). “Can Out-of-Sample Forecast Comparisons Help Prevent Overfitting?” Journal of Forecasting, 23(2), 115–139. Discussed here as cited in Cornwall et al.; metadata from that manuscript’s reference list.
  • Inoue, A., and Kilian, L. (2005). “In-Sample or Out-of-Sample Tests of Predictability: Which One Should We Use?” Econometric Reviews, 23(4), 371–402. Discussed here as cited in Cornwall et al.; metadata from that manuscript’s reference list.
  • Wen, X., Rangarajan, G., and Ding, M. (2013). “Is Granger Causality a Viable Technique for Analyzing fMRI Data?” PLoS ONE, 8(7), e67428. Article.
  • Angrist, J. D., and Kuersteiner, G. M. (2011). “Causal Effects of Monetary Shocks: Semiparametric Conditional Independence Tests with a Multinomial Propensity Score,” Review of Economics and Statistics, 93(3), 725–747. Author-hosted paper.

Some textbook uses of “exogenous” refer to absence of predictive feedback. Do not silently substitute that label for the conditional-mean and intervention assumptions distinguished in Module 8. Course forecasts use tildes, estimated coefficients use hats, and fitted residuals are ete_t throughout.