SAS中文论坛

 找回密码
 立即注册

扫一扫,访问微社区

12
返回列表 发新帖
楼主: shiyiming
打印 上一主题 下一主题

大家能不能帮看看宏程序问题出在哪里?

[复制链接]

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
11#
 楼主| 发表于 2008-4-11 22:59:24 | 只看该作者

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 -->
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|手机版|Archiver|SAS中文论坛  

GMT+8, 2026-2-4 18:13 , Processed in 0.067884 second(s), 21 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表