|
|
Re: 大家能不能帮看看宏程序问题出在哪里?
用where语句不能传递&eventzqdm and &eventdate,用if 语句却可以,如在lili的程序中
[code:200jmyr4]data test2;
set test1;
if tradedate=&eventdate;
run;
proc sql noprint ;
select obs into :num1
from test2;
quit; [/code:200jmyr4]
运行起来可以传递,
而我最先的程序中
[code:200jmyr4]proc sql noprint ;
select obs into :num1 from test1
where tradedate=&eventdate; /*判断eventdate*/
quit;[/code:200jmyr4]
却无法运行。
找了一下原因,原来是没有加"",如将上面语句改一下即可
[code:200jmyr4]proc sql noprint ;
select obs into :num1 from test1
where tradedate="&eventdate"; /*判断eventdate*/
quit;[/code:200jmyr4]
把lili给出的macro calcu语句用where语句简化如下
[code:200jmyr4]%macro calcu(eventzqdm,eventdate);
data test1;
set test;
if zqdm=&eventzqdm;
obs=_n_;
run;
proc sql noprint ;
select obs into :num1 from test1
where tradedate="&eventdate"; /*判断eventdate*/
quit;
data betafirm;
set test1;
where %eval(&num1-10)<=obs<=%eval(&num1+10);
run;
data index1;
set index;
obs=_n_;
run;
proc sql noprint ;
select obs into: num2 from index1
where tradedate="&eventdate"; /*判断eventdate*/
quit;
data beta_mkt;
set index1;
where %eval(&num2-10)<=obs<=%eval(&num2+10);
run;
data betaboth;
merge betafirm beta_mkt;
by tradedate;
drop obs;
run;
proc reg noprint data=betaboth outest=Coefout;
model ret=indexret;
run;
data _null_;
set coefout;
call symput('nextalpha',intercept);
call symput('nextbeta',indexret);
run;
data eventfirm;
set test1;
where %eval(&num1-30)<=obs<=%eval(&num1-11);
run;
data event_mkt;
set index1;
where %eval(&num2-30)<=obs<=%eval(&num2-11);
run;
data Car_calc;
merge eventfirm event_mkt;
by tradedate;
drop obs;
if _N_=1 then Car=ret-(&nextalpha + &nextbeta*indexret);
else car =ret-(&nextalpha + &nextbeta*indexret)+holdcar;
holdcar=car;
retain holdcar;
alpha=&nextalpha;
beta=&nextbeta;
run;
proc append base= Cars data=Car_calc(drop=holdcar);
run;
%mend calcu;[/code:200jmyr4]
再次感谢lili及各位老大的关心和帮助 <!-- s:D --><img src="{SMILIES_PATH}/icon_biggrin.gif" alt=":D" title="Very Happy" /><!-- s:D --> |
|