%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;
%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;
libname paper " D:\simulation2 ";
%macro boot;
%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;
%if &sampnum>1 %then %do;
proc datasets;
append base=out_1
data=out_&sampnum;
quit;
%end;
%end;
data para (keep=sampnum parameter estimate);
set out_1;
if StdErrRatio ne .;
run;
proc sort data=para;
by parameter;
run;
proc means data=para std;
var estimate;
by parameter;
output out=temp2;
run;
data temp3;
set temp2;
if _STAT_="STD";
keep Estimate parameter;
run;
%mend;
%macro nonbootsurvival(n1,g,n,censor,var,label);
%do sn=1 %to 500;
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);
x2=rand('BERNOULLI',0.5);
re=rand('normal',0,&var);
output;
end;
run;
data a4;
merge a3 a2;
run;
data a5;
set a4;
t1=lu/exp(-2*z1+0.2*z2+0.2*x1+0.2*x2+re);
status=rand('BERNOULLI',&censor);
run;
**cluster survival analysis;
proc phreg data=a5 covm covs;
model t1*status(0)=z1 z2 x1 x2;
id cluster;
ods output parameterestimates=robustout;
run;
data robustout_&sn;
set robustout;
if StdErrRatio ne .;
run;
data paper.sd_&label;
set sd_1_&label;
run;
data robustci ;
set robustout_1;
IC_UP=estimate+1.96*StdErr;
IC_low=estimate-1.96*StdErr;
if parameter="z1" then true=-2;
else if parameter="z2" then true=0.2;
else if parameter="x1" then true=0.2;
else if parameter="x2" then true=0.2;
run;
data paper.robust_&label;
set robustci;
if true>=IC_low and true<=IC_UP then cover=1;
else cover=0;
if ProbChiSq<0.05 then coverp=1;
else coverp=0;
run;
data coxci ;
set coxout_1;
IC_UP=estimate+1.96*StdErr;
IC_low=estimate-1.96*StdErr;
if parameter="z1" then true=-2;
else if parameter="z2" then true=0.2;
else if parameter="x1" then true=0.2;
else if parameter="x2" then true=0.2;
run;
data paper.cox_&label;
set coxci;
if true>=IC_low and true<=IC_UP then cover=1;
else cover=0;
if ProbChiSq<0.05 then coverp=1;
else coverp=0;
run;
data frailtyci ;
set frailtout_1;
if parameter="b1" then true=2;
else if parameter="b2" then true=-0.2;
else if parameter="b3" then true=-0.2;
else if parameter="b4" then true=-0.2;
run;
data paper.frailty_&label;
set frailtyci;
if true>=Lower and true<=upper then cover=1;
else cover=0;
if Probt<0.05 then coverp=1;
else coverp=0;
run;