*! version 1.0.5 * nproc calls individual sub-programs to save sensitivity/specificity * for graphs, calculate auc, calculate se, calculate cov and * chi2 + p-value. * Statistical program by Phillip Price, graphs & interface by * Fred Wolfe 12 Feb 1997 program define nproc version 4.0 local varlist "req ex" local options "FIle(string) BY(string) pause noGraph *" parse "`*'" parse "`varlist'", parse(" ") if "`by'"==""{ di in red "You must specify the Grouping variable" exit 198 } if length("`file'") > 7{ di in red "File is longer than 7 characters" exit 198 } if `by' ~= int(`by'){ di in red "Grouping variable is not integer" exit } if "`file'"==""{ local file="nosave" } if "`file'" == "nosave" & "`graph'" ~= "nograph"{ di in red "Default graph option requires file " _c di in red "(fname) for sensistivity/specificity data" exit 198 } else {global rocfile = "`file'" } display _newline "Nonparametric Receiver Operating Curves (ROC)" global counter = 0 while "`1'" ~= ""{ qui corr `1' `by' if _result(4) < 0{ replace `1' = `1' * -1 } global counter = $counter + 1 global Sroc_v$counter `1' rocauc `1',by(`by') `pause' if "`graph'"!="nograph"{ rocplot `1',by(`by') file(`file') `pause' } rocse `1',by(`by') `pause' auc(${Sroc$counter}) if $counter > 1{ #delimit ; roccov "$Sroc_v1" "${Sroc_v$counter}", by(`by') auc1($Sroc1) auc2(${Sroc$counter}); local A = ($Sroc1 - ${Sroc$counter}) * ($Sroc1 - ${Sroc$counter}); local S = ((($Sroc_se1)^2) + ((${Sroc_se$counter})^2)) -(2 * ${Scov1_$counter}); #delimit cr global Sroc_T$counter = `A' *(1/`S') local shchi2: display %9.2f ${Sroc_T$counter} local shchi2 = trim("`shchi2'") local p = chiprob(1,${Sroc_T$counter}) local shpval: display %9.3f `p' local shpval = trim("`shpval'") display in green "Chisq statistic for the difference " _continue display in green "in AUCs = " in yellow `shchi2' ", p=" `shpval' global Sroc_p$counter = chiprob(1,${Sroc_T$counter}) } mac shift } if "`graph'" ~="nograph"{ savefile `by' } /* clear global macros */ macro drop Sroc* macro drop Scov* macro drop rocfile macro drop Scounter end program define savefile version 4.0 local varlist "req ex" local options parse "`*'" parse "`varlist'", parse(" ") qui{ preserve clear set obs 2 gen neutral = 1 gen spec = 0 replace neutral = 0 in 1 replace spec = 1 in 1 local num = 0 while `num' < $counter{ local num = `num' + 1 append using ${rocfile}`num' } drop if spec ==. sort spec gen x = 1-spec gen str8 vname = "" gen str8 byvar = "" gen auc = . gen se = . gen chi2 = . gen pvalue = . local k = 0 while `k' < $counter{ local k = `k' + 1 replace vname = "${Sroc_v`k'}" in `k' replace byvar = "`1'" in `k' replace auc = ${Sroc`k'} in `k' replace se = ${Sroc_se`k'} in `k' if `k' > 1{ replace chi2 = ${Sroc_T`k'} in `k' replace pvalue = ${Sroc_p`k'} in `k' } } save $rocfile, replace /* erase intermediate rocfiles */ local num = 0 while `num' < $counter{ local num = `num' + 1 erase ${rocfile}`num'.dta } } end