*! Menu for specifying effects *! Michael Hills 1/5/2002 *! version 3.0.0 program define effmenu1 version 7.0 syntax [varlist] [if] [in] [,CLEAR Display] if "`clear'" == "clear" { macro drop EF* macro drop ef* } /* sets defaults */ global ef_opt "" if "" == "$ef_lev" { global ef_lev=$S_level} if "" == "$ef_bas" { global ef_bas 1} if "" == "$ef_peru" { global ef_peru 1} if "" == "$ef_pery" { global ef_pery 1000} if "" == "$ef_perc" {global ef_perc 100} if "" == "$ef_ver" { global ef_ver 0} /* Sets all variables to categorical as default */ tokenize "`varlist'" while "`1'" != "" { char `1'[type] "categorical" mac shift } global EF_var "`varlist'" global EF_typ "binary metric failure count" cap window control, clear /* response variable */ global EF_out1 "Select response" global EF_out2 "variable" window control static EF_out1 5 5 70 9 window control static EF_out2 5 12 70 9 window control ssimple EF_var 5 22 50 80 ef_res /* type of response */ global EF_out3 "Select type of" global EF_out4 "response" window control static EF_out3 65 5 50 9 window control static EF_out4 65 12 50 9 window control ssimple EF_typ 65 22 50 80 ef_typ /* Follow-up time */ global EF_fup1 "Select follow-up time" global EF_fup2 "if appropriate" window control static EF_fup1 125 5 80 9 window control static EF_fup2 125 12 80 9 window control ssimple EF_var 125 22 50 80 ef_fup /* matched cc */ global EF_mcc1 "Matched case-control" global EF_mcc2 "study?" window control static EF_mcc1 195 5 80 9 window control static EF_mcc2 195 12 20 9 window control check " " 225 12 10 9 ef_mcc global EF_mcc3 "Select matched" global EF_mcc4 "set variable" window control static EF_mcc3 195 30 80 9 window control static EF_mcc4 195 37 80 9 window control ssimple EF_var 195 45 50 60 ef_mvar /* explanatory variable */ global EF_exp1 "Select exposure" window control static EF_exp1 5 122 80 9 window control ssimple EF_var 5 132 50 80 ef_exp /* modifying variable */ global EF_mod1 "Select modifier" window control static EF_mod1 75 122 80 9 window control ssimple EF_var 75 132 50 80 ef_mod /* categorical variables */ window control check "Is exposure metric?" 145 155 80 10 ef_exm window control check "Is modifier metric?" 145 175 80 10 ef_mom /* exit buttons */ global EF_exit "exit 3000" global EF_eff "exit 3003" window control button "Exit" 200 200 40 10 EF_exit window control button "Effects" 140 200 40 10 EF_eff cap window dialog "Variable attributes" . . 270 230 if _rc==3000 { exit } if $ef_exm==1 { char $ef_exp[type] "metric" } if $ef_mom==1 { if "$ef_mod" == "" { di as error "No modifier specified, but metric box checked" exit } else { char $ef_mod[type] "metric" } } /* basic error checking */ global ef_exp = ltrim("$ef_exp") global ef_mod = ltrim("$ef_mod") global ef_res = ltrim("$ef_res") if "$ef_res"=="" { di as error "No response variable has been specified" exit } else { cap confirm numeric variable $ef_res if _rc==7 { di as error "Response variable must be numeric" exit } } if "$ef_typ" == "" { di as error "Type of response variable must be selected" exit } if "$ef_exp"=="" { di as error "Explanatory variable must be specified" exit } else { cap confirm numeric variable $ef_exp if _rc==7 { di as error "Exposure variable must be numeric" exit } } if "$ef_res"=="$ef_exp" { di as error "Variable occurs as both response and main explanatory" exit } if "$ef_res"=="$ef_mod" { di as error "Variable occurs as both response and modifier" exit } if "$ef_mod"=="$ef_exp" { di as error "Variable occurs as both main explanatory and modifier" exit } if "$ef_mod" != "" { cap confirm numeric variable $ef_mod if _rc==7 { di as error "Modifier variable must be numeric" exit } } if "$ef_typ"=="binary" { cap assert $ef_res ==0 | $ef_res ==1 | $ef_res==. if _rc==9 { di in red "Binary response must be coded 0/1" exit } } if "$ef_typ"=="binary" | "$ef_typ"=="metric" { cap assert "$ef_fup"=="" if _rc==9 { di in red "Cannot have follow-up time with binary or metric response" exit } } if "$ef_typ"=="failure" { cap assert $ef_res ==0 | $ef_res ==1 | $ef_res==. if _rc==9 { di in red "Failure response must be coded 0/1" exit } } if "$ef_typ"=="failure" | "$ef_typ"=="count" { cap assert "$ef_fup" != "" if _rc==9 { di in red "Failure and count responses must have follow-up time" exit } } qui inspect $ef_exp if r(N_unique)>15 & "`$ef_exp[type]'"!="metric" { display as error" More than 15 values for exposure ($ef_exp)" display as text "Should it be declared as metric?" exit } if "$ef_mod" != "" { qui inspect $ef_mod if r(N_unique)>15 & "`$ef_mod[type]'"!="metric" { display as error " More than 15 values for modifier ($ef_mod)" di as text "Should it be declared as metric?" exit } } /* effects */ if "$ef_sca" == "" { if "$ef_typ" == "metric" { global ef_sca 1 } if "$ef_typ" == "binary" { global ef_sca 3 } if "$ef_typ" == "failure" | "$ef_typ" == "count" { global ef_sca 2 } } global EF_eff1 "Effects on response ($ef_res)" window control static EF_eff1 10 20 120 10 if $ef_mcc == 1 { global EF_eff2 "Measured as odds ratios" window control static EF_eff2 10 40 120 10 } if "$ef_typ"=="metric"{ window control radbegin "Difference in means" 10 35 100 10 ef_sca window control radend "Ratio of means" 10 55 100 10 ef_sca } if "$ef_typ"=="binary" & $ef_mcc != 1 { window control radbegin "Differences in proportions" 10 35 100 10 ef_sca window contro radio "Ratios of proportions" 10 55 100 10 ef_sca window control radend "Odds ratios" 10 75 100 10 ef_sca global EF_perc "Per" window control static EF_perc 20 45 20 10 window control edit 40 45 30 10 ef_perc } if "$ef_typ"=="binary" & $ef_mcc == 1 { global ef_sca 4 } if "$ef_typ"=="failure" | "$ef_typ"=="count" { window control radbegin "Rate differences" 10 35 100 10 ef_sca window control radend "Rate ratios" 10 75 100 10 ef_sca global EF_pery "Per" window control static EF_pery 20 50 20 10 window control edit 40 50 30 10 ef_pery } /* Control variables */ global EF_con "Select control variables" window control static EF_con 115 20 80 7 window control msimple EF_var 115 27 80 80 ef_con /* Modifier variables */ global EF_mod "Declare metric control variables" window control static EF_mod 210 20 100 7 window control msimple EF_var 210 27 80 80 ef_met /* baseline */ if "`$ef_exp[type]'" == "categorical" { global EF_bas "Baseline" window control static EF_bas 80 120 40 7 window control edit 80 130 15 10 ef_bas } /* per unit for metric exposure */ if "`$ef_exp[type]'" == "metric" { global EF_peru "Per unit" window control static EF_peru 90 120 40 7 window control edit 90 130 20 10 ef_peru } /* showat */ if "`$ef_mod[type]'" == "metric" { global EF_sho "Showat" window control static EF_sho 90 145 40 7 window control edit 90 155 60 10 ef_sho } /* displays exposure and modifier type */ if "$ef_exp" != "" { if "`$ef_exp[type]'" == "categorical" { global EF_exptype "is categorical" } if "`$ef_exp[type]'" == "metric" { global EF_exptype " is metric" } } if "$ef_mod" != "" { if "`$ef_mod[type]'" == "categorical" { global EF_modtype "is categorical" global ef_sho } if "`$ef_mod[type]'" == "metric" { global EF_modtype "is metric" } } global EF_type1 "Explanatory ($ef_exp)" global EF_type2 "Modifier ($ef_mod)" window control static EF_type1 10 120 70 9 window control static EF_exptype 10 130 70 9 if "$ef_mod" != "" { window control static EF_type2 10 145 70 9 window control static EF_modtype 10 155 70 9 } global EF_lev "Level of confidence" window control static EF_lev 130 120 80 10 window control edit 130 130 15 10 ef_lev /* verbose */ window control check "More detailed output" 10 180 100 10 ef_ver /* exit buttons */ global EF_ok "exit 3001" global EF_exit "exit 3000" window control button "OK" 120 180 40 10 EF_ok window control button "Exit " 180 180 40 10 EF_exit cap window dialog "Choosing how to measure the effects" 10 10 340 210 dis "" qui inspect $ef_exp if $ef_bas == 0 | $ef_bas > r(N_unique) { di as error "Baseline out of range" exit } if "$ef_con"!="" { tokenize "$ef_con" while "`1'" != "" { if "`1'" == "$ef_mod" { di as error "Cannot include variable as both modifier and control" exit } mac shift } } if _rc==3000 { exit } tokenize "$ef_met" while "`1'" != "" { char `1'[type] "metric" mac shift } if _rc==3001 { if "`display'"=="display" { local effmenu2 "effmenu2 `if' `in', res($ef_res) typ($ef_typ) exp($ef_exp)" if "$ef_typ"=="metric" { if $ef_sca==1 {local effmenu2 "`effmenu2' effects(md)"} if $ef_sca==2 {local effmenu2 "`effmenu2' effects(mr)"} } if "$ef_typ"=="binary" { if $ef_sca==1 {local effmenu2 "`effmenu2' effects(pd)"} if $ef_sca==2 {local effmenu2 "`effmenu2' effects(pr)"} if $ef_sca==3 {local effmenu2 "`effmenu2' effects(or)"} } if "$ef_typ"=="failure" { if $ef_sca==1 {local effmenu2 "`effmenu2' effects(rd)"} if $ef_sca==2 {local effmenu2 "`effmenu2' effects(rr)"} } if "$ef_mod"!="" {local effmenu2 "`effmenu2' mod($ef_mod)"} if "$ef_fup"!="" {local effmenu2 "`effmenu2' fup($ef_fup)"} if $ef_perc!=100 {local effmenu2 "`effmenu2' perc($ef_perc)"} if $ef_pery!=1000 {local effmenu2 "`effmenu2' pery($ef_pery)"} if $ef_peru!=1 & $ef_exm==1 {local effmenu2 "`effmenu2' peru($ef_peru)"} if $ef_lev!=95 {local effmenu2 "`effmenu2' level($ef_lev)"} if $ef_bas!=1&$ef_exm==0 {local effmenu2 "`effmenu2' base($ef_bas)"} if $ef_exm==1 {local effmenu2 "`effmenu2' exm"} if $ef_mom==1 {local effmenu2 "`effmenu2' mom"} if $ef_mcc==1 {local effmenu2 "`effmenu2' mcc mvar($ef_mvar)"} if "$ef_sho"!="" {local effmenu2 "`effmenu2' showat($ef_sho)"} if "$ef_con"!="" {local effmenu2 "`effmenu2' con($ef_con)"} if "$ef_met"!="" {local effmenu2 "`effmenu2' met($ef_met)"} if $ef_ver==1 {local effmenu2 "`effmenu2' ver"} di di as res "`effmenu2'" di } effects1 `if' `in' , level($ef_lev) } end