全部版块 我的主页
论坛 提问 悬赏 求职 新闻 读书 功能一区 经管百科 爱问频道
376 0
2022-03-29
悬赏 50 个论坛币 未解决
程序如下:

%macroPIE (IDS, minage, maxage, agegrpw, group, level1, level2, agefree, o1, o2);

        %data1 (&IDS, PDS)

        %sdsmac (PDS, (&level1,&level2), SDS)

        title "&group =&level1";

        %sdsmac (PDS, (&level1), SDS1)

        title "&group =&level2";

        %sdsmac (PDS, (&level2), SDS2)

        title;

        %incid (SDS, I, 1)

        %incid (SDS1, i1, 0)

        %incid (SDS2, i2, 0)

        %aa2g (i1, i2)

        title"&group=&level1";

        %lr (SDS1, &o1)

        title"&group=&level2";

        %lr (SDS2, &o2)

%mend;

%macrodata1 (in, out);  /*根据原始数据集得到中间结果表*/

        data &out;      /* out: 中间结果表*/

        set ∈            /* in: 原始数据集 */

        keep id age status astatus weight&group;

        if survage gt &maxage then do;      /* survage大于最大年龄:没发病也没死亡 */

                 survage = &maxage;

                 status = 0;

                 astatus = 0;

                 full = 1;

        end;

        start = max(entryage, &minage);

        stop = survage-1;

        age = survage;

        if status eq 0 and full ne 1 then weight= 0.5; else weight = 1;

        output;

        do age = start to stop;

                 status = 0; astatus = 0; weight= 1; output;

        end;

        run;

%mend;

%macrosdsmac (in, level, out);

        proc means noprint n sum data = ∈

                 where (&group in&level);

                 class age;

                 var status astatus weight;

                 output out = t n = r sum = e cw;

        run;

        data &out; set t;

                 if age eq . then age = 999;

                 proc sort; by age; run;

%mend;

%macroincid (in, out, p);

        data temp; set ∈

                 if &minage le age le&maxage;

                 agegroup =floor((age-&minage)/&agegrpw);

        run;

        proc means noprint sum; class agegroup;

                 var e w;

                 output out=t sum=events wpy;

        run;

        data tot tt;set t;

                 wtr = 1000*events/wpy;

                 if agegroup eq . then do;agegroup=88; output tot; end;

                 output tt;

        run;

        proc sort; by agegroup; run;

        data &out;

                 format agegroup agf.;

                 if _n_ eq 1 then set tot (rename= (wpy = twpy));

                 set tt;

                 last = (floor((&maxage-&minage)/ &agegrpw));

        run;

        %if &p eq 1 %then %do;

                 proc print; var agegroup eventswpy wtr; run;

        %end;

%mend;

%macroaa2g (in1, in2);

        data a;

                 merge &in1(rename=(events=e&level1 wpy=wpy&level1

                                                           twpy=twpy&level1wtr=rate&level1))

                           &in2 (rename=(events=e&level2wpy=wpy&level2

                                                           twpy=twpy&level2wtr=rate&level2));

                 by agegroup;

        data b;set a (drop=rate&level1rate&level2);

                 if agegroup ne 88;

                 keep agegroup rate&level1rate&level2;

                 atwpy=sum (of wpy&level1,wpy&level2);

                 gtwpy=sum (of twpy&level1,twpy&level2);

                 wtwpy=atwpy/gtwpy;

                 retain rate&level1rate&level2;

                 rate&level1=

                         sum (ofrate&level1, 1000* (e&level1/wpy&level1)*wtwpy);

                 rate&level2=

                         sum (of rate&level2,1000* (e&level2/wpy&level2)*wtwpy);

                 if agegroup eq last then do;

                         agegroup=99; output;

                 end;

                 data c;

                         set a b;

                 run;

                 proc print noobs;

                 var agegroup e&level1wpy&level1 rate&level1

                                                  e&level2wpy&level2 rate&level2; run;

