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