*! Menu to prepare tables
*! Michael Hills 1/5/2002
*! version 3.0.0

program define tabmenu1
version 7.0
syntax [varlist] [if] [in] [,CLEAR Display]

di

if "`clear'" == "clear" {
    macro drop TA*
    macro drop ta*
}

if "" == "$ta_sca" {global ta_sca 1}
if "" == "$ta_perc" {global ta_perc 100}
if "" == "$ta_pery" {global ta_pery 1000}
if "" == "$ta_mv" {global ta_mv 10}
if "" == "$ta_lev" {global ta_lev $S_level}


global TA_typ "binary metric failure count"
global TA_var "`varlist'"
cap window control, clear

/* response variable */

global TA_out1 "Select response"
global TA_out2 "variable"
window control static TA_out1 5 5  70 9
window control static TA_out2 5 12 70 9
window control ssimple TA_var 5 22 50 80 ta_res

/* type of response */

global TA_out3 "Select type of"
global TA_out4 "response"
window control static TA_out3 65 5  50 9
window control static TA_out4 65 12 50 9
window control ssimple TA_typ 65 22 50 80 ta_typ

/* Follow-up time */

global ta_fup1 "Select follow-up time"
global ta_fup2 "if appropriate"
window control static ta_fup1 125 5  80 9
window control static ta_fup2 125 12 80 9
window control ssimple TA_var 125 22 50 80 ta_fup

/* explanatory variable */

global TA_exp1 "Select explanatory"
global TA_exp2 "variable for rows"
window control static TA_exp1 5 115  80 9
window control static TA_exp2 5 122 80 9
window control ssimple TA_var 5 132 50 80 ta_exp

/* modifying variable */

global TA_mod1 "Select explanatory"
global TA_mod2 "variable for columns"
window control static TA_mod1  75 115  80 9
window control static TA_mod2 75 122 80 9
window control ssimple TA_var  75 132 50 80 ta_mod

/* max values before too many for a table */

global TA_mv1 "Maximum no of values a row"
global TA_mv2 "or column variable can have"
window control edit  155 132 30 10 ta_mv
window control static TA_mv1 155 115 100 9
window control static TA_mv2 155 122 100 9

/* exit buttons */

global TA_exit "exit 3000"
global TA_tab "exit 3002"
window control button "Exit"    200 85 40 10 TA_exit
window control button "Tables"  200 45 40 10 TA_tab

cap window dialog "Variable attributes" . . 260 250

if _rc==3000 {
  exit
}

/* basic error checking */

global ta_exp = ltrim("$ta_exp")
global ta_mod = ltrim("$ta_mod")
global ta_res = ltrim("$ta_res")

if "$ta_res"=="" {
    di as error "No response variable has been specified!"
    exit
}
else {
    cap confirm numeric variable $ta_res
    if _rc==7 {
        di as error "Response variable must be numeric"
        exit
  }
}
if "$ta_typ" == "" {
    di as error "Type of response variable must be selected"
    exit
}
if "$ta_exp"=="" {
    di as error "Explanatory variable must be specified"
    exit
}
if "$ta_res"=="$ta_exp" | "$ta_res"=="$ta_mod" {
    di as error "Variable occurs as both response and explanatory"
    exit
}
if "$ta_mod"=="$ta_exp" {
    di as error "Same variable occurs as both row and column"
    exit
}
qui inspect $ta_exp
if r(N_unique)>$ta_mv {
    di as error "More than $ta_mv values for row variable"
    exit
}
if "$ta_mod" != "" {
    qui inspect $ta_mod
    if r(N_unique)>$ta_mv {
        di as error "More than $ta_mv values for column variable"
        exit
  }
}
if "$ta_typ"=="failure" {
    cap assert $ta_res ==0 | $ta_res ==1 | $ta_res==.
    if _rc==9 {
        di as error "Failure response must be coded 0/1"
        exit
    }
}
if "$ta_typ"=="binary" {
    cap assert $ta_res ==0 | $ta_res ==1 | $ta_res==.
    if _rc==9 {
        di as error "Binary response must be coded 0/1"
        exit
    }
    cap assert "$ta_fup" == ""
    if _rc==9 {
        di as error "Cannot have follow-up time with binary response"
        exit
    }
}
if "$ta_typ"=="failure" | "$ta_typ"=="count"  {
    cap assert "$ta_fup" != ""
    if _rc==9 {
        di as error "Failure and count responses must have follow-up time"
        exit
    }
}