%mend;

%macrolr (in, sendout);

        data out; set ∈

                 if (&agefree le age le&maxage);

                 array a (*)a&agefree-a&maxage; array b (*) b&agefree-b&maxage;

                 array fstara (*)fstar&agefree-fstar&maxage;

                 index=age-&agefree+1;

                 retain cs cvlp cfa csa cov vcf&agefree cfstar&agefree

                         a&agefree-a&maxageb&agefree-b&maxage

                         fstar&agefree-fstar&maxage;

                 if age eq &agefree then do;

                         cs=1; cvlp=0; cfa=0;csa=1; cov=0; v=0;

                         cf&agefree=0;cfstar&agefree=0;

                 end;

        ** survival estimates***;

                 h=e/r; ha=c/r;

                 f=h*cs;cf&agefree=cf&agefree+f; cs=1-cf&agefree;

                 fa=ha*csa; fstar=h*csa;

                 cfa=cfa+fa; csa=1-cfa;

                 cfstar&agefree=cfstar&agefree+fstar;

        **standard errors***;

                 cvlp=cvlp+e/(r*(r-e));

                 if age ge &agefree then do;

                         a(index)=(-1/r);fstara(index)=fstar;

                 end;

                 if age eq &agefree thenb&agefree=c/(r*(r-c));

                 if age gt &agefree then

                         b(index)=b(index-1)+(c/(r*(r-c)));

                 cc=0;

                 if age ge (&agefree+2) then

                 do k=2 to (index-1);

                         cc=cc+(fstara(k)*(a(k)+b(k-1)));

                 end;

                 cov=cov+fstar*cc;

                 if (age ge (&agefree+1))then bb=b(index-1);

                 else bb=0;

                 if (e gt 0) then

                         v=v+(fstar**2)*(((r-e)/(e*r))+bb);

                 secf&agefree=sqrt((cs**2)*cvlp);

                 secff&agefree=sqrt(v+2*cov);

                 keep age r e c cf&agefreesecf&agefree

                         cfstar&agefreesecff&agefree;

        run;

        data s1; set out;

                 keep years cf&agefreesecf&agefree cfstar&agefree secff&agefree

                                  lcl ucllclstar uclstar;

                 cf&agefree=cf&agefree*100;

                 secf&agefree=secf&agefree*100;

                 cfstar&agefree=cfstar&agefree*100;

                 secff&agefree=secff&agefree*100;

                 years=age;

                 years=(age- &agefree+1);

                 lcl=max(0,cf&agefree-1.96*secf&agefree);

                 ucl=min(100,cf&agefree+1.96*secf&agefree);

                 lclstar=max(0,cfstar&agefree-1.96*secf&agefree);

                 uclstar=min(100,cfstar&agefree+1.96*secff&agefree);

        run;

        data &sendout; set s1;

                 keep years cf&agefreesecf&agefree

                         cfstar&agefreesecff&agefree;

                 run;

                 data s2; set s1;

                         if ((years/&agegrpweq floor (years/&agegrpw)));

                                  format yearsyear.;

        run;

        title2 ‘Unadjusted CumulativeIncidence’;

        title3 ‘With 95% Confidence Limits’;

        proc print; id years; var cf&agefreelcl ucl; run;

        title2 ‘Cumulative Incidence, Adjustedfor Competing Risk of Death’;

        title3 ‘With 95% Confidence Limits’;

        proc print; id years; var cfstar&agefreelclstar uclstar; run;

        title; title2; title3;

%mend;

%PIE(Work.aaa, 35, 80, 5, sex, 1, 2, 35, o1, o2);

run;

日志报错:
48: 无法确定 LINE 和 COLUMN。
NOTE 242-205: NOSPOOL 已打开。用 OPTION SPOOL 重新运行可恢复出错的 LINE 和 COLUMN。
ERROR 48-59: 输出格式 AGF 没有找到或无法加载。


二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群