|
楼主

楼主 |
发表于 2011-2-26 18:35:52
|
只看该作者
一个有关SAS效率的问题
Dear 版主及各位高手:
今天跑了一个自己写的宏,用了6小时,这还只是我模拟实验的几十分之一,如果按我的程序,估计真的很难毕业了,所以想请教下各位如何提高这段代码的效率?
不胜感激!!
%macro boot; /* bootstrap 重抽样后计算估计参数的STD*/
%do sampnum=1 %to 500;
data bootsamp_&sampnum;
do i = 1 to nobs;
x = round(ranuni(0) * nobs);
set temp
nobs = nobs
point = x;
output;
end;
stop;
run;
proc sort data=bootsamp_&sampnum;
by id;
run;
data cox;
merge bootsamp_&sampnum(in=b) a5(in=a);
by id;
if b;
run;
proc phreg data=cox covm covs;
model t1*status(0)=z1 z2 x1 ;
ods output parameterestimates=out_&sampnum;
run;
%if &sampnum>1 %then %do;
proc datasets;
append base=out_1
data=out_&sampnum;
quit;
%end;
%end;
data para (keep=sampnum variable estimate);
set out_1;
if StdErrRatio ne .;
run;
proc sort data=para;
by variable;
run;
proc means data=para std;
var estimate;
by variable;
output out=temp2;
run;
data temp3;
set temp2;
if _STAT_="STD";
keep Estimate variable;
run;
%mend;
%macro caculatesd(n1,g,n,censor,label); /*生成数据并将多次模拟的结果保存下来*/
%do sn=1 %to 100;
data a1;
do cluster=1 to &g;
z1=rand('BERNOULLI',0.5);
z2=rand('normal',2,1);
output;
end;
run;
data a2;
set a1;
do i=1 to &n1;
output;
end;
run;
data a3;
do id=1 to &n;
u=rand('uniform');
lu=-log(u);
x1=rand('normal',3,1);
re=rand('normal',0,0.4);
output;
end;
run;
data a4;
merge a3 a2;
run;
data a5;
set a4;
t1=lu/exp(-2*z1+0.2*z2+0.2*x1+re);
status=rand('BERNOULLI',&censor);
run;
data temp ;set a5 ;keep id;run;
%boot /*调用上一个宏程序*/
proc transpose data=temp3 out=sd_&sn._&label(drop=_LABEL_);
id variable;
var estimate;
run;
%if &sn>1 %then %do;
proc datasets;
append base=sd_1_&label
data=sd_&sn._&label;
quit;
%end;
%end;
data paper.sd_&label;
set sd_1_&label;
run;
%mend;
%caculatesd(n1=10,g=50,n=500,censor=0.3,label=d10_50_30);
可以看到我的%caculatesd宏程序其实只做了100次,按道理来说至少要500次的,但是这个速度实在太可怕了,还望各位大侠出手相助!~ |
|