*! v.1.0.0 - 23sept2014 *! N.Orsini, A.Discacciati capture program drop stqkm program stqkm, eclass version 10 local cmdline : copy local 0 syntax [varlist(default=none)] [if] [in] [ , /// Reps(integer -1) /// MINReps(integer -1) /// undocumented Level(integer $S_level) /// SEED(string) /// Quantiles(numlist) /// WGTv(varlist min=1 max=1) /// undocumented NODOTS /// ] marksample touse, strok novarlist if "`log'"!="" | "`dots'"!="" { local log "*" } // Check if any covariate. If none if "`varlist'" == "" local overall 1 else local overall 0 // Check data st st_is 2 analysis // Check if data is already weighted if "`_dta[st_wv]'" != "" { di in red "weighted data not allowed" exit 198 } // Check bootstrap if `reps' != -1 & `minreps' != -1 { di in red "reps() and minreps() can not be used at the same time" exit 198 } if `reps' == -1 & `minreps' == -1 local reps 20 if (`reps' < 2 & `minreps' == -1) | (`reps' == -1 & `minreps' < 2) { di in red "insufficient bootstrap replications" exit 198 } // Check number of observations quietly count if `touse' if r(N) < 4 { di in red "insufficient observations" exit 2001 } // Get exposure variable name local firstname : word 1 of `varlist' local xname "`varlist'" local ixlist "`varlist'" if regexm("`firstname'","_I") == 1 { local varlab: variable label `firstname' local poseq = strpos("`varlab'","=") local xname = substr("`varlab'",1,`poseq'-1) local ixlist "`varlist'" } else { if `: word count `varlist'' > 1 { di as err "specify just one variable name" exit 198 } if `: word count `varlist'' == 1 { qui tab `varlist' if r(r) > 2 { di as err "`varlist' has more than two levels, use the xi: notation" exit 198 } local xname "`varlist'" } } if `overall' == 1 { tempvar const1 gen `const1' = 1 local xname "`const1'" local ixlist "`xname'" } // Recode exposure as 1,2,3... tempvar expr qui gen `expr' = . local j = 0 qui levelsof `xname', local(exposurel) capture confirm numeric variable `xname' if !_rc { foreach name of local exposurel { qui replace `expr' = `j' if `xname' == `name' local j = `j' + 1 } } else { foreach name of local exposurel { qui replace `expr' = `j' if `xname' == "`name'" local j = `j' + 1 } } // Identify the reference level qui su `xname' local bl = r(min) // More than 2 levels if "`ixlist'" != "" { if "`: char `xname'[omit]'" != "" local bl : char `xname'[omit] } // Check specified quantiles tempname quantlist SetQ `quantiles' local listquant "`r(quants)'" tokenize "`r(quants)'" local nq 1 while "``nq''" != "" { local q`nq' ``nq'' local nq = `nq' + 1 } local nq = `nq' - 1 // Check quantiles and get a list local pow = 10 local done = 0 while !`done' { local pow = `pow'*10 local done = 1 forvalues k=1/`nq' { local q = (`q`k'')*`pow' local done = `done' & /* */ (reldif(`q',trunc(`q')) 1 qui reg `v' `nexp' // basta passare i nomi e non usare i. // Check missing values local names : colfullnames e(b) foreach x of local names { if substr("`x'",1,2)=="o." local missingp = substr("`x'",3,length("`x'")-2) } else qui reg `v' tempname matclean mat `matclean' = e(b) if "`missingp'" != "" mat `matclean'[1, colnumb(`matclean',"`missingp'")] = . if `s' == 1 { mat `_bacc' = `matclean' } else { mat `_bacc' = `_bacc' , `matclean' } local `++s' } if "`missingp'" != "" ereturn scalar mp = 1 else ereturn scalar mp = 0 ereturn matrix _beta = `_bacc' end capture program drop DoStats program define DoStats, rclass /* touse atrisk by */ syntax varlist , percentiles(string) tempvar touse atrisk by tokenize `varlist' qui gen `touse' = `1' qui gen `atrisk' = `2' qui gen `by' = `3' local id : char _dta[st_id] local wv : char _dta[st_wv] tempname tatr m s j0 quietly { if `"`wv'"'==`""' { summ `atrisk' if `touse' scalar `tatr' = r(sum) summ _d if `touse' local fail = r(sum) if `"`id'"'==`""' { count if `touse' local nsubj = r(N) } else { sort `touse' `id' by `touse' `id': /* */ gen byte `m'=1 if _n==1 & `touse' summ `m' local nsubj = r(sum) } } else { tempvar z gen double `z' = `wv'*`atrisk' summ `z' if `touse' scalar `tatr' = r(sum) replace `z' = `wv'*_d summ `z' if `touse' local fail = r(sum) drop `z' if `"`id'"'==`""' { summ `wv' if `touse' local nsubj = r(sum) } else { sort `touse' `id' by `touse' `id': /* */ gen double `z'=`wv' if _n==1 & `touse' summ `z' if `touse' local nsubj = r(sum) } } local ttl `"$S_1"' capture GetS `touse' `s' if _rc==0 { replace `touse' = 0 if `s'>=. sort `touse' _t gen long `j0' = _n if `touse'==0 summ `j0' local j0 = cond(r(max)>=.,1,r(max)+1) foreach k of local percentiles { Findptl `=(100-`k')/100' `s' `j0' local p`k' $S_1 } } else { foreach k of local percentiles { local p`k' . } } } noisily foreach k of local percentiles { ret scalar p`k' = `p`k'' } end capture program drop SetQ program define SetQ /* | # [,] # ... */ , rclass version 6.0 if "`*'"=="" { ret local quants ".5" exit } local orig "`*'" tokenize "`*'", parse(" ,") while "`1'" != "" { FixNumb "`orig'" `1' ret local quants "`return(quants)' `r(q)'" mac shift if "`1'"=="," { mac shift } } end capture program drop FixNumb program define FixNumb /* # */ , rclass version 6.0 local orig "`1'" mac shift capture confirm number `1' if _rc { Invalid "`orig'" "`1' not a number" } if `1' >= 1 { ret local q = `1'/100 } else ret local q `1' if `return(q)'<=0 | `return(q)'>=1 { Invalid "`orig'" "`return(q)' out of range" } end capture program drop Invalid program define Invalid /* "" "" */ version 6.0 di in red "quantiles(`1') invalid" if "`2'" != "" { di in red "`2'" } exit 198 end capture program drop Findptl program define Findptl /* percentile s `j0' */ args p s j0 if `j0'>=. { global S_1 . exit } tempvar j quietly { gen long `j' = _n if float(`s')<=float(`p') in `j0'/l summ `j' in `j0'/l local j=r(min) } local t : char _dta[st_t] global S_1 = _t[`j'] end capture program drop GetS program define GetS /* touse s */ args touse s tempname prior capture { capture estimate hold `prior' stcox if `touse', estimate bases(`s') } local rc=_rc capture estimate unhold `prior' exit `rc' end exit webuse catheter, clear xi: stqkm i.female, q(25 50 75) reps(20)