Switch to side-by-side view

--- a
+++ b/Supporting Functions/granger_cause.m
@@ -0,0 +1,153 @@
+function [F,c_v] = granger_cause(x,y,alpha,max_lag)
+% [F,c_v] = granger_cause(x,y,alpha,max_lag)
+% Granger Causality test
+% Does Y Granger Cause X?
+%
+% User-Specified Inputs:
+%   x -- A column vector of data
+%   y -- A column vector of data
+%   alpha -- the significance level specified by the user
+%   max_lag -- the maximum number of lags to be considered
+% User-requested Output:
+%   F -- The value of the F-statistic
+%   c_v -- The critical value from the F-distribution
+%
+% The lag length selection is chosen using the Bayesian information
+% Criterion 
+% Note that if F > c_v we reject the null hypothesis that y does not
+% Granger Cause x
+
+% Chandler Lutz, UCR 2009
+% Questions/Comments: chandler.lutz@email.ucr.edu
+% $Revision: 1.0.0 $  $Date: 09/30/2009 $
+% $Revision: 1.0.1 $  $Date: 10/20/2009 $
+% $Revision: 1.0.2 $  $Date: 03/18/2009 $
+
+% References:
+% [1] Granger, C.W.J., 1969. "Investigating causal relations by econometric
+%     models and cross-spectral methods". Econometrica 37 (3), 424–438.
+
+% Acknowledgements:
+%   I would like to thank Mads Dyrholm for his helpful comments and
+%   suggestions
+
+%Make sure x & y are the same length
+if (length(x) ~= length(y))
+    error('x and y must be the same length');
+end
+
+%Make sure x is a column vector
+[a,b] = size(x);
+if (b>a)
+    %x is a row vector -- fix this
+    x = x';
+end
+
+%Make sure y is a column vector
+[a,b] = size(y);
+if (b>a)
+    %y is a row vector -- fix this
+    y = y';
+end
+
+
+
+%Make sure max_lag is >= 1
+if max_lag < 1
+    error('max_lag must be greater than or equal to one');
+end
+
+%First find the proper model specification using the Bayesian Information
+%Criterion for the number of lags of x
+
+T = length(x);
+
+BIC = zeros(max_lag,1);
+
+%Specify a matrix for the restricted RSS
+RSS_R = zeros(max_lag,1);
+
+i = 1;
+while i <= max_lag
+    ystar = x(i+1:T,:);
+    xstar = [ones(T-i,1) zeros(T-i,i)];
+    %Populate the xstar matrix with the corresponding vectors of lags
+    j = 1;
+    while j <= i
+        xstar(:,j+1) = x(i+1-j:T-j);
+        j = j+1;
+    end
+    %Apply the regress function. b = betahat, bint corresponds to the 95%
+    %confidence intervals for the regression coefficients and r = residuals
+    [b,bint,r] = regress(ystar,xstar);
+    
+    %Find the bayesian information criterion
+    BIC(i,:) = T*log(r'*r/T) + (i+1)*log(T);
+    
+    %Put the restricted residual sum of squares in the RSS_R vector
+    RSS_R(i,:) = r'*r;
+    
+    i = i+1;
+    
+end
+
+[dummy,x_lag] = min(BIC);
+
+%First find the proper model specification using the Bayesian Information
+%Criterion for the number of lags of y
+
+BIC = zeros(max_lag,1);
+
+%Specify a matrix for the unrestricted RSS
+RSS_U = zeros(max_lag,1);
+
+i = 1;
+while i <= max_lag
+    
+    ystar = x(i+x_lag+1:T,:);
+    xstar = [ones(T-(i+x_lag),1) zeros(T-(i+x_lag),x_lag+i)];
+    %Populate the xstar matrix with the corresponding vectors of lags of x
+    j = 1;
+    while j <= x_lag
+        xstar(:,j+1) = x(i+x_lag+1-j:T-j,:);
+        j = j+1;
+    end
+    %Populate the xstar matrix with the corresponding vectors of lags of y
+    j = 1;
+    while j <= i
+        xstar(:,x_lag+j+1) = y(i+x_lag+1-j:T-j,:);
+        j = j+1;
+    end
+    %Apply the regress function. b = betahat, bint corresponds to the 95%
+    %confidence intervals for the regression coefficients and r = residuals
+    [b,bint,r] = regress(ystar,xstar);
+    
+    %Find the bayesian information criterion
+    BIC(i,:) = T*log(r'*r/T) + (i+1)*log(T);
+    
+    RSS_U(i,:) = r'*r;
+    
+    i = i+1;
+    
+end
+
+[dummy,y_lag] =min(BIC);
+
+%The numerator of the F-statistic
+F_num = ((RSS_R(x_lag,:) - RSS_U(y_lag,:))/y_lag);
+
+%The denominator of the F-statistic
+F_den = RSS_U(y_lag,:)/(T-(x_lag+y_lag+1));
+
+%The F-Statistic
+F = F_num/F_den;
+
+c_v = finv(1-alpha,y_lag,(T-(x_lag+y_lag+1)));
+
+
+    
+    
+    
+    
+
+