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))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.
Core Learning Objectives
By the end of this module, you should be able to:
- Explain Granger causality as incremental, directional, conditional predictive information.
- 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.
- Recognize how the idea has been used in economics and in the analysis of brain signals.
- Write a joint lag-exclusion null, fit restricted and unrestricted ARDL regressions on the same observations, and calculate their F statistic.
- Test both directions separately, inspect specification diagnostics, and explain why lag choices and conditioning information matter.
- Distinguish a restriction-test result from useful held-out forecast performance, and write a conclusion that respects the evidence.
- 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:
Here is the outcome, its own lag captures persistence, and supplies another piece of past information. The parameters describe the data-generating process; estimates carry hats and fitted residuals are . We begin with stationary variables and a conditional-mean equation whose disturbance contains no remaining predictable mean from the histories being modeled.
Now remove . Does the forecast lose something, or did the history of already contain the useful information? That is the organizing question of this chapter. A large correlation between and 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 .
Before reading on, distinguish these questions:
| Question | What would an answer tell us? |
|---|---|
| Do and move together? | Association. |
| Does the past of improve prediction of beyond the history already used? | Additional predictive information. |
| Would intervening on change ? | 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 Granger-causes if it contains information useful for predicting beyond the past of 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 to a forecast without it. A predictor is not useful merely because it is correlated with the outcome.
- Directional: helping predict and helping predict 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, says that contributes no additional linear predictive term after controlling for . A nonzero 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 .
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 be the baseline history and let add past . One-step mean noncausality is
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 affects an early signal and a later outcome , past may genuinely help forecast . 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 and an outcome , with independent disturbances. In a structural interpretation of this deliberately simple DGP, changing current changes current . But yesterday’s independent provides no information about today’s or . 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:
The term () is the contemporaneous channel. The Granger null concerns only . Our past-only comparison does not test : the tested block starts at , and current appears in neither regression. A same-period link between and 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 can depend on observations after . 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 lags | Evidence against those linear exclusion restrictions, conditional on an adequate model and valid inference. | “Changing will change .” |
| 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
Here is the largest predictor lag, not the moving-average order used in earlier ARMA notation. The block starts at lag one, and current appears in neither regression. Current could enter in two other ways. Putting in both regressions asks whether earlier adds information given current . Putting 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
In shorthand we write the null as and the alternative as ; 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 outcome lags but removes the -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 does not establish that all three included lags are unhelpful. Nor is this the null : positive and negative lag effects can sum to zero while still changing next-period predictions.
9.6 Calculate and Interpret the Test — Core
Let and be the sums of squared fitted residuals from the restricted and unrestricted regressions. Let count their common usable observations, and let count all estimated unrestricted regression coefficients, including the intercept. For excluded coefficients,
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 . A negative RSS reduction is a reason to check the models or data, not a surprising economic discovery.
Compare the statistic with an 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 , the unrestricted equation has an intercept, two own lags, and three lags, and its RSS is 90. The restricted RSS is 108. Then , , and
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 changes .
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 helps predict , make the outcome, include its own lags, and test the added -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
with mutually independent, independent-over-time standard normal innovations. The second equation contains lagged ; the first contains no lagged . 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 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")Modify and reconcile: keep the seed and innovations fixed, replace 0.6 by zero, regenerate , 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 arrive independently each period. The observed signal is noisy news; responds to yesterday’s news:
All three disturbances , , and are mutually independent standard normal draws over time. There is no term in the structural equation for . Yet yesterday’s noisy signal tells us something about yesterday’s news, which matters for today’s outcome.
Predict before running: will help in a regression that omits ? What should change once 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 ’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 does not directly cause . Now impose a change on recorded , holding , the outcome’s initial state, and its disturbances fixed. The structural equation for has not changed, so its path does not change. In observational data, is informative; in this specified intervention, it is not a driver.
The news is independent over time by design. Yesterday’s is a noisy measurement of the one news realization that enters today’s . Under the stated Gaussian draws, , so the bivariate conditional mean contains . Conditioning on 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 be the monthly U.S. unemployment rate in percent. Let be the mean of the weekly initial-claims observations whose week-ending Saturdays fall in month . Both published series are seasonally adjusted. We retain Module 8’s variables:
Thus is measured in unemployment percentage points; 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 .
The calendar behind the two series is less tidy than the monthly index suggests. The unemployment rate for month refers to the Current Population Survey reference week, the week containing the 12th, and is released early in month . Weekly initial claims are released each Thursday for the week ending the previous Saturday. Three consequences follow.
- averages weeks both before and after month ’s reference week. Since is the change between the reference weeks of months and , the later weeks inside fall within the period that measures. The monthly “lag” 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 is released, the claims covering month ’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")The transformations are a stationary working specification, not a declaration that each original level series is necessarily 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")A limited sensitivity table, not a search for significance
Fix three specifications for this chapter: , where is the outcome’s own-lag count and 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 using the unrestricted regression’s original columns and . We drop the first twelve rows from all auxiliary columns. If its effective sample is and its coefficient of determination is , the LM statistic is , compared with an asymptotic 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")The level prediction is . Adding the same observed 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 .
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 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 . Estimate the restricted and unrestricted regressions on the observations up to 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 , Ashley and Tsang (2014) use the coefficients estimated on observations to predict , and the coefficients estimated on to “precast” . Summing the squared prediction errors over all periods gives an unrestricted and a restricted out-of-sample sum, and . 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 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 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 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
- A researcher regresses on two of its own lags and three lags of . Write the null for no added linear predictive content from the included history. Why is testing only the third lag insufficient?
- Both regressions use 180 observations. The unrestricted model contains an intercept, four own lags, and two lags. Its RSS is 120; the restricted RSS is 126. Compute , , the denominator degrees of freedom, and the F statistic. What assumptions would you need before interpreting its p-value?
- 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.
- Rewrite: “Claims Granger-cause unemployment, so reducing benefit applications would reduce unemployment.” Use the common-driver experiment to explain the missing argument.
- 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.
- 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?
- A larger regression lowers in-sample RSS but raises held-out RMSE. Is there a contradiction? Which comparison is mechanical and which is empirical?
- 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?
- In a daily process, affects 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 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 series, a stationary combination 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 that includes current ,
subtract and collect terms:
If , write this as
where , , and . We use for the long-run slope here so that 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 . 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 , 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 and .
- 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 throughout.