📄 stepwise.ado
字号:
}
}
quietly `version' `cmdname' `depvar' `curr' if `touse' `cmdrest'
if `k' == `k0' {
di as txt ///
"{p2col :p < `prfmt'}for all terms in model{p_end}"
}
di in smcl as txt "{p2colreset}{...}"
end
program ForSel
args pe hier lr lock version cmdname depvar termlist touse cmdrest
TermMacros term k curr : `lock' : `termlist'
local curr `term0' // is empty if `"`lock'"' == ""
if "`lr'" != "" {
local LRtest "LR test"
}
di in smcl as txt "{p2colset 0 23 32 2}{...}"
if "`lock'" == "" {
di as txt "{p2col :`LRtest'}begin with empty model{p_end}"
}
else di as txt "{p2col :`LRtest'}begin with term 1 model{p_end}"
if "`lr'" != "" {
// fit the empty model
quietly `version' `cmdname' `depvar' if `touse' `cmdrest'
tempname ll0 df0 ll1 df1
GetLR `ll0' `df0'
}
local start 1
local pefmt : display %6.4f `pe'
local done 0
while !`done' {
local add_i 0
local p_i 2
if "`hier'" != "" {
local last `start'
}
else local last `k'
forval i = `start'/`last' {
quietly `version' `cmdname' `depvar' `curr' `term`i'' if `touse' `cmdrest'
if "`lr'" != "" {
quietly LRtest `ll0' `df0'
}
else quietly test `term`i''
if r(p) < `p_i' {
local p_i = r(p)
local add_i `i'
if "`lr'" != "" {
GetLR `ll1' `df1'
}
}
}
if `p_i' < `pe' {
local p : display %6.4f `p_i'
di as txt ///
"{p2col :p = {res:`p'} <{space 2}`pefmt'}" ///
"adding{space 2}{res:`term`add_i''}{p_end}"
local curr `curr' `term`add_i''
if "`hier'" != "" {
local ++start
}
else {
local term`add_i' `term`k''
local term`k'
local --k
}
}
else {
if "`hier'" != "" {
local p : display %6.4f `p_i'
di as txt ///
"{p2col :p = {res:`p'} >= `pefmt'}testing {res:`term`add_i''}{p_end}"
}
local done 1
}
if "`lr'" != "" {
scalar `ll0' = `ll1'
scalar `df0' = `df1'
}
}
if "`curr'" == "`term0'" {
di as txt ///
"{p2col :p >= `pefmt'}for all terms in model{p_end}"
}
quietly `version' `cmdname' `depvar' `curr' if `touse' `cmdrest'
di in smcl as txt "{p2colreset}{...}"
end
program ForStep
args pr pe lr lock version cmdname depvar termlist touse cmdrest
TermMacros term k curr : `lock' : `termlist'
local curr `term0'
if "`lr'" != "" {
local LRtest "LR test"
}
di in smcl as txt "{p2colset 0 23 32 2}{...}"
if "`lock'" == "" {
di as txt "{p2col :`LRtest'}begin with empty model{p_end}"
}
else di as txt "{p2col :`LRtest'}begin with term 1 model{p_end}"
if "`lr'" != "" {
// fit the empty model
quietly `version' `cmdname' `depvar' `curr' if `touse' `cmdrest'
tempname ll0 df0 ll1 df1
GetLR `ll0' `df0'
}
local prfmt : display %6.4f `pr'
local pefmt : display %6.4f `pe'
local done 0
local k0 `k'
local k 0
local kp1 1
local first 1
while !`done' {
// forward step
local add_i 0
local p_i 2
forval i = `kp1'/`k0' {
quietly `version' `cmdname' `depvar' `curr' `term`i'' if `touse' `cmdrest'
if "`lr'" != "" {
quietly LRtest `ll0' `df0'
}
else quietly test `term`i''
if r(p) < `p_i' {
local p_i = r(p)
local add_i `i'
if "`lr'" != "" {
GetLR `ll1' `df1'
}
}
}
if `p_i' < `pe' {
local p : display %6.4f `p_i'
di as txt ///
"{p2col :p = {res:`p'} <{space 2}`pefmt'}" ///
"adding{space 3}{res:`term`add_i''}{p_end}"
local curr `curr' `term`add_i''
if "`hier'" != "" {
local ++start
}
else {
local tmp `term`kp1''
local term`kp1' `term`add_i''
local term`add_i' `tmp'
local ++k
local ++kp1
}
if `first' & "`lr'" != "" {
scalar `ll0' = `ll1'
scalar `df0' = `df1'
}
}
else {
if "`lr'" != "" {
scalar `ll1' = `ll0'
scalar `df1' = `df0'
}
local done 1
}
if `first' {
local first 0
continue
}
if "`lr'" == "" {
quietly `version' `cmdname' `depvar' `curr' if `touse' `cmdrest'
}
// backward step
local drop_i 0
local p_i 0
forval i = 1/`k' {
if "`lr'" != "" {
local curr1 : subinstr local curr "`term`i''" ""
quietly `version' `cmdname' `depvar' `curr1' if `touse' `cmdrest'
quietly LRtest `ll1' `df1'
}
else quietly test `term`i''
if r(p) > `p_i' {
local p_i = r(p)
local drop_i `i'
if "`lr'" != "" {
GetLR `ll0' `df0'
}
}
}
if `p_i' >= `pr' {
local p : display %6.4f `p_i'
di as txt ///
"{p2col :p = {res:`p'} >= `prfmt'}removing {res:`term`drop_i''}{p_end}"
local newcurr : list curr - term`k'
local curr : ///
subinstr local newcurr "`term`drop_i''" "`term`k''"
local tmp `term`k''
local term`k' `term`drop_i''
local term`drop_i' `tmp'
local --k
local --kp1
local done 0
}
else {
if "`lr'" != "" {
scalar `ll0' = `ll1'
scalar `df0' = `df1'
}
}
}
if "`curr'" == "`term0'" {
di as txt ///
"{p2col :p >= `pefmt'}for all terms in model{p_end}"
}
quietly `version' `cmdname' `depvar' `curr' if `touse' `cmdrest'
di in smcl as txt "{p2colreset}{...}"
end
// Syntax: <c_depvar> <c_terms> : <touse> <cmdname> "[weight]" : <termlist>
//
// Parse the <termlist>, removing observations with missing values, and
// collinear variables.
program ParseTerms
_on_colon_parse `0'
local c_depvar : word 1 of `s(before)'
local c_terms : word 2 of `s(before)'
_on_colon_parse `s(after)'
local touse : word 1 of `s(before)'
local cmdname : word 2 of `s(before)'
local wgt : word 3 of `s(before)'
local termlist `"`s(after)'"'
local stcmds streg stcox
local is_st : list cmdname in stcmds
// there is no <depvar> for -stcox- and -streg-,
// otherwise it is required
if !`is_st' {
gettoken depvar termlist : termlist, bind match(par)
if "`par'" != "" {
di as err "depvar cannot be part of a group"
exit 198
}
unab depvar : `depvar'
if "`cmdname'" != "intreg" {
markout `touse' `depvar'
}
if "`cmdname'" == "intreg" {
gettoken depvar2 termlist : termlist, bind match(par)
if "`par'" != "" {
di as err "depvar cannot be part of a group"
exit 198
}
unab depvar2 : `depvar2'
if "`cmdname'" != "intreg" {
markout `touse' `depvar2'
}
local depvar `depvar' `depvar2'
}
}
local k 0
while `"`:list retok termlist'"' != "" {
local ++k
gettoken term termlist : termlist, bind match(par)
if "`par'" == "" {
unab term : `term'
if `:word count `term'' != 1 {
gettoken term rest : term
local termlist `"`rest' `termlist'"'
}
}
markout `touse' `term'
_rmcoll `term' if `touse' `wgt'
local term`k' `r(varlist)'
local xvars0 `xvars0' `term`k''
}
if `k' == 0 {
di as err "no independent variables"
exit 198
}
quietly _rmcoll `xvars0' if `touse' `wgt'
local dups0 : list dups xvars0
local xvars `r(varlist)'
local colvar : list xvars0 - xvars
if `"`colvar'"' != "" {
local colvar : word 1 of `colvar'
di as err "between-term collinearity, variable `colvar'"
exit 459
}
forval i = 1/`k' {
local dups : list term`i' & dups0
if "`dups'" != "" {
local term`i' : list term`i' - dups
local dups0 : list dups0 - dups
}
if "`term`i''" != "" {
local terms `"`terms' (`term`i'')"'
}
}
// saved results
c_local `c_depvar' `depvar'
c_local `c_terms' `"`:list retok terms'"'
end
// Syntax: <c_stub> <c_k> <c_curr> : <termlist>
//
// Build local macros for the caller that contain each individual term, how
// many terms there are, and a list of all the current term variables.
program TermMacros
_on_colon_parse `0'
local c_stub : word 1 of `s(before)'
local c_k : word 2 of `s(before)'
local c_curr : word 3 of `s(before)'
_on_colon_parse `s(after)'
local lock `s(before)'
local termlist `"`s(after)'"'
local k 0
while `"`termlist'"' != "" {
if "`lock'" != "" {
local lock
}
else local ++k
gettoken term termlist : termlist, bind match(par)
c_local `c_stub'`k' `term'
local curr `"`curr' `term'"'
}
c_local `c_k' `k'
c_local `c_curr' `"`:list retok curr'"'
end
program CheckProps
args cmdname lr
local props : properties `cmdname'
local swlist sw swml
local swprop : list swlist & props
if "`swprop'" == "" {
di as err "`cmdname' is not supported by stepwise"
exit 199
}
if "`lr'" != "" {
local swlist swml
if `"`:list swlist & props'"' == "" {
di as err ///
"`cmdname' does not allow the lr option of stepwise"
exit 199
}
}
end
program Check4Robust
gettoken lr 0 : 0
if ("`lr'" == "") exit
syntax [fw pw aw iw] [, Robust CLuster(passthru) * ]
if "`weight'" == "pweight" | "`robust'`cluster'" != "" {
di as err ///
"option lr is not allowed with pweights, robust, or cluster()"
exit 198
}
end
program LRtest, rclass
args ll1 df1
tempname ll0 df0
GetLR `ll0' `df0'
return scalar p = chiprob(abs(`df1' - `df0'), abs(2*(`ll1'-`ll0')))
end
program GetLR
args ll df
capture confirm number `e(ll)'
if c(rc) {
di as err ///
"option lr requires that e(ll) contains the " ///
"log likelihood value for the model fit"
exit 322
}
capture {
confirm integer number `e(df_m)'
assert e(df_m) >= 0
}
if c(rc) {
di as err ///
"option lr requires that e(df_m) contains the " ///
"model degress of freedom"
exit 322
}
scalar `ll' = e(ll)
scalar `df' = e(df_m)
end
exit
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -