📄 sts.ado
字号:
*! version 7.4.3 17mar2005
program define sts, sort
version 6, missing
if _caller() < 8 {
sts_7 `0'
exit
}
local vv : display "version " string(_caller()) ":"
st_is 2 analysis
gettoken cmd : 0, parse(" ,")
if `"`cmd'"'=="," | "`cmd'"=="" {
local cmd graph
}
else gettoken cmd 0 : 0, parse(" ,")
local l = length("`cmd'")
if substr("list",1,`l')==`"`cmd'"' {
List `0'
}
else if substr("graph",1,`l')=="`cmd'" {
Graph `0'
}
else if substr("generate",1,`l')=="`cmd'" {
Gen `0'
}
else if substr("test",1,`l')=="`cmd'" {
Test `0'
}
else if "`cmd'"=="if" | "`cmd'"=="in" {
Graph `cmd' `0'
}
else {
di in red "unknown sts subcommand `cmd'"
exit 198
}
end
program define Test, rclass
local wt : char _dta[st_wt]
if "`wt'"=="pweight" {
local options "Cox"
}
else local options "Logrank Breslow Cox Wilcoxon TWare Peto"
syntax varlist [if] [in] /*
*/ [, `options' BY(string) Detail noSHow TRend /*
*/ Fh(numlist min=2 max=2) * ]
if "`trend'"!="" {
local n: word count `varlist'
if `n'>1 {
di in red "only one grouping variable allowed for trend tests"
di in red "use egen, group() to generate one group variable"
exit 198
}
confirm numeric variable `varlist'
}
if "`by'"!="" {
di in red "by() not allowed"
exit 198
}
local by "by(`varlist')"
local n1 = ("`fh'"!="")+ /*
*/ ("`breslow'"!="")+("`wilcoxo'"!="")+("`tware'"!="")+("`peto'"!="")
if `n1'+("`cox'"!="")+("`logrank'"!="")>1 {
di in red /*
*/ "options logrank, wilcoxon, tware, peto, fh and cox are alternatives"
di in red "they may not be specified together"
exit 198
}
if "`wilcoxo'"!="" {
local cmd "wilc_st"
}
else if "`cox'"!="" | "`wt'"=="pweight" {
if "`trend'"~="" {
di in red "trend not valid with option cox or pweight"
exit 198
}
local cmd "ctst_st"
}
else if "`tware'"~="" {
local cmd "tware_st"
}
else if "`peto'"~="" {
local cmd "peto_st"
}
else if "`fh'"~="" {
local cmd "fh_st"
tokenize `fh'
if `1'<0 | `2'<0 {
noi di in red "p and q must be nonnegative"
exit 198
}
local p="p(`1')"
local q="q(`2')"
}
else local cmd "logrank"
st_show `show'
tempvar touse
st_smpl `touse' `"`if'"' "`in'"
if "`cmd'"=="ctst_st" {
tempname oldest
capture {
capture estimate hold `oldest'
noisily `vv' `cmd' `varlist' if `touse', `options'
ret add
}
local rc = _rc
capture estimate unhold `oldest'
exit `rc'
}
local w : char _dta[st_w]
if `"`_dta[st_id]'"' != "" {
local id `"id(`_dta[st_id]')"'
}
`vv' `cmd' _t _d `w' if `touse', /*
*/ t0(_t0) `id' `by' `options' `detail' `trend' `p' `q'
ret add
if ("`fh'"!="")+("`tware'"!="")+("`peto'"!="")>0 {
ret local by
}
end
/*
gen var=thing [var=thing] ...
*/
program define Gen
local rest `"`0'"'
gettoken varname rest : rest, parse(" =,")
gettoken eqsign rest : rest, parse(" =,")
gettoken thing rest : rest, parse(" =,")
if `"`eqsign'"' != "=" { error 198 }
while `"`eqsign'"' == "=" {
confirm new var `varname'
local thing = lower(`"`thing'"')
if `"`thing'"' == "s" {
local Surv `varname'
}
else if `"`thing'"' == "ns" {
local nSurv "`varname'"
local notcox `"`varname'=`thing'"'
}
else if `"`thing'"'=="se(s)" {
NotPw "se(s)"
local Se "`varname'"
local notcox `"`varname'=`thing'"'
}
else if `"`thing'"'=="h" | `"`thing'"'=="dchaz" {
local Haz "`varname'"
}
else if `"`thing'"'=="se(lls)" {
NotPw "se(lls)"
local sllS "`varname'"
local notcox `"`varname'=`thing'"'
}
else if `"`thing'"'=="ub(s)" | `"`thing'"'=="ub" {
NotPw "ub(s)"
local ub "`varname'"
local notcox `"`varname'=`thing'"'
}
else if `"`thing'"'=="lb(s)" | `"`thing'"'=="lb" {
NotPw "lb(s)"
local lb "`varname'"
local notcox `"`varname'=`thing'"'
}
else if `"`thing'"'=="n" {
local Pop "`varname'"
local notcox `"`varname'=`thing'"'
}
else if `"`thing'"'=="na" | `"`thing'"'=="cumrisk" {
local Aalen "`varname'"
local notcox `"`varname'=`thing'"'
local risk "`thing'"
}
else if `"`thing'"'=="se(na)" {
NotPw "se(na)"
local saalen "`varname'"
local notcox `"`varname'=`thing'"'
}
else if `"`thing'"'=="ub(na)" {
NotPw "ub(na)"
local uba "`varname'"
local notcox `"`varname'=`thing'"'
}
else if `"`thing'"'=="lb(na)" {
NotPw "lb(na)"
local lba "`varname'"
local notcox `"`varname'=`thing'"'
}
else if `"`thing'"'=="d" {
local Die "`varname'"
local notcox `"`varname'==`thing'"'
}
else {
di in red `"`thing' unknown function"'
exit 198
}
local 0 `"`rest'"'
gettoken varname rest : rest, parse(" =,")
gettoken eqsign rest : rest, parse(" =,")
gettoken thing rest : rest, parse(" =,")
}
syntax /* ... */ [if] [in] [, Adjustfor(varlist) BY(varlist) /*
*/ Level(cilevel) noSHow STrata(varlist)]
ByStAdj "`by'" "`strata'" "`adjustf'"
* st_show `show'
if "`adjustf'" != "" {
if "`notcox'" != "" {
di in red "cannot calculate `notcox' with adjustfor()"
exit 198
}
qui DoAdjust "`by'" "`strata'" "`adjustf'" `"`if'"' "`in'" /*
*/ -> "`Haz'" "`Surv'"
if "`Surv'"!="" {
label var `Surv' "S(t+0), adjusted"
}
if "`Haz'"!="" {
label var `Haz' "Delta_H(t), adjusted"
}
exit
}
if "`Pop'"=="" { tempvar Pop }
if "`Die'"=="" { tempvar Die }
tempvar touse mresult
st_smpl `touse' `"`if'"' "`in'" "`by'" ""
preserve
quietly {
keep if `touse'
st_ct "`by'" -> _t `Pop' `Die'
count if `Die'
if r(N) { /* keep all obs if no failures */
keep if `Die'
}
AddSurv "`by'" _t `Pop' `Die' `level' -> /*
*/ "`Haz'" "" "`Surv'" "`Se'" "`sllS'" "`lb'" "`ub'" /*
*/ "`Aalen'" "`saalen'" "`uba'" "`lba'" "`nSurv'"
if "`Haz'" != "" {
qui sum `Haz', meanonly
if r(max)==0 {
qui replace `Haz'=.
}
}
keep `by' _t `Haz' `Surv' `Se' `sllS' `lb' `ub' /*
*/ `Pop' `Die' `Aalen' `saalen' `uba' `lba' `nSurv'
gen byte `touse' = 1
sort `touse' `by' _t
tempfile one
save "`one'"
restore, preserve
sort `touse' `by' _t
merge `touse' `by' _t using "`one'", _merge(`mresult')
keep if `mresult'==1 | `mresult'==3
drop `mresult'
sort `touse' `by' _t
local byp "by `touse' `by':"
if "`Surv'" != "" {
`byp' replace `Surv' = cond(_n==1,1,`Surv'[_n-1]) /*
*/ if `Surv'>=. & `touse'
replace `Surv' = . if `touse'==0
label var `Surv' "S(t+0)"
}
if "`nSurv'" != "" {
`byp' replace `nSurv' = cond(_n==1,1,`nSurv'[_n-1]) /*
*/ if `nSurv'>=. & `touse'
replace `nSurv' = . if `touse'==0
label var `nSurv' "Modified K-M
}
if "`Se'" != "" {
`byp' replace `Se' = `Se'[_n-1] if `Se'>=. & `touse'
label var `Se' "se(S) (Greenwood)"
}
if "`sllS'" != "" {
`byp' replace `sllS' = `sllS'[_n-1] if /*
*/ `sllS'>=. & `touse'
label var `sllS' "se(-ln ln S)"
}
if "`lb'" != "" {
`byp' replace `lb' = `lb'[_n-1] if `lb'>=. & `touse'
label var `lb' `"S() `=strsubdp("`level'")'% lower bound"'
}
if "`ub'" != "" {
`byp' replace `ub' = `ub'[_n-1] if `ub'>=. & `touse'
label var `ub' `"S() `=strsubdp("`level'")'% upper bound"'
}
if "`Haz'" != "" {
label var `Haz' "Delta_H(t)"
}
if "`Aalen'"!="" {
`byp' replace `Aalen' = cond(_n==1,0,`Aalen'[_n-1]) /*
*/ if `Aalen'>=. & `touse'
replace `Aalen' = . if `touse'==0
label var `Aalen' "Nelson-Aalen cumulative hazard"
if "`risk'" == "cumrisk" {
replace `Aalen'=1-exp(-`Aalen') if `touse'
label var `Aalen' "Nelson-Aalen cumulative risk"
}
}
if "`saalen'" != "" {
`byp' replace `saalen' = sqrt(`saalen')
`byp' replace `saalen' = `saalen'[_n-1] /*
*/ if `saalen'>=. & `touse'
label var `saalen' "se(Nelson-Aalen)"
}
if "`lba'" != "" {
`byp' replace `lba' = `lba'[_n-1] if `lba'>=. & `touse'
label var `lba' `"Nelson-Aalen `=strsubdp("`level'")'% lower bound"'
}
if "`uba'" != "" {
`byp' replace `uba' = `uba'[_n-1] if `uba'>=. & `touse'
label var `uba' `"Nelson-Aalen `=strsubdp("`level'")'% upper bound"'
}
label var `Pop' "N, entering population"
label var `Die' "d, number of failures"
}
restore, not
end
program define NotPw /* text */
if `"`_dta[st_wt]'"' == "pweight" {
di in red "`*' not possible with pweighted data"
exit 404
}
end
program define AddSurv /* by t Pop Die lvl -> Haz VHaz Surv Se sllS lb ub */
args by t N D lvl ARROW h Vh S Se sllS lb ub Aalen saalen uba lba NS
if "`h'"=="" {
tempvar h
}
tempvar nh
gen double `h' = cond(`N'==0,0,`D'/`N')
gen double `nh' = cond(`N'==0,0,`D'/(`N'+1))
sort `by' _t
if "`by'" != "" {
local byp "by `by':"
}
if "`Vh'" == "" {
tempvar Vh
}
gen double `Vh' = cond(`N'==0,0,`D'/(`N'*`N'))
if "`lba'"!="" | "`uba'"!="" {
if "`Aalen'"=="" { tempvar Aalen }
if "`saalen'"=="" { tempvar saalen }
}
if "`Aalen'"!="" {
`byp' gen double `Aalen' = `h'
`byp' replace `Aalen' = `Aalen'[_n-1]+`h' if _n>1
}
if "`saalen'"!="" {
tempvar sh
gen double `sh' = cond(`N'==0,0,`D'/(`N'^2))
`byp' gen double `saalen' = `sh'
`byp' replace `saalen' = `saalen'[_n-1]+`sh' if _n>1
}
if "`lba'"!="" | "`uba'"!="" {
local z = invnorm(1-(1-`lvl'/100)/2)
tempvar phi
gen double `phi'=(sqrt(`saalen')/`Aalen') if `Aalen'!=0
if "`lba'" != "" {
gen double `lba'=(`Aalen')*exp(-`z'*`phi')
replace `lba'=0 if `lba'<0
}
if "`uba'"!="" {
gen double `uba'=(`Aalen')*exp(`z'*`phi')
}
}
if "`Se'"!="" | "`lb'"!="" | "`ub'"!="" {
if "`S'"=="" { tempvar S }
if "`lb'"!="" | "`ub'"!="" {
if "`sllS'"=="" { tempvar sllS }
}
}
if "`S'" != "" {
`byp' gen double `S' = 1-`h'
`byp' replace `S' = `S'[_n-1]*(1-`h') if _n>1
}
if "`NS'" != "" {
`byp' gen double `NS' = 1-`nh'
`byp' replace `NS' = `NS'[_n-1]*(1-`nh') if _n>1
}
if "`Se'" != "" {
`byp' gen double `Se' = /*
*/ `S'*sqrt(sum(`D'/(`N'*(`N'-`D')))) if `S'!=0
replace `Se' = . if `S'==1
}
if "`sllS'" != "" {
`byp' gen double `sllS' = sqrt( /*
*/ sum(`D'/(`N'*(`N'-`D'))) / (sum(ln((`N'-`D')/`N'))^2) )
}
if "`lb'"!="" | "`ub'"!="" {
local z = invnorm(1-(1-`lvl'/100)/2)
if "`lb'" != "" {
gen double `lb'=(`S')^(exp(`z'*`sllS')) if `S'!=0
}
if "`ub'"!="" {
gen double `ub'=(`S')^(exp(-`z'*`sllS')) if `S'!=0
}
}
end
program define List
syntax [if] [in] [, ADjustfor(varlist) AT(numlist sort) NA/*
*/ BY(varlist) Compare Enter Failure /*
*/ Level(cilevel) noSHow STrata(varlist) ]
local w : char _dta[st_w]
local wt : char _dta[st_wt]
if "`na'"!="" & "`adjustf'"!="" {
di in red "cannot specify adjustfor() with na option"
exit 198
}
if "`na'"!="" & "`failure'"!="" {
di in red "failure invalid with na option"
exit 198
}
ByStAdj "`by'" "`strata'" "`adjustf'"
local sb "`s(sb)'"
if "`compare'" != "" {
if "`at'" == "" {
local at "10"
}
if "`sb'"=="" {
if "`na'"!="" {
di in red "compare requires by()"
exit 198
}
di in red "compare requires by() or strata()"
exit 198
}
}
if "`at'" != "" {
Procat `at'
local at `"`s(at)'"'
}
st_show `show'
tempvar touse mark n d cens ent s se lb ub aal saalen uba lba
st_smpl `touse' `"`if'"' "`in'" "`sb'" "`adjustf'"
preserve
quietly {
keep if `touse'
if "`adjustf'"=="" {
st_ct "`by'" -> _t `n' _d `cens' `ent'
if "`enter'"=="" {
replace `cens' = `cens' - `ent'
drop if _d==0 & `cens'==0
replace `ent' = 0
}
AddSurv "`by'" _t `n' _d `level' -> /*
*/ "" "" `s' `se' "" `lb' `ub' `aal' `saalen' `uba' `lba'
}
else {
DoAdjust "`by'" "`strata'" "`adjustf'" "" "" -> "" `s'
KeepDead "`sb'"
}
if "`failure'" != "" {
replace `s'=1-`s'
if "`adjustf'"=="" {
replace `lb'=1-`lb'
replace `ub'=1-`ub'
local hold "`lb'"
local lb "`ub'"
local ub "`hold'"
}
}
if "`na'" != "" {
replace `s'=`aal'
replace `lb'=`lba'
replace `ub'=`uba'
replace `se'=sqrt(`saalen')
drop `aal' `lba' `uba' `saalen'
}
}
if "`sb'"!="" {
quietly {
tempvar grp
by `sb': gen `grp'=1 if _n==1
replace `grp' = sum(`grp')
}
}
if "`compare'"!="" {
Reat _t `at'
if "`s(at)'"!="" {
local at "`s(at)'"
}
if "`adjustf'"=="" {
drop `n' _d `cens' `ent' `se' `lb' `ub'
}
if "`na'"!="" {
local failure "aalen"
}
Licomp "" "`sb'" "`grp'" _t `s' "`at'" "`failure'" "`adjustf'"
exit
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -