- 阅读权限
- 255
- 威望
- 0 级
- 论坛币
- 461 个
- 通用积分
- 0
- 学术水平
- 0 点
- 热心指数
- 0 点
- 信用等级
- 0 点
- 经验
- 1617 点
- 帖子
- 110
- 精华
- 0
- 在线时间
- 128 小时
- 注册时间
- 2009-3-7
- 最后登录
- 2020-4-9
硕士生
还不是VIP/贵宾
- 威望
- 0 级
- 论坛币
- 461 个
- 通用积分
- 0
- 学术水平
- 0 点
- 热心指数
- 0 点
- 信用等级
- 0 点
- 经验
- 1617 点
- 帖子
- 110
- 精华
- 0
- 在线时间
- 128 小时
- 注册时间
- 2009-3-7
- 最后登录
- 2020-4-9
|
50论坛币
这个问题困扰我一天多了,一直很无奈。换了9.1.3和9.2,都有这样的问题。
我的任务是:
一大堆数据库,data(i,j),但是数据库里已知的变量只有两个,一个是日期date,一个是回归因变量比如growth(i,j),剩下的用于回归的自变量除一个以外都是未知的比如growth(x,y),其中x^=i。
我要做的第一步,将所有的自变量全部扩展成lag1-lag5,也就是将growth(x,y)变成变量growth(x,y,t-5),growth(x,y,t-4),growth(x,y,t-3)……growth(x,y,t);
第二步就是将所有的自变量对growth(i,j)回归。
程序如下:- %global vlist;
- %macro processing(i, j);
- proc contents data=data&i._&j out=content1 noprint;
- /*vlist装着表格里的变量名称*/
- proc sql noprint;
- select name
- into :vlist separated by ' '
- from content1
- where varnum>2;
- quit;
- %put vlist===============================&vlist;
- /*下面段程序用于扩展数据,将growth(x,y)变成growth(x,y,t-5),growth(x,y,t-4),growth(x,y,t-3)……growth(x,y,t)*/
- proc expand data=data&i._&j out=rexpand.data&i._&j;
- %do s=1 %to 99;
- %let string=%scan(&vlist, &s);
- %if %length(&string) ne 0 %then
- %do t=1 %to 5;
- convert &string=lag&t._&string / transformout= (lag &t);
- %end;
- %else %goto done;
- %end;
- %done: run;
- quit;
- data rexpand.data&i._&j;
- /*下面这2行程序确保这2个变量不在自变量列表的行列里。*/
- format date yymmdd10.;
- format growth&i._&j 15.12;
- set rexpand.data&i._&j;
- /*下面这一行只是为了删除lag5为空的行*/
- if lag5_var&i._&j=. then delete;
- drop time;
- run;
- /*下面这段程序是为了获取最新的自变量列表,包括原列表里所有的lag1-lag5项*/
- proc contents data=rexpand.data&i._&j noprint out= content2;
- run;
- proc sql noprint;
- select name
- into :vlist separated by ' '
- from content2
- where varnum>2;/*varnum>2确保date和growth(i,j)变量没被列入自变量列表中*/
- quit;
- %put vlist=================================&vlist;
- proc reg data=rexpand.data&i._&j outest=outest.data&i._&j;
- model growth&i._&j=&vlist / selection=stepwise aic ADJRSQ;
- output out=out.data&i._&j p=p r=r;
- run;
- quit;
- %mend;
复制代码 这段程序如果放在几百行的复杂程序里跑时,
第一次,vlist的值输出显示为空
第二次,vlist的值输出显示不为空,但是也不对。
第三次,vlist的值显示正常了。然后程序运行就正常了。
但是如果这段程序变成不用宏%macro processing,单独copy出来到一个新文件里,把i和j分别替换成具体的数值,程序完全能够一次性正常运行。vlist的显示也正确。
说实话这个问题我目前的解决方案感觉就像电视机不好使唤的时候,拍两下就会好一阵子的。
另外我将程序- proc sql noprint;
- select name
- into :vlist separated by ' '
- from content1
- where varnum>2;
- quit;
复制代码 换成过call symput()的形式,结果还是一样的。
我对问题的感觉是,程序大了或宏变量多了以后,正常的宏运算就会遇到一定的问题,不知道谁有这样的经验? |
|