格兰杰因果关系检验的SAS实现
(2012-07-15 11:49:19)
标签:
杂谈 |
分类: 统计建模 |
%macro causal(data = , y = ,
drivers = , max_lags = );
***********************************************************;
* THIS SAS MACRO IS AN IMPLEMENTATION OF BI-VARIATE
*;
* GRANGER CAUSALITY TEST PROPOSED BY GRANGER (1969)
*;
* ======================================================= *;
* PAMAMETERS:
*;
* DATA
: INPUT SAS DATA
TABLE *;
* Y :
A CONTINUOUS TIME SERIES RESPONSE
VARIABLE *;
* DRIVERS :
A LIST OF TIME SERIES
PREDICTORS *;
* MAX_LAGS : MAX # OF
LAGS TO SEARCH FOR
CAUSAL *;
*
RELATIONSHIPS
*;
* ======================================================= *;
* CONTACT: *;
* WENSUI.LIU@53.COM,
LOSS FORECASTING & RISK
MODELING *;
***********************************************************;
optionsnocenter nonumber
nodate mprint mlogic symbolgen orientation = landscape
ls
= 150 formchar =
"|----|+|---+=|-/\<>*";
%macrogranger(data =
, dep = , indep = , nlag = );
%letlag_dep = ;
%letlag_indep = ;
data_tmp1;
set &data (keep =
&dep &indep);
%do i = 1 %to &nlag;
lag&i._&dep =
lag&i.(&dep);
lag&i._&indep =
lag&i.(&indep);
%let lag_dep =
&lag_dep lag&i._&dep;
%let lag_indep =
&lag_indep lag&i._&indep;
%end;
run;
proc corrdata = _tmp1
noprint outp = _corr1(rename = (&dep =
value) where = (_type_ =
'CORR')) nosimple;
var &dep;
with lag&nlag._&indep;
run;
proc corrdata = _tmp1
noprint outp = _corr2(rename = (&dep =
value) where = (_type_ =
'CORR')) nosimple;
var &dep;
with lag&nlag._&indep;
partial lag&nlag._&dep;
run;
proc regdata = _tmp1
noprint;
model &dep =
&lag_dep;
output out = _rest1 r =
rest_e;
run;
proc regdata = _tmp1
noprint;
model &dep =
&lag_dep &lag_indep;
output out = _full1 r =
full_e;
run;
proc sqlnoprint;
select sum(full_e * full_e) into :full_sse1
from _full1;
select sum(rest_e * rest_e) into :rest_sse1
from _rest1;
select count(*)
into :n from _full1;
select value into :cor1 from _corr1;
select value into :cor2 from _corr2;
quit;
data_result;
format dep $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);
format flag1 $3.;
if max(p_ftest1, p_chisq1) <
0.01 then flag1 = "***";
else if max(p_ftest1, p_chisq1) <
0.05 then flag1 = "
**";
else if max(p_ftest1, p_chisq1) <
0.1 then flag1 = " *" ;
else flag1 = "
" ;
run;
%mendgranger;
data_in1;
set &data (keep =
&y &drivers);
run;
%letvar_loop =
1;
%do%while (%scan(&drivers, &var_loop) ne %str());
%let driver = %scan(&drivers, &var_loop);
%do lag_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;
***********************************************************;
* THIS SAS MACRO IS AN IMPLEMENTATION OF BI-VARIATE
* GRANGER CAUSALITY TEST PROPOSED BY GRANGER (1969)
* ======================================================= *;
* PAMAMETERS:
*
*
*
*
*
* ======================================================= *;
* CONTACT:
*
***********************************************************;
options
%macro
%let
%let
data
run;
proc corr
run;
proc corr
run;
proc reg
run;
proc reg
run;
proc sql
quit;
data
run;
%mend
data
run;
%let
%do

加载中…