%macro CumInc(Data,Strata,Time,Surv); /* Number of Stratas */ proc sort data=&Data; by &Strata; data nstrat; set &Data end=last; by &Strata; firstS=first.&Strata; retain nStrata 0; nStrata+firstS; if last then call symput('nStrata',nStrata); drop firstS; run; /* Observations in ciData are deleted */ data newData; set &Data; start=(&Time eq 0); retain komb 0; komb+start; med=0; %do k=0 %to (&nStrata-1) %by 1; med=med+(komb eq (1+&k*(&nStrata+1))); %end; if (med eq 1); drop start med komb; run; /* Time vector */ proc sort data=newData; by &Time; data Time (keep=&Time); set newData; %do i=1 %to &nStrata %by 1; if &Time=lag(&Time) then delete; %end; /* Strata vector */ proc sort data=newData; by &Strata &Time; data temp1; set newData; by &Strata; retain stratum 0; stratum+first.&Strata; /* A=sum(A_1,...,A_nStrata) */ %do i=1 %to &nStrata %by 1; data data&i; set temp1; if stratum=&i; data data&i (keep = &Time A&i); merge data&i Time; by &Time; retain Surv&i; if not (&Surv=.) then Surv&i=&Surv; A&i=-log(Surv&i); %end; data A_and_S; A=0; %do i=1 %to &nStrata %by 1; merge data&i; by &Time; A+A&i; %end; dA=A-lag(A); if dA eq . then dA=0; retain S 1; S+S*(1-dA)-S; lagS=lag(S); run; /* Output */ data temp2 (keep = &Strata &Time); set temp1; proc sort data=temp2; by &Time; data temp3; merge temp2 A_and_S; by &Time; proc sort data=temp3; by &Strata &Time; data data0 (keep = &Time p stratum); set temp3; by &Strata; * lagS=lag(S); if first.&Strata then do; lagS=1; end; retain stratum 0; stratum+first.&Strata; %do i=1 %to &nStrata %by 1; lagA&i=lag(A&i); if ((stratum eq &i) and (first.&Strata)) then lagA&i=0; if (stratum ne &i) then lagA&i=0; l&i=(stratum=&i)*(lagS*(A&i-lagA&i)); retain p&i 0; p&i+l&i; if (stratum ne &i) then p&i=0; %end; p=0; %do i=1 %to &nStrata %by 1; p=p+p&i; %end; run; /* put data into the right form */ %do i=1 %to &nStrata; data data&i; set data0; if (stratum eq &i); p0&i=p; drop p stratum; proc sort data=data&i; by &Time; %end; data data; set data1; %do i=1 %to &nStrata; data data; merge data data&i; by &Time; %end; /* ... and complete the p's */ proc sort data=data; by &Time; data data; set data end=last; by &Time; n=_N_; if last then call symput('nobs',n); drop n; data data; set data; %do i=1 %to &nStrata; %do j=1 %to &nobs; dummy=lag(p0&i); if (p0&i eq .) then p0&i=dummy; %end; %end; drop dummy; p00=1; %do i=1 %to &nStrata; p00=p00-p0&i; %end; %mend CumInc;