/* second menu */




window control check " Frequencies" 120 35 80 10 ta_fr
window control check " Confidence intervals/IQR" 120 55 100 10 ta_ci
window control check " Reverse rows and cols" 120 95 80 10 ta_rv
global TA_lev "Level of confidence"
window control static TA_lev 140 75 80 10
window control edit  120 75 15 10 ta_lev


if "$ta_typ"=="binary" {
    global TA_sca1 "The response is binary"
    window control static TA_sca1 10  5 80 10
    window control radbegin "Proportion" 10 35 70 10 ta_sca
    window control radend "Odds" 10 55 70 10 ta_sca
    window control edit 80 35 30 10 ta_perc
    global TA_per "per"
    window control static TA_per 65 36 15 10
}
if "$ta_typ"=="metric" {
    global TA_sca3 "The response is metric"
    window control static TA_sca3 10  5 80 10
    window control radbegin "Mean" 10 35 70 10 ta_sca
    window control radio "Geometric mean" 10 55 70 10 ta_sca
    window control radend "Median" 10 75 70 10 ta_sca
}
if "$ta_typ"=="failure" {
    global TA_sca4 "The response is failure"
    window control static TA_sca4 10  5 80 10
    global TA_per "Rates per"
    window control static TA_per 10 35 35 10
    window control edit 70 35 30 10 ta_pery
}
if "$ta_typ"=="count" {
    global TA_sca5 "The response is a count"
    window control static TA_sca5 10  5 80 10
    global TA_per "Rates per"
    window control static TA_per 10 36 40 10
    window control edit 60 35 30 10 ta_pery
    global ta_sca 1
}

global TA_ok "exit 3001"
global TA_exit "exit 3000"
window control button "OK" 10 140 30 10 TA_ok
window control button "Exit" 50 140 30 10 TA_exit

cap window dialog "Choosing the summary" 10 10 220 200

if _rc==3000 {
  exit
}

/* displays tabmenu2 command */

if "`display'"=="display" {
    local tabmenu2 "tabmenu2 `if' `in', res($ta_res) typ($ta_typ) row($ta_exp)"
    if "$ta_mod"!="" {local tabmenu2 "`tabmenu2' col($ta_mod)"}
    if "$ta_fup"!="" {local tabmenu2 "`tabmenu2' fup($ta_fup)"}
    if "$ta_typ"=="metric" {
        if $ta_sca==1 {local tabmenu2 "`tabmenu2' summ(mean)"}
        if $ta_sca==2 {local tabmenu2 "`tabmenu2' summ(gmean)"}
        if $ta_sca==3 {local tabmenu2 "`tabmenu2' summ(median)"}
    }
    if "$ta_typ"=="binary" {
        if $ta_sca==1 {local tabmenu2 "`tabmenu2' summ(prop)"}
        if $ta_sca==2 {local tabmenu2 "`tabmenu2' summ(odds)"}
    }
    if "$ta_typ"=="failure" {local tabmenu2 "`tabmenu2' summ(rate)"}
    if $ta_perc!=100 & $ta_sca==1 & "$ta_typ"!="metric"  {local tabmenu2 "`tabmenu2' perc($ta_perc)"}
    if $ta_pery!=1000 & $ta_sca==1 & "$ta_typ"!="metric"  {local tabmenu2 "`tabmenu2' pery($ta_pery)"}
    if $ta_mv!=10 {local tabmenu2 "`tabmenu2' maxval($ta_mv)"}
    if $ta_fr==1 {local tabmenu2 "`tabmenu2' fr"}
    if $ta_ci==1 {local tabmenu2 "`tabmenu2' ci"}
    if $ta_rv==1 {local tabmenu2 "`tabmenu2' rv"}
    if $ta_lev!=95 {local tabmenu2 "`tabmenu2' level($ta_lev)"}

    di
    di as res "`tabmenu2'"
    di
}

