|
程序如下:%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 没有找到或无法加载。
|