I had the chance to make a usermethod yesterday for Stata's power command.
This is to compare two diagnostic's AUCs. The program creates binormal data for each diagnostic measure for the given AUCs, and then uses Stata's roccomp command to test the difference in AUCs. Power is computed over many data sets. For example,
power roc, iter(500) alpha(0.05) n(80(20)140) kappa(0.5 1.0) ///
auc1(.9) auc2(.75) rhoc(.6) rhod(.6)
Computes power over 500 datasets comparing a diagnostic with an AUC of .9 to and AUC or .75, assuming a correlation between diagnostics of .6 between both cases and controls. kappa is the ratio of controls to cases. rhoc and rhod are the correlations between diagnostics within control or disease.
The first code is saved to power_cmd_roc.ado and the second code is saved to power_cmc_roc_init.ado. Both are then put in your Stata personal directory or where Stata can find them.
This is to compare two diagnostic's AUCs. The program creates binormal data for each diagnostic measure for the given AUCs, and then uses Stata's roccomp command to test the difference in AUCs. Power is computed over many data sets. For example,
power roc, iter(500) alpha(0.05) n(80(20)140) kappa(0.5 1.0) ///
auc1(.9) auc2(.75) rhoc(.6) rhod(.6)
Computes power over 500 datasets comparing a diagnostic with an AUC of .9 to and AUC or .75, assuming a correlation between diagnostics of .6 between both cases and controls. kappa is the ratio of controls to cases. rhoc and rhod are the correlations between diagnostics within control or disease.
The first code is saved to power_cmd_roc.ado and the second code is saved to power_cmc_roc_init.ado. Both are then put in your Stata personal directory or where Stata can find them.
Code:
// evaluator
program power_cmd_roc, rclass
version 15.1
syntax, n(integer) /// controls
kappa(real) /// control/disease
rhoc(real) ///
rhod(real) ///
auc1(real) ///
auc2(real) ///
alpha(real) ///
iter(integer)
quietly {
local nd = floor(`n'/(`kappa'+1))
local nc = floor(`n' - `nd')
matrix C1 = (1, `rhoc' \ `rhoc', 1)
matrix C2 = (1, `rhod' \ `rhod', 1)
local diag1_mu = invnorm(`auc1')*sqrt(2)
local diag2_mu = invnorm(`auc2')*sqrt(2)
tempname memhold
tempfile results control
postfile `memhold' pvalue using "`results'"
foreach i of numlist 1/`iter' {
// make control data for diag1 and diag2
clear
drawnorm diag1 diag2, n(`nc') corr(C1) means(0 0) sds(1 1)
generate refclass = 0
save "`control'", replace
// make disease data for diag1 and diag2
clear
drawnorm diag1 diag2, n(`nd') corr(C2) ///
means(`diag1_mu' `diag2_mu') sds(1 1)
generate refclass = 1
// append control and disease data
append using "`control'"
// compare ROC AUCs for diag1 and diag2
roccomp refclass diag1 diag2
local p = r(p)
post `memhold' (`p')
}
postclose `memhold'
use "`results'", clear
generate significant = pvalue < `alpha'
summarize significant, meanonly
tempname power
scalar `power' = r(mean)
}
return scalar alpha = `alpha'
return scalar power = `power'
return scalar N = `n'
return scalar kappa = `kappa'
return scalar nc = `nc'
return scalar nd = `nd'
return scalar auc1 = `auc1'
return scalar auc2 = `auc2'
return scalar rhoc = `rhoc'
return scalar rhod = `rhod'
end
Code:
// initializer
program power_cmd_roc_init, sclass
version 15.1
sreturn clear
sreturn local pss_numopts "kappa"
sreturn local pss_colnames "kappa nc nd"
end

Comment