_mhtab `if' `in' , level($ta_lev)

end


program define _mhtab
version 7.0
syntax [if] [in] [,Level(integer $S_level)]
tempvar se hi low ci to odds rate iqr contents touse

marksample touse
markout `touse' $ta_res $ta_exp $ta_mod $ta_fup

preserve

di in gr "Response variable is: " in ye "$ta_res" in gr " which is "in ye "$ta_typ"
if "$ta_fup" != "" {
    di in gr "Follow-up time variable is: " in ye "$ta_fup"
}
di in gr "Row variable is: " in ye "$ta_exp "
if "$ta_mod"!="" {
    di in gr "Column variable is: " in ye "$ta_mod "
}
/*
	Prints number of records used
*/

qui count if `touse'
di as text "Number of records used:    " as result r(N)

if $ta_ci==1 {
    di as res `level' "%" as text " confidence intervals"
}
local mult = invnorm(`level'*0.005+0.5)

* binary

if "$ta_typ"=="binary" {

* proportions

    if  $ta_sca==1 {
        di in gr _n(1) "Summary using" in ye " proportions"    in gr " per " in ye $ta_perc
        qui table $ta_exp $ta_mod if `touse', c(freq mean $ta_res) replace
        qui gen `odds'=table2/(1-table2)
        qui gen `se' = sqrt(1/(table1*table2)+1/(table1*(1-table2)))
        qui gen `low' = `odds'/exp(`mult'* `se')
        qui gen `hi'    = `odds'*exp(`mult'* `se')
        qui replace `low' = $ta_perc*`low'/(1+`low')
        qui replace `hi'    = $ta_perc*`hi'/(1+`hi')
        qui replace table2=$ta_perc*table2
        qui gen str1 `to' = "-"
        egen `ci' = concat(`low' `to' `hi'), punct(" ") format(%7.2f)
        local contents "table2"
        if $ta_fr==1 { local contents "table1 `contents'"}
        if $ta_ci==1 { local contents "`contents' `ci'" }
        label var table2 $ta_res
        label var `ci' "$ta_lev% CI"
        if $ta_rv==1 {tabdisp $ta_mod $ta_exp, cell(`contents') format(%7.2f) cellwidth(20)}
        else { tabdisp $ta_exp $ta_mod, cell(`contents') format(%7.2f) cellwidth(20)}
    }

* odds

    if $ta_sca==2 {
        di in gr    _n(1) "Summary using" in ye " odds"
        qui table $ta_exp $ta_mod if `touse', c(freq mean $ta_res) replace
        qui gen `odds'=table2/(1-table2)
        qui gen `se' = sqrt(1/(table1*table2)+1/(table1*(1-table2)))
        qui gen `low' = `odds'/exp(`mult'* `se')
        qui gen `hi'    = `odds'*exp(`mult'* `se')
        qui replace table2=`odds'
        qui gen str1 `to' = "-"
        egen `ci' = concat(`low' `to' `hi'),    punct(" ") format(%7.4f)
        local contents " table2 "
        if $ta_fr==1 { local contents "table1 `contents'"}
        if $ta_ci==1 { local contents "`contents' `ci'" }
        label var table2 $ta_res
        label var `ci' "$ta_lev% CI"
        if $ta_rv==1 {tabdisp $ta_mod $ta_exp, cell(`contents') format(%7.4f) cellwidth(20)}
        else { tabdisp $ta_exp $ta_mod, cell(`contents') format(%7.4f) cellwidth(20)}
    }
}

* failure or count

if "$ta_typ"=="failure" | "$ta_typ"=="count" {
        di in gr    _n(1) "Summary using" in ye " rates" in gr " per " in ye    $ta_pery
        qui table $ta_exp $ta_mod if `touse', c(freq sum $ta_res sum $ta_fup) replace
        qui gen `rate' = table2/table3*$ta_pery
        qui gen `se' = sqrt(1/table2)
        qui gen `low' = `rate'/exp(`mult'* `se')
        qui gen `hi'    = `rate'*exp(`mult'* `se')
        qui replace table2 = `rate'
        qui gen str1 `to' = "-"
        egen `ci' = concat(`low' `to' `hi'),    punct(" ") format(%7.2f)
        local contents " table2 "
        if $ta_fr==1 { local contents "table1 `contents'"}
        if $ta_ci==1 { local contents "`contents' `ci'" }
        label var table2 $ta_res
        label var `ci' "$ta_lev% CI"
        if $ta_rv==1 {tabdisp $ta_mod $ta_exp, cell(`contents') format(%7.2f) cellwidth(20)}
        else { tabdisp $ta_exp $ta_mod, cell(`contents') format(%7.2f) cellwidth(20)}
}

if "$ta_typ"=="metric" {
    if $ta_sca==1 {
        di in gr    _n(1) "Summary using" in ye " means"
        qui table $ta_exp $ta_mod    if `touse', c(freq mean $ta_res sd $ta_res) replace
        qui gen `se' = table3/sqrt(table1)
        qui gen `low' = table2 - `mult'*`se'
        qui gen `hi' = table2 + `mult'*`se'
        qui gen str1 `to' = "-"
        egen `ci' = concat(`low' `to' `hi'), punct(" ") format(%7.2f)
        local contents " table2 "
        if $ta_fr==1 { local contents "table1 `contents'"}
        if $ta_ci==1 { local contents "`contents' `ci'" }
        label var table2 $ta_res
        label var `ci' "$ta_lev% CI"
        if $ta_rv==1 {tabdisp $ta_mod $ta_exp, cell(`contents') format(%7.2f) cellwidth(20)}
        else { tabdisp $ta_exp $ta_mod, cell(`contents') format(%7.2f) cellwidth(20)}
    }
    if $ta_sca==2 {
        di in gr    _n(1) "Summary using" in ye " geometric means"
        qui assert $ta_res > 0
        qui replace $ta_res=ln($ta_res)
        qui table $ta_exp $ta_mod if `touse', c(freq mean $ta_res sd $ta_res) replace
        qui gen `se' = table3/sqrt(table1)
        qui gen `low' = table2 - `mult'*`se'
        qui gen `hi' = table2 + `mult'*`se'
        qui replace table2=exp(table2)
        qui replace `low'=exp(`low')
        qui replace `hi'=exp(`hi')
        qui gen str1 `to' = "-"
        egen `ci' = concat(`low' `to' `hi'), punct(" ") format(%7.2f)
        local contents " table2 "
        if $ta_fr==1 { local contents "table1 `contents'"}
        if $ta_ci==1 { local contents "`contents' `ci'" }
        label var table2 $ta_res
        label var `ci' "$ta_lev% CI"
        if $ta_rv==1 {tabdisp $ta_mod $ta_exp, cell(`contents') format(%7.2f) cellwidth(20)}
        else { tabdisp $ta_exp $ta_mod, cell(`contents') format(%7.2f) cellwidth(20)}
    }
    if $ta_sca==3 {
        di in gr    _n(1) "Summary using" in ye " medians"
        qui table $ta_exp $ta_mod if `touse', c(freq med $ta_res p25 $ta_res p75 $ta_res) replace
        qui gen `low' = table3
        qui gen `hi' = table4
        gen str1 `to' = "-"
        egen `iqr' = concat(`low' `to' `hi'), punct(" ") format(%7.2f)
        local contents " table2 "
        if $ta_fr==1 { local contents "table1 `contents'"}
        if $ta_ci==1 { local contents "`contents' `iqr'" }
        label var table2 $ta_res
        label var `iqr' "IQR "
        if $ta_rv==1 {tabdisp $ta_mod $ta_exp, cell(`contents') format(%7.2f) cellwidth(20)}
        else { tabdisp $ta_exp $ta_mod, cell(`contents') format(%7.2f) cellwidth(20)}
    }
}

end