File Exchange

image thumbnail

Granger Causality Test

version 1.3 (2.31 KB) by

Conducts a Granger Causality test using the Bayesian Information Criterion to select lag length

10 Ratings



View License

GRANGER_CAUSE is a Granger Causality Test. The null hypothesis is that the y does not Granger Cause x. A user specifies the two series, x and y, along with the significance level and the maximum number of lags to be considered. The function chooses the optimal lag length for x and y based on the Bayesian Information Criterion. The function produces the F-statistic for the Granger Causality Test along with the corresponding critical value. We reject the null hypothesis that y does not Granger Cause x if the F-statistic is greater than the critical value. Type help granger_cause to learn more.

Comments and Ratings (16)


robert (view profile)

I agree with Kaifu that the code rejects the null too often,
what did you change in the code?

I thought the problem was a real bug in the code - not just the inclusion of the offset ,
thanks for any clarification


Kaifu (view profile)

I agree with LangS that the regression function is not advisable to use here, the constant term should not appear in this model.
Actually, I tried this code to my data and it rejected the null hypothesis all the time and I was very frustrated. After I fixed the problem, the code works well. So thanks still.


robert (view profile)

Wonderful code, I learned a lot about Granger Causality from
studying the code.
Thanks Chandler!
Replies to comments:
RK - I am pretty sure T changes as the lag length changes.

LangS - I agree that granger_cause rejects the null hypothesis too often.
There seems to be two things happening. (1) using BIC to search over the various lagged models to find the best one is a form of multiple comparison that changes the distribution of F under the null hypothesis.
this can be seen by re-running your monte-carlo simulation with longer and longer lagged models
and note the the probability of F exceeding the critical value increases.

(2) If there is excess rejections of F with x lag = y lag = 1 then there is an error in calculating the degrees of freedom or some other error in the model.
I stated off a few years ago chasing down this error and wound up rewriting the code ( granger_cause_1 ) which i uploaded to the file exchange.


PK (view profile)

To be able to use BIC for lag selection, the number of observations across specifications needs to be constant, given by max_lag in this case. Right now the number of observations varied with the lag order, so it's not an apples-to-apples comparison. Also, BIC shouldn't have T: it needs to be adjusted for the observations dropped to ensure that the number of observations is the same.

Raphael Guex

Dear users, did someone confirmed the comments of Weihai, Langs and Jangyu ?

Thanks for your help and best luck

Jingyu Qain

Hi Chandler, I compared this code with granger.test() in R package MSBVAR using the same data sets. And I got very different F statistics. This makes me confused.

Jingyu Qain

samar habibi

Marta Palka

Hi Chandler, I have a question re max_lag. Does this number relates to the frequency of my data, i.e. if I specify that max_lag=1 and my input is daily data, does this mean I am allowing 1 day lag? thanks

How should I determine the significance level?

Weihai Yu

Dear Chandler

Thank you for your great contribution.
Yet I have a question concerning calculating F-statistic,
the parameters for numerator and denominator as at the end of the function
are y_lag and x_lag+y_lag+1.
I read in Wikipedia which says "the simple linear model y = mx + b has p=2 ", if Wikipedia
is right, then the parameters should be "y_lag+1 and x_lag+y_lag+2"

could you please explain this in a simple way? I am quite confused.


LangS (view profile)

This function uses Matlab function "regress" which assumes a constant term(intercept) in the linear regression and therefore violates Granger causality definition(See Granger's original paper, Econometrica 37:3 424-438, 1969).

I applied this function on two random numbers series (10 time points, lag = 2) and repeated 1000 times (every time the two series are different), and set the alpha value as 0.05. Among the 1000 tests, 400 were found to have "Granger causality"! So I think the result is not reliable.


Dear Chandler, I have gratefully downloaded your script. How would it be possible to also include a stationarity check into the routine or would you recommend to check stationarity of the series beforehand? Many thanks, Wolfgang


Chandler (view profile)

William, there was a small error in the selection of the lag lengths using the BIC. It should be fixed as of 03/18/2010

William Gruner

This appears to calculate the same x and y lags regardless of the actual lags present between the two vectors. In addition, the F statistic generated by the function only appears valid for specific (small) lags. The test I used involved a simple pair of sinusoids phase-shifted to various degrees with and without a small amount of Gaussian noise.

Luna Bella

I like how the author uses the Bayesian Information criterion to select the lag length which is a consistent model selection criterion



There was an error in the calculation of the lengths of the BIC. It is now fixed. I would like to thank Mads for pointing out the bug.


There was an error in selecting the lag length for the BIC. It is now fixed. I would like to thank Mads for pointing out the bug.


A correction was made in the calculation of the critical value from the F-distribution

MATLAB Release
MATLAB 7.8 (R2009a)

Inspired: Granger_Cause_1

Download apps, toolboxes, and other File Exchange content using Add-On Explorer in MATLAB.

» Watch video