📄 ltable.ado
字号:
*! version 2.8.2 02mar2005
program define ltable, sortpreserve
version 6, missing
if _caller() < 8 {
ltable_7 `0'
exit
}
local baopts /*
*/ noAdjust BY(varname) noCONF /*
*/ Failure Hazard Intervals(string) /*
*/ Level(integer $S_level) /*
*/ SUrvival noTAble Test TVid(varname)
if _caller() >= 8.2 {
local baopts `baopts' SAVing(string asis)
}
local gropts Graph OVerlay *
syntax varlist(min=1 max=2) [fw] [if] [in] [, `baopts' `gropts' ]
if "`graph'`overlay'" == "" {
cap noi syntax varlist(min=1 max=2) [fw] [if] [in] [, `baopts']
if _rc {
di in red /*
*/ "(option is invalid or you need to specify graph option, too)"
exit _rc
}
}
else {
if "`overlay'" != "" {
local graph graph
if "`by'" == "" {
di as err ///
"option overlay may not be specified without the by() option"
exit 198
}
}
if "`hazard'"!="" {
di as err "graph not allowed with hazard"
di as err "use sts graph to graph hazard estimates"
exit 198
}
_get_gropts , graphopts(`options') ///
gettwoway ///
getallowed(CIOPts plot addplot)
local myopts `"`s(graphopts)'"'
local twopts `"`s(twowayopts)'"'
local ciopts `"`s(ciopts)'"'
local plot `"`s(plot)'"'
local addplot `"`s(addplot)'"'
_check4gropts ciopts, opt(`ciopts')
if `"`overlay'"' == "" & `"`by'"' != "" & `"`plot'"' != "" {
di as err ///
"options by() and plot() may not be combined"
exit 198
}
if `"`overlay'"' == "" & `"`by'"' != "" & `"`addplot'"' != "" {
di as err ///
"options by() and addplot() may not be combined"
exit 198
}
}
CheckSaving `saving'
local baopts
local gropts
tempvar touse
mark `touse' `if' `in' [`weight'`exp']
markout `touse' `by', strok
tokenize `varlist'
qui count if `touse'
if r(N)==0 {
error 2000
}
if `"`hazard'"'=="" & `"`failure'"'=="" {
local surviva "survival"
}
if `"`graph'"'!="" {
local type `hazard' `surviva' `failure'
if 0`:word count `type''>1 {
di in red "options `type' cannot be combined"
exit 198
}
}
if `level'<10 | `level'>99 {
local level 95
}
tempvar Group I0 I1 dI Total tt td dead lost start atrisk fail
tempvar F seF loF upF S loS upS H seH loH upH
tempvar sv1 st ss
tempvar Imid sellS
local t `1'
if `"`2'"'=="" {
tempvar d
quietly gen byte `d'=1
}
else local d `2'
if `"`exp'"'!="" {
tempvar wgt
gen long `wgt' `exp'
local wvar `wgt'
}
else local wgt 1
preserve
quietly {
keep if `touse'
drop if `wgt'<=0
drop if `t'>=.
capture assert `t'>=0
if _rc {
noi di in red "time variable has negative values"
exit 411
}
if `"`tvid'"'!="" {
sort `tvid' `t' `d'
by `tvid': keep if _n==_N
}
count if `d'>=.
if r(N) {
noisily di in blu /*
*/ `"(warning: `d' has missing values; "' /*
*/ r(N) " obs not used)"
drop if `d'>=.
}
local g `by'
if `"`g'"'=="" {
gen `Group' = 1
local g `"`Group'"'
}
else {
capture drop if `g'>=.
local byopt by(`g')
}
if _N==0 {
error 2000
}
keep `t' `d' `g' `wvar'
/*
Process intervals or set default intervals
*/
if `"`interva'"'=="" {
local interva 1
}
noisily _crcltab `t' `I0' `I1' `"`interva'"'
sort `g' `I0' `t'
/*-------------------- CALCULATE STATISTICS -------------------------*/
by `g': gen `Total'= sum(`wgt')
by `g': replace `Total'=`Total'[_N]
by `g': gen `tt' = sum(`wgt'*`t')
by `g': gen `td' = sum(`wgt'*(`d'!=0))
by `g' `I0': gen `dead' = sum(`wgt'*(`d'!=0))
by `g' `I0': gen `lost' = sum(`wgt')
by `g' `I0': keep if _n==_N
local gtot=_N
gen `start' = `Total'
drop `Total'
by `g': replace `start' = `start'[_n-1]-`lost'[_n-1] if _n>1
if `"`adjust'"'=="" {
gen double `atrisk' = `start'-(`lost'-`dead')/2
}
else gen double `atrisk' = `start'
gen double `fail' = `dead'/`atrisk'
/* Hazard calculation */
gen `dI' = `I1'-`I0'
if `"`adjust'"'=="" {
gen `H' = 2*`fail'/((2-`fail')*`dI')
gen `seH' = `H'*sqrt((1-(`dI'*`H'/2)^2) /*
*/ / (`atrisk'*`fail'))
}
else {
gen `H' = `fail'/`dI'
gen `seH' = `H'/sqrt(`dead')
}
/* Fail calculation */
gen double `S'=.
by `g': replace `S'=cond(_n==1,1,`S'[_n-1])*(1-`fail')
gen `F' = 1-`S'
by `g': gen `sv1' = sum(`fail'/(`atrisk'-`dead'))
by `g': gen `seF' = `S'*sqrt(`sv1') if `S'!=0
by `g': gen `sellS'= /*
*/ sqrt(sum(`dead'/(`atrisk'*(`atrisk'-`dead'))) / /*
*/ (sum(ln((`atrisk'-`dead')/`atrisk'))^2))
local iz=invnorm(1-(1-`level'/100)/2)
gen `upS' = `S'^exp(-`iz'*`sellS') if `S'!=0
gen `loS' = `S'^exp(`iz'*`sellS') if `S'!=0
*gen `upS' = max(min(`S'+`iz'*`seF',1),0)
*gen `loS' = max(min(`S'-`iz'*`seF',1),0)
gen `upF' = 1-`loS'
gen `loF' = 1-`upS'
* gen `upF' = max(min(`F'+`iz'*`seF',1),0)
* gen `loF' = max(min(`F'-`iz'*`seF',1),0)
if `"`adjust'"'=="" {
gen `upH' = `H'+`iz'*`seH'
gen `loH' = `H'-`iz'*`seH'
}
else {
gen `upH' = (`H'/`dead')*invgammap(`dead',(1+`level'/100)/2)
gen `loH' = (`H'/`dead')*invgammap(`dead',(1-`level'/100)/2)
}
replace `upH'=0 if `upH'<0
replace `loH'=0 if `loH'<0
/*------------------------- GRAPH -----------------------------------*/
if `"`graph'"'!="" {
local tlbl : var label `t'
if `"`tlbl'"'=="" {
local tlbl `"`t'"'
}
label var `I1' `"`tlbl'"'
if `"`failure'"'!="" {
local yttl "Proportion Failed"
label var `F' "`yttl'"
local y `F'
local x `I1'
if `"`conf'"'=="" {
label var `upF' "`level'% CI"
label var `loF' "`level'% CI"
local cigraph ///
(rspike `upF' `loF' `x', ///
sort ///
pstyle(ci) ///
`ciopts' ///
) ///
// blank
}
}
else if `"`surviva'"'!="" {
local yttl "Proportion Surviving"
label var `S' "`yttl'"
local y `S'
local x `I1'
if `"`conf'"'=="" {
label var `upS' "`level'% CI"
label var `loS' "`level'% CI"
local cigraph ///
(rspike `upS' `loS' `x', ///
sort ///
pstyle(ci) ///
`ciopts' ///
) ///
// blank
}
}
else { // dead code
local yttl "Hazard"
label var `H' "`yttl'"
gen `Imid'=(`I0'+`I1')/2
label var `Imid' `"`tlbl'"'
local y `H'
local x `Imid'
if `"`conf'"'=="" {
label var `upH' "`level'% CI"
label var `loH' "`level'% CI"
local cigraph ///
(rspike `upH' `loH' `x', ///
sort ///
pstyle(ci) ///
`ciopts' ///
) ///
// blank
}
}
if `"`plot'`addplot'"' == "" {
local legend legend(nodraw)
}
else {
local 0 , `twopts'
syntax [, noDRAW * ]
local twopts `"`options'"'
local draw nodraw
}
if "`overlay'" == "" {
version 8: graph twoway ///
`cigraph' ///
(connected `y' `x', ///
sort ///
ytitle(`"`yttl'"') ///
pstyle(p1) ///
`legend' ///
`draw' ///
`myopts' ///
) ///
, ///
`twopts' ///
`byopt' ///
// blank
}
else {
tempvar byid bysize
sort `by'
by `by' : gen `byid' = _n==1
by `by' : gen long `bysize' = _N
quietly replace `byid' = sum(`byid')
local nby = `byid'[_N]
local j = 1
forval i = 1/`nby' {
if substr("`:type `by''",1,3) == "str" {
local yvl : display `by'[`j']
}
else {
local yvl : label (`by') `=`by'[`j']'
capture confirm number `yvl'
if !c(rc) {
local yvl `"`by' = `yvl'"'
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -