- 阅读权限
- 255
- 威望
- 1 级
- 论坛币
- 104790 个
- 通用积分
- 51.9656
- 学术水平
- 55 点
- 热心指数
- 74 点
- 信用等级
- 48 点
- 经验
- 23510 点
- 帖子
- 520
- 精华
- 0
- 在线时间
- 10924 小时
- 注册时间
- 2004-5-27
- 最后登录
- 2025-11-12
|
yongyitian 发表于 2013-9-15 11:41 
把一楼,31行 改为
power=L_lgrrc1>=δ 谢谢回复。
其实是改成output out=TRT_AB N lgrrc1;
(lgrrc1=Logit common relative risk, column 1 .)
正确的宏程序如下:
- %macro RR(delta,n1,n2,distr1,distr2,essai,report=1);
- %global pow;
- data _null_;
- call symput("seed ",date());
- run;
- Data depart;
- do numessai=1 to &essai;
- do pat=1 to %eval(&n1+&n2);
- if pat<=&n1 then do;
- Distr=rantbl(&seed,&distr1);
- group=1;
- end ;
- if pat> %eval(&n1) and pat <= %eval(&n1+&n2) then do;
- Distr=rantbl(&seed,&distr2);
- group=2;
- end;
- output;
- end;
- end;
- Run;
- /**对每组随机数进行CMH检验,并计算相对率;*/
- proc freq data=depart(where=(group in (1,2))) noprint;
- by numessai;
- tables group * distr /cmh2 scores=ridit;
- output out=TRT_AB N lgrrc1;
- run;
- /** 计算达到非劣效标准的次数;*/
- Data power1;
- set TRT_AB;
- if l_lgrrc1^=.;
- power=l_lgrrc1>=δ
- scenario="TRT-A/TRT-B";
- Run;
- proc univariate data=power1 noprint;
- by scenario;
- var power;
- output out =power2 n=n sum=rep;
- run;
- /** 计算效能,并准备报告;*/
- Data power3;
- length distr1 distr2 $ 30 scenario $ 20;
- merge power2;
- by scenario;
- lcl=100-100*Betainv(0.975,n-rep+1,rep)+0;
- ucl=100*Betainv(0.975,rep+1,n-rep)+0;
- lC="["|| compress (put(lcl,best4.))||"%;"|| compress (put(ucl,best4.))||"%"||"]";
- distr1=compress(symget("distr1")*100||"%");
- distr2=compress(symget("distr2")*100||"%");
- n1=symget("n1");
- n2=symget("n2");
- delta=symget("delta");
- simul=symget("essai");
- power=100*rep/n;
- call symput('pow',put(power,best4.1));
- Run;
- /**当报告开关为'开'时,报告模拟结果;*/
- %if %eval(&report)=1 %then %do;
- Title2"以相对率为指标时检验效能的计算结果";
- Proc report data= power3 headline headskip nowindows split ="@" ls=120;
- column("--" scenario simul delta power lc ("Expected sample size" "--" n1 n2) ("Expected rates" "--" distr1 distr2));
- define scenario /order format=$18. left width=18 "Scenario";
- define simul/display format=$5.center width=12 "N of @ simulations";
- define delta /display format=$5.center width=6"Delta";
- define power/display format=4.1 center width=6"Power";
- define lC/display format=$12.center width=12"95% cl of @ Power";
- define n1/display format=$10.center width=12 "TRT-A";
- define n2/display format=$10.center width=12 "TRT-B";
- define distr1/display format=$12.center width=12 "TRT-A";
- define distr2/display format=$12.center width=12 "TRT-B";
- compute after;
- line @31 108*"-";
- endcomp;
- footnote "seed=&seed";
- %end;
- Run;
- %mend RR;
- %RR(0.9, 100, 100, 0.80, 0.80, 1000);
- %macro psize(delta,distr1,distr2,base=100,ratio=1,power=80,essai=1000,from=%STR(),to=%STR());
- options nodate nonumber ps=20;
- title;
- %if &from ne %then %goto fromto;
- %let n1=%eval(&base);
- %let n2=%eval(&n1*&ratio);
- %rr(&delta,&n1,&n2,&distr1,&distr2,&essai);
- %do %while(&pow < %eval(&power));
- %let step=%sysfunc(max(1,%sysfunc(int(%eval(&power)-&pow))));
- %let essai=%sysfunc(int(10000/%eval(&step)));
- %let n1=%eval(&n1+&step);
- %let n2=%eval(&n1+&ratio);
- %rr(&delta,&n1,&n2,&distr1,&distr2,&essai);
- %if &pow>= %eval(&power) %then %goto exit;
- %end;
- %do %while (&pow>%eval(&power));
- %let step=%sysfunc(max(1,%sysfunc(int(&pow-%eval(&power)))));
- %let essai= %sysfunc (int(10000/%eval (&step)));
- %let n1= %eval(&n1-&step);
- %let n2= %eval(&n1*&ratio);
- %rr(&delta,&n1, &n2,&distr1,&distr2,&essai);
- %if &pow <= %eval(&power) %then %goto exit;
- %end;
- %fromto:
- %do t= %eval(&from-1) %to %eval(&to-1);
- %let n1=%eval(&t+1);
- %let n2=%eval(&n1*&ratio);
- %rr(&delta,&n1, &n2,&distr1,&distr2,&essai);
- %end;
- %exit:
- run;
- %mend psize;
- %psize (0.9,0.8,0.8);
复制代码
|
-
总评分: 经验 + 60
论坛币 + 60
学术水平 + 1
热心指数 + 1
信用等级 + 1
查看全部评分
|