***********************************************************;
*THIS SAS MACRO IS AN IMPLEMENTATION OFBI-VARIATE*;
*GRANGER CAUSALITY TEST PROPOSED BY GRANGER(1969)*;
*=======================================================*;
*PAMAMETERS:*;
*DATA: INPUT SAS DATATABLE*;
*Y:A CONTINUOUS TIME SERIES RESPONSEVARIABLE*;
*DRIVERS:A LIST OF TIME SERIESPREDICTORS*;
*MAX_LAGS : MAX # OFLAGS TO SEARCH FORCAUSAL*;
*RELATIONSHIPS*;
*=======================================================*;
*CONTACT:*;
*WENSUI.LIU@53.COM,LOSS FORECASTING & RISKMODELING*;
***********************************************************;
optionsnocenter nonumbernodate mprint mlogic symbolgen orientation = landscape
ls= 150formchar ="|----|+|---+=|-/<>*";
%macrogranger(data=, dep = , indep = , nlag = );
%letlag_dep = ;
%letlag_indep = ;
data_tmp1;
set&data(keep=&dep&indep);
%doi = 1%to&nlag;
lag&i._&dep=lag&i.(&dep);
lag&i._&indep=lag&i.(&indep);
%letlag_dep =&lag_deplag&i._&dep;
%letlag_indep =&lag_indeplag&i._&indep;
%end;
run;
proccorrdata= _tmp1noprint outp = _corr1(rename= (&dep=value) where= (_type_ ='CORR')) nosimple;
var&dep;
with lag&nlag._&indep;
run;
proccorrdata= _tmp1noprint outp = _corr2(rename= (&dep=value) where= (_type_ ='CORR')) nosimple;
var&dep;

with lag&nlag._&indep;
partial lag&nlag._&dep;
run;
procregdata= _tmp1noprint;
model &dep=&lag_dep;
outputout = _rest1 r =rest_e;
run;
procregdata= _tmp1noprint;
model &dep=&lag_dep&lag_indep;
outputout = _full1 r =full_e;
run;
procsqlnoprint;
selectsum(full_e * full_e) into:full_sse1from_full1;
selectsum(rest_e * rest_e) into:rest_sse1from_rest1;
selectcount(*)into:nfrom_full1;
selectvalue into:cor1 from_corr1;
selectvalue into:cor2 from_corr2;
quit;
data_result;
formatdep $20. ind $20.;
dep= "&dep";
ind= "%upcase(&indep)";
nlag = &nlag;
corr1 = &cor1;
corr2 = &cor2;
f_test1=((&rest_sse1-&full_sse1) /&nlag) /(&full_sse1/(&n-2*&nlag-1));
p_ftest1 = 1- probf(f_test1, &nlag, &n-2*&nlag-1);
chisq_test1 = (&n*(&rest_sse1-&full_sse1)) /&full_sse1;
p_chisq1=1- probchi(chisq_test1, &nlag);
formatflag1 $3.;
ifmax(p_ftest1, p_chisq1) <0.01thenflag1 = "***";
elseifmax(p_ftest1, p_chisq1) <0.05thenflag1 = "**";
elseifmax(p_ftest1, p_chisq1) <0.1thenflag1 = "*";
elseflag1 = "";
run;
%mendgranger;
data_in1;
set&data(keep=&y&drivers);
run;
%letvar_loop =1;
%do%while(%scan(&drivers, &var_loop) ne %str());
%letdriver = %scan(&drivers, &var_loop);
%dolag_loop =1%to&max_lags;
%granger(data=_in1, dep = &y,indep = &driver, nlag =&lag_loop);
%if&var_loop=1&&lag_loop=1%then%do;
data_final;
set_result;
run;
%end;
%else%do;
data_final;
set_final_result;
run;
%end;
%end;
%letvar_loop =%eval(&var_loop+1);
%end;
title;
procreportdata=_last_ box spacing = 1split ="/"nowd;
column("GRANGERCAUSALITY TEST FOR %UPCASE(&y) UPTO&MAX_LAGS LAGS"
ind nlag corr1 corr2 f_test1 chisq_test1 flag1);
defineind/ "DRIVERS"width= 20centergrouporderorder= data;
definenlag/"LAG"width= 3format=3.center orderorder= data;
definecorr1/ "PEARSON/CORRELATION"width= 12format= 8.4center;
definecorr2/ "PARTIAL/CORRELATION"width= 12format= 8.4center;
definef_test1/ "CAUSAL/F-STAT"width= 12format= 10.4center;
define chisq_test1 /"CAUSAL/CHISQ-STAT"width= 12format= 10.4center;
defineflag1/ "CAUSAL/FLAG"width= 8right;
run;
%mendcausal;
�usal(data=sashelp.citimon, y = RTRR, drivers = CCIUTC LHUR FSPCON, max_lags =6);