* Program bootsurvcmac.v4.sas; * Created by Nancy Cook (BWH, HMS, HSPH) ; * Macro to compute reclassification statistics with Bootstrap sampling; * And change in C index for SURVIVAL data; * Includes ALL measures; * RC stat, NRI, contin NRI, IDI and C in SURVIVAL analysis; * Macros BOOTALLS takes overall bootstrap ; * Compares NRI, IDI, C-statistics for 2 models; * Note: bootcmacs has c-stats only; * Note: bootsurvmacs has reclassification only (without c); * Note: Comparison of c-stats can take a long time; * Read in survival macros - Use correct path; %include '/home/swift/nancyc/macros/shared/survival/survmacs.v4.sas' ; %include '/home/swift/nancyc/macros/shared/survival/survcmacs.v3.sas' ; /************************** * Example code to include at end to run and save results in file; * Unweighted bootstrap; %bootalls(data,1,100,outxy,pyrs,10,pdx,pdxy,4,0.05,0.10,0.20,seed=873); run; * To save in files; data out.rcbootb; set rcbootb; by strat; data out.nribootb; set nribootb; by strat; data out.contbootb; set contbootb; by strat; data out.idibootb; set idibootb; by strat; data out.cboot1b; set cboot1b; by strat; data out.cboot2b; set cboot2b; by strat; * delete to stop appending if run again; proc datasets; delete rcbootb nribootb contbootb idibootb cboot1b cboot2b; run; ***************************/ *********************************************************************************************; %macro BOOTALLS(DSNAME,DETAIL,NBOOT,EVENT,PYRS,T,PROB1,PROB2, NCAT,C1,C2,C3,C4,C5,C6,C7,C8,C9,SEED=0); * Macro to compute RC statistic and NRI in bootstrap samples; * And save results in file; * Bootstrap of overall sample - revise if stratify; * Variables: * DSNAME = dataset name; * DETAIL = 2 for detailed printout, 1 for limited, 0 for none; * Applies to print out - 0 or >0 only (1 or 2); * Individual results for reclass not printed; * NBOOT = number of bootstrap samples; * EVENT = outcome variable (coded 0,1); * PYS = follow-up time; * T = time of predicted risk (eg., 10 years) = scalar; * PROB1 = probability for model 1; * PROB2 = probability for model 2; * NCAT = number of categories in classification; * C1-C9 = category cutpoints (should have ncat-1 cutpoints); %put SEED= &seed ; %let nstrat=1; * note: leaving nstrat and istrat in although not used here (placeholder); data _one_; set &DSNAME end=eof; * set id to obs number; id=_n_; run; * Run programs in original data; %surv_reclass(_one_,&DETAIL,&EVENT,&PYRS,&T,&PROB1,&PROB2,&NCAT,&C1,&C2,&C3,&C4,&C5,&C6,&C7,&C8,&C9); data reclassdat; set calstatsb; strat=1; run; %surv_nri(_one_,&DETAIL,&EVENT,&PYRS,&T,&PROB1,&PROB2,&NCAT,&C1,&C2,&C3,&C4,&C5,&C6,&C7,&C8,&C9); data nridat; set _all_; strat=1; run; %surv_contnri(_one_,&DETAIL,&EVENT,&PYRS,&T,&PROB1,&PROB2); data contnridat; set _all_; strat=1; run; %surv_idi(_one_,&DETAIL,&EVENT,&PYRS,&T,&PROB1,&PROB2); data ididat; set _idi_; strat=1; run; * Compute c-index with Noether CI in original data; %predc(_one_,&DETAIL,id,&EVENT,&PYRS,&PROB1); data cdat1; set _calc_; strat=1; run; %predc(_one_,&DETAIL,id,&EVENT,&PYRS,&PROB2); data cdat2; set _calc_; strat=1; run; options nonotes; %do istrat= 1 %to &nstrat; %do iiter= 1 %to &nboot; %let seed=%eval(&seed+1); proc surveyselect method=urs data=_one_ out=boot rate=1 seed=&seed outhits noprint; * Reclass calibration with NCAT categories; %surv_reclass(boot,0,&EVENT,&PYRS,&T,&PROB1,&PROB2,&NCAT,&C1,&C2,&C3,&C4,&C5,&C6,&C7,&C8,&C9); data calstatsb; set calstatsb; strat=&istrat; iter=&iiter; if .0 %then %do; * Output parameter and sample stats ; * proc print data=rcbootb; * by strat; title2 "Bootstrap Survival Reclassification Calibration Statistics for &NCAT Categories"; proc means n mean stddev median p5 p95 min max data=rcbootb; by strat; * format strat stratf.; run; * proc print data=nribootb; * by strat; title2 "Bootstrap Survival NRI Statistics for &NCAT Categories"; proc means n mean stddev median p5 p95 min max data=nribootb; by strat; * format strat stratf.; run; * Compute CI and p for NRI; proc univariate data=nribootb noprint; by strat; var nri ri_case ri_contr; output out=nridist mean=avenri averi_case averi_contr std=sdnri sdri_case sdri_contr pctlpts=2.5 5 10 50 90 95 97.5 pctlpre=nri_q ricase_q ricontr_q; run; data nristats; merge nridat nridist; by strat; znri=nri/sdnri; pnri=2*(1-probnorm(abs(znri))); zri_case=ri_case/sdri_case; pri_case=2*(1-probnorm(abs(zri_case))); zri_contr=ri_contr/sdri_contr; pri_contr=2*(1-probnorm(abs(zri_contr))); run; proc print data=nristats; title2 "NRI Bootstrap Statistics and Confidence Interval"; title3 "Note: P-value assumes normality, CI based on &NBOOT bootstrap samples"; var nri sdnri pnri nri_q2_5 nri_q97_5 ri_case sdri_case pri_case ricase_q2_5 ricase_q97_5 ri_contr sdri_contr pri_contr ricontr_q2_5 ricontr_q97_5 ; run; * proc print data=contbootb; * by strat; title2 "Bootstrap Survival NRI Statistics for Infinite Categories (Continuous NRI)"; proc means n mean stddev median p5 p95 min max data=contbootb; by strat; * format strat stratf.; run; proc univariate data=contbootb noprint; by strat; var nri ri_case ri_contr; output out=contnridist mean=avenri averi_case averi_contr std=sdnri sdri_case sdri_contr pctlpts=2.5 5 10 50 90 95 97.5 pctlpre=nriq ri_caseq ri_contrq; run; data contnristats; merge contnridat contnridist; by strat; znri=nri/sdnri; pnri=2*(1-probnorm(abs(znri))); zri_case=ri_case/sdri_case; pri_case=2*(1-probnorm(abs(zri_case))); zri_contr=ri_contr/sdri_contr; pri_contr=2*(1-probnorm(abs(zri_contr))); run; proc print data=contnristats; title2 "Continuous NRI Bootstrap Statistics and Confidence Interval"; title3 "Note: P-value assumes normality, CI based on &NBOOT bootstrap samples"; var nri sdnri pnri nriq2_5 nriq97_5 ri_case sdri_case pri_case ri_caseq2_5 ri_caseq97_5 ri_contr sdri_contr pri_contr ri_contrq2_5 ri_contrq97_5 ; run; * proc print data=idibootb; * by strat; title2 "Bootstrap Survival IDI Statistics"; proc means n mean stddev median p5 p95 min max data=idibootb; by strat; * format strat stratf.; run; proc univariate data=idibootb noprint; by strat; var idi rel_idi; output out=ididist mean=aveidi averel_idi std=sdidi sdrel_idi pctlpts=2.5 5 10 50 90 95 97.5 pctlpre=idiq rel_idiq; run; data idistats; merge ididat ididist; by strat; zidi=idi/sdidi; pidi=2*(1-probnorm(abs(zidi))); zrel_idi=rel_idi/sdrel_idi; prel_idi=2*(1-probnorm(abs(zrel_idi))); run; proc print data=idistats; title2 "IDI Bootstrap Statistics and Confidence Interval"; title3 "Note: P-value assumes normality, CI based on &NBOOT bootstrap samples"; var idi sdidi pidi idiq2_5 idiq97_5 rel_idi sdrel_idi prel_idi rel_idiq2_5 rel_idiq97_5 ; run; * proc print data=cboot1b; * by strat; title2 "Bootstrap Survival C Statistics for &PROB1"; proc means n mean stddev median p5 p95 min max data=cboot1b; by strat; * format strat stratf.; run; title2 "Bootstrap Survival C Statistics for &PROB2"; proc means n mean stddev median p5 p95 min max data=cboot2b; by strat; * format strat stratf.; run; data testc; merge cboot1b (keep=c_index strat rename=(c_index=c1)) cboot2b (keep=c_index strat rename=(c_index=c2)); by strat; diffc=c2-c1; keep strat c1 c2 diffc; run; proc univariate data=testc noprint; by strat; var c1 c2 diffc; output out=cdist mean=avec1 avec2 avediffc std=sdc1 sdc2 sddiffc pctlpts=2.5 5 10 50 90 95 97.5 pctlpre=c1q c2q diffq t=tc1 tc2 tdiffc probt=pt1 pt2 ptdiffc signrank=sr1 sr2 srankdiffc probs=psr1 psr2 psrdiffc msign=sign1 sign2 signdiffc probm=pm1 pm2 psigndiffc ; run; data cstats; merge cdat1(rename=(c_index=c_index1)) cdat2(rename=(c_index=c_index2)) cdist; by strat; zcind1=c_index1/sdc1; pcind1=2*(1-probnorm(abs(zcind1))); zcind2=c_index2/sdc2; pcind2=2*(1-probnorm(abs(zcind2))); c_diff=c_index2-c_index1; zdiffc=c_diff/sddiffc; pdiff=2*(1-probnorm(abs(zdiffc))); run; proc print data=cstats; by strat; title2 "C-Index Bootstrap Statistics and Confidence Interval for &PROB1 and &PROB2 "; title3 "P-values for T, Signed Rank, and Sign Test Based on &NBOOT bootstrap samples"; var c_index1 sdc1 pcind1 c1q2_5 c1q97_5 c_index2 sdc2 pcind2 c2q2_5 c2q97_5 c_diff sddiffc pdiff diffq2_5 diffq97_5 avediffc sddiffc ptdiffc srankdiffc psrdiffc signdiffc psigndiffc ; run; %end; %mend bootalls; *********************************************************************************************;