You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
2458 lines
78 KiB
Plaintext
2458 lines
78 KiB
Plaintext
7 months ago
|
*! version 2.3.1 07oct2009 Ben Jann
|
||
|
* 1. estadd and helpers
|
||
|
* 2. estadd_local
|
||
|
* 3. estadd_scalar
|
||
|
* 4. estadd_matrix
|
||
|
* 5. estadd_mean
|
||
|
* 6. estadd_sd
|
||
|
* 7. estadd_beta
|
||
|
* 8. estadd_coxsnell
|
||
|
* 9. estadd_nagelkerke
|
||
|
* 10. estadd_ysumm
|
||
|
* 11. estadd_summ
|
||
|
* 12. estadd_vif
|
||
|
* 13. estadd_ebsd
|
||
|
* 14. estadd_expb
|
||
|
* 15. estadd_pcorr
|
||
|
* 16. estadd_lrtest
|
||
|
* 17. estadd_brent
|
||
|
* 18. estadd_fitstat
|
||
|
* 19. estadd_listcoef
|
||
|
* 20. estadd_mlogtest
|
||
|
* 21. estadd_prchange
|
||
|
* 22. estadd_prvalue
|
||
|
* 23. estadd_asprvalue
|
||
|
* 24. estadd_margins
|
||
|
* 99. copy of erepost.ado
|
||
|
|
||
|
* 1.
|
||
|
program estadd
|
||
|
version 8.2
|
||
|
local caller : di _caller()
|
||
|
capt _on_colon_parse `0'
|
||
|
if !_rc {
|
||
|
local 0 `"`s(before)'"'
|
||
|
local names `"`s(after)'"'
|
||
|
}
|
||
|
syntax anything(equalok id="subcommand") [if] [in] [fw aw iw pw] [, * ]
|
||
|
if regexm(`"`anything'"',"^r\((.*)\)$") { // check -estadd r(name)-
|
||
|
capt confirm scalar `anything'
|
||
|
if _rc {
|
||
|
capt confirm matrix `anything'
|
||
|
if _rc {
|
||
|
di as err `"`anything' not found"'
|
||
|
exit 111
|
||
|
}
|
||
|
else {
|
||
|
local anything `"matrix `anything'"'
|
||
|
}
|
||
|
}
|
||
|
else {
|
||
|
local anything `"scalar `anything'"'
|
||
|
}
|
||
|
}
|
||
|
gettoken subcommand : anything
|
||
|
capt confirm name `subcommand'
|
||
|
if _rc {
|
||
|
di as err "invalid subcommand"
|
||
|
exit 198
|
||
|
}
|
||
|
if `"`options'"'!="" local options `", `options'"'
|
||
|
if `"`weight'`exp'"'!="" local wgtexp `"[`weight'`exp']"'
|
||
|
|
||
|
//expand estimates names and backup current estimates if necessary
|
||
|
tempname rcurrent ecurrent
|
||
|
capt _return drop `rcurrent'
|
||
|
_return hold `rcurrent'
|
||
|
capt noisily {
|
||
|
local names: list retok names
|
||
|
if "`names'"=="" {
|
||
|
local names "."
|
||
|
local qui
|
||
|
}
|
||
|
else local qui quietly
|
||
|
foreach name of local names {
|
||
|
if "`name'"=="." {
|
||
|
capt est_expand "`name'"
|
||
|
if _rc local enames "`enames'`name' "
|
||
|
else local enames "`enames'`r(names)' "
|
||
|
}
|
||
|
else {
|
||
|
est_expand "`name'" //=> error if estimates not found
|
||
|
local enames "`enames'`r(names)' "
|
||
|
}
|
||
|
}
|
||
|
local names: list uniq enames
|
||
|
if "`names'"=="." local active
|
||
|
else {
|
||
|
capt est_expand .
|
||
|
if _rc local active "."
|
||
|
else local active "`r(names)'"
|
||
|
if "`active'"=="." | `:list posof "`active'" in names'==0 {
|
||
|
local active
|
||
|
_est hold `ecurrent', restore estsystem nullok
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
if _rc {
|
||
|
_return restore `rcurrent'
|
||
|
exit _rc
|
||
|
}
|
||
|
_return restore `rcurrent', hold
|
||
|
|
||
|
// cases:
|
||
|
// - if active estimates not stored yet and "`names'"==".": simply execute
|
||
|
// estadd_subcmd to active estimates
|
||
|
// - else if active estimates not stored yet: backup/restore active estimates
|
||
|
// - else if active estimates stored but not in `names': backup/restore active estimates
|
||
|
// - else if active estimates stored: no backup but restore at end
|
||
|
|
||
|
//loop over estimates names and run subcommand
|
||
|
nobreak {
|
||
|
foreach m of local names {
|
||
|
if "`names'"!="." {
|
||
|
if "`m'"=="." _est unhold `ecurrent'
|
||
|
else {
|
||
|
capt confirm new var _est_`m' // fix e(sample)
|
||
|
if _rc qui replace _est_`m' = 0 if _est_`m' >=.
|
||
|
_est unhold `m'
|
||
|
}
|
||
|
}
|
||
|
backup_estimates_name
|
||
|
capt n break `qui' version `caller': estadd_`anything' `if' `in' `wgtexp' `options'
|
||
|
local rc = _rc
|
||
|
restore_estimates_name
|
||
|
if "`names'"!="." {
|
||
|
if "`m'"=="." _est hold `ecurrent', restore estsystem nullok
|
||
|
else _est hold `m', estimates varname(_est_`m')
|
||
|
}
|
||
|
if `rc' continue, break
|
||
|
}
|
||
|
if "`active'"!="" estimates restore `active', noh
|
||
|
}
|
||
|
_return restore `rcurrent'
|
||
|
if `rc' {
|
||
|
if `rc' == 199 di as error "invalid subcommand"
|
||
|
exit `rc'
|
||
|
}
|
||
|
end
|
||
|
|
||
|
program define backup_estimates_name, eclass
|
||
|
ereturn local _estadd_estimates_name `"`e(_estimates_name)'"'
|
||
|
ereturn local _estimates_name ""
|
||
|
end
|
||
|
program define restore_estimates_name, eclass
|
||
|
ereturn local _estimates_name `"`e(_estadd_estimates_name)'"'
|
||
|
ereturn local _estadd_estimates_name ""
|
||
|
end
|
||
|
|
||
|
program confirm_new_ename
|
||
|
capture confirm existence `e(`0')'
|
||
|
if !_rc {
|
||
|
di as err "e(`0') already defined"
|
||
|
exit 110
|
||
|
}
|
||
|
end
|
||
|
|
||
|
program confirm_esample
|
||
|
local efun: e(functions)
|
||
|
if `:list posof "sample" in efun'==0 {
|
||
|
di as err "e(sample) information not available"
|
||
|
exit 498
|
||
|
}
|
||
|
end
|
||
|
|
||
|
program confirm_numvar
|
||
|
args var
|
||
|
local ts = index("`var'",".")
|
||
|
confirm numeric variable `=substr("`var'",`ts'+1,.)'
|
||
|
end
|
||
|
|
||
|
program define added_macro
|
||
|
args name
|
||
|
di as txt %25s `"e(`name') : "' `""{res:`e(`name')'}""'
|
||
|
end
|
||
|
|
||
|
program define added_scalar
|
||
|
args name label
|
||
|
di as txt %25s `"e(`name') = "' " " as res e(`name') _c
|
||
|
if `"`label'"'!="" {
|
||
|
di as txt _col(38) `"(`label')"'
|
||
|
}
|
||
|
else di ""
|
||
|
end
|
||
|
|
||
|
program define added_matrix
|
||
|
args name label
|
||
|
capture {
|
||
|
local r = rowsof(e(`name'))
|
||
|
local c = colsof(e(`name'))
|
||
|
}
|
||
|
if _rc {
|
||
|
tempname tmp
|
||
|
mat `tmp' = e(`name')
|
||
|
local r = rowsof(`tmp')
|
||
|
local c = colsof(`tmp')
|
||
|
}
|
||
|
di as txt %25s `"e(`name') : "' " " ///
|
||
|
as res "`r' x `c'" _c
|
||
|
if `"`label'"'=="_rown" {
|
||
|
local thelabel: rownames e(`name')
|
||
|
local thelabel: list retok thelabel
|
||
|
if `r'>1 {
|
||
|
local thelabel: subinstr local thelabel " " ", ", all
|
||
|
}
|
||
|
di as txt _col(38) `"(`thelabel')"'
|
||
|
}
|
||
|
else if `"`label'"'!="" {
|
||
|
di as txt _col(38) `"(`label')"'
|
||
|
}
|
||
|
else di ""
|
||
|
end
|
||
|
|
||
|
* 2.
|
||
|
* -estadd- subroutine: add local
|
||
|
program estadd_loc
|
||
|
estadd_local `0'
|
||
|
end
|
||
|
program estadd_loca
|
||
|
estadd_local `0'
|
||
|
end
|
||
|
program estadd_local, eclass
|
||
|
version 8.2
|
||
|
syntax anything(equalok) [, Prefix(name) Replace Quietly ]
|
||
|
gettoken name def : anything , parse(" =:")
|
||
|
if "`replace'"=="" {
|
||
|
confirm_new_ename `prefix'`name'
|
||
|
}
|
||
|
ereturn local `prefix'`name'`def'
|
||
|
di _n as txt "added macro:"
|
||
|
added_macro `prefix'`name'
|
||
|
end
|
||
|
|
||
|
* 3.
|
||
|
* -estadd- subroutine: add scalar
|
||
|
program estadd_sca
|
||
|
estadd_scalar `0'
|
||
|
end
|
||
|
program estadd_scal
|
||
|
estadd_scalar `0'
|
||
|
end
|
||
|
program estadd_scala
|
||
|
estadd_scalar `0'
|
||
|
end
|
||
|
program estadd_scalar, eclass
|
||
|
version 8.2
|
||
|
syntax anything(equalok) [, Prefix(name) Replace Quietly ]
|
||
|
if regexm("`anything'","^r\((.*)\)$") { // estadd scalar r(name)
|
||
|
local name = regexs(1)
|
||
|
capt confirm name `name'
|
||
|
confirm scalar `anything'
|
||
|
if _rc error 198
|
||
|
local equ "`anything'"
|
||
|
}
|
||
|
else {
|
||
|
local isname 0
|
||
|
gettoken name equ0: anything, parse(" =")
|
||
|
capt confirm name `name'
|
||
|
if _rc error 198
|
||
|
else if `"`equ0'"'=="" { // estadd scalar name
|
||
|
local isname 1
|
||
|
local equ "scalar(`name')"
|
||
|
}
|
||
|
else { // estadd scalar name [=] exp
|
||
|
gettoken trash equ : equ0, parse(" =")
|
||
|
if `"`trash'"'!="=" {
|
||
|
local equ `"`equ0'"'
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
if "`replace'"=="" {
|
||
|
confirm_new_ename `prefix'`name'
|
||
|
}
|
||
|
ereturn scalar `prefix'`name' = `equ'
|
||
|
di _n as txt "added scalar:"
|
||
|
added_scalar `prefix'`name'
|
||
|
end
|
||
|
|
||
|
* 4.
|
||
|
* -estadd- subroutine: add matrix
|
||
|
program estadd_mat
|
||
|
estadd_matrix `0'
|
||
|
end
|
||
|
program estadd_matr
|
||
|
estadd_matrix `0'
|
||
|
end
|
||
|
program estadd_matri
|
||
|
estadd_matrix `0'
|
||
|
end
|
||
|
program estadd_matrix, eclass
|
||
|
version 8.2
|
||
|
syntax anything(equalok) [, Prefix(name) Replace Quietly ]
|
||
|
if regexm("`anything'","^r\((.*)\)$") { // estadd matrix r(name)
|
||
|
local name = regexs(1)
|
||
|
capt confirm name `name'
|
||
|
if _rc error 198
|
||
|
confirm matrix `anything'
|
||
|
local equ "`anything'"
|
||
|
}
|
||
|
else {
|
||
|
local isname 0
|
||
|
gettoken name equ0: anything, parse(" =")
|
||
|
capt confirm name `name'
|
||
|
if _rc error 198
|
||
|
else if `"`equ0'"'=="" { // estadd matrix name
|
||
|
local isname 1
|
||
|
local equ "`name'"
|
||
|
}
|
||
|
else { // estadd matrix name [=] exp
|
||
|
gettoken trash equ : equ0, parse(" =")
|
||
|
if `"`trash'"'!="=" {
|
||
|
local equ `"`equ0'"'
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
if "`replace'"=="" {
|
||
|
confirm_new_ename `prefix'`name'
|
||
|
}
|
||
|
tempname M
|
||
|
mat `M' = `equ'
|
||
|
ereturn matrix `prefix'`name' = `M'
|
||
|
di _n as txt "added matrix:"
|
||
|
added_matrix `prefix'`name'
|
||
|
end
|
||
|
|
||
|
* 5.
|
||
|
* -estadd- subroutine: means of regressors
|
||
|
program define estadd_mean, eclass
|
||
|
version 8.2
|
||
|
syntax [, Prefix(name) Replace Quietly ]
|
||
|
//check availability of e(sample)
|
||
|
confirm_esample
|
||
|
//check e()-names
|
||
|
if "`replace'"=="" confirm_new_ename `prefix'mean
|
||
|
//use aweights with -summarize-
|
||
|
local wtype `e(wtype)'
|
||
|
if "`wtype'"=="pweight" local wtype aweight
|
||
|
//subpop?
|
||
|
local subpop "`e(subpop)'"
|
||
|
if "`subpop'"=="" local subpop 1
|
||
|
//copy coefficients matrix and determine varnames
|
||
|
tempname results
|
||
|
mat `results' = e(b)
|
||
|
local vars: colnames `results'
|
||
|
//loop over variables: calculate -mean-
|
||
|
local j 0
|
||
|
foreach var of local vars {
|
||
|
local ++j
|
||
|
capture confirm_numvar `var'
|
||
|
if _rc mat `results'[1,`j'] = .z
|
||
|
else {
|
||
|
capt su `var' [`wtype'`e(wexp)'] if e(sample) & `subpop', meanonly
|
||
|
mat `results'[1,`j'] = cond(_rc,.,r(mean))
|
||
|
}
|
||
|
}
|
||
|
//return the results
|
||
|
ereturn matrix `prefix'mean = `results'
|
||
|
di _n as txt "added matrix:"
|
||
|
added_matrix `prefix'mean
|
||
|
end
|
||
|
|
||
|
* 6.
|
||
|
* -estadd- subroutine: standard deviations of regressors
|
||
|
program define estadd_sd, eclass
|
||
|
version 8.2
|
||
|
syntax [, noBinary Prefix(name) Replace Quietly ]
|
||
|
//check availability of e(sample)
|
||
|
confirm_esample
|
||
|
//check e()-names
|
||
|
if "`replace'"=="" confirm_new_ename `prefix'sd
|
||
|
//use aweights with -summarize-
|
||
|
local wtype `e(wtype)'
|
||
|
if "`wtype'"=="pweight" local wtype aweight
|
||
|
//subpop?
|
||
|
local subpop "`e(subpop)'"
|
||
|
if "`subpop'"=="" local subpop 1
|
||
|
//copy coefficients matrix and determine varnames
|
||
|
tempname results
|
||
|
mat `results' = e(b)
|
||
|
local vars: colnames `results'
|
||
|
//loop over variables: calculate -mean-
|
||
|
local j 0
|
||
|
foreach var of local vars {
|
||
|
local ++j
|
||
|
capture confirm_numvar `var'
|
||
|
if _rc mat `results'[1,`j'] = .z
|
||
|
else {
|
||
|
capture assert `var'==0 | `var'==1 if e(sample) & `subpop'
|
||
|
if _rc | "`binary'"=="" {
|
||
|
capt su `var' [`wtype'`e(wexp)'] if e(sample) & `subpop'
|
||
|
mat `results'[1,`j'] = cond(_rc,.,r(sd))
|
||
|
}
|
||
|
else mat `results'[1,`j'] = .z
|
||
|
}
|
||
|
}
|
||
|
//return the results
|
||
|
ereturn matrix `prefix'sd = `results'
|
||
|
di _n as txt "added matrix:"
|
||
|
added_matrix `prefix'sd
|
||
|
end
|
||
|
|
||
|
* 7.
|
||
|
* -estadd- subroutine: standardized coefficients
|
||
|
program define estadd_beta, eclass
|
||
|
version 8.2
|
||
|
syntax [, Prefix(name) Replace Quietly ]
|
||
|
//check availability of e(sample)
|
||
|
confirm_esample
|
||
|
//check e()-names
|
||
|
if "`replace'"=="" confirm_new_ename `prefix'beta
|
||
|
//use aweights with -summarize-
|
||
|
local wtype `e(wtype)'
|
||
|
if "`wtype'"=="pweight" local wtype aweight
|
||
|
//subpop?
|
||
|
local subpop "`e(subpop)'"
|
||
|
if "`subpop'"=="" local subpop 1
|
||
|
//copy coefficients matrix and determine varnames
|
||
|
tempname results sddep
|
||
|
mat `results' = e(b)
|
||
|
local vars: colnames `results'
|
||
|
local eqs: coleq `results', q
|
||
|
local depv "`e(depvar)'"
|
||
|
//loop over variables: calculate -beta-
|
||
|
local j 0
|
||
|
local lastdepvar
|
||
|
foreach var of local vars {
|
||
|
local depvar: word `++j' of `eqs'
|
||
|
if "`depvar'"=="_" local depvar "`depv'"
|
||
|
capture confirm_numvar `depvar'
|
||
|
if _rc mat `results'[1,`j'] = .z
|
||
|
else {
|
||
|
if "`depvar'"!="`lastdepvar'" {
|
||
|
capt su `depvar' [`wtype'`e(wexp)'] if e(sample) & `subpop'
|
||
|
scalar `sddep' = cond(_rc,.,r(sd))
|
||
|
}
|
||
|
capture confirm_numvar `var'
|
||
|
if _rc mat `results'[1,`j'] = .z
|
||
|
else {
|
||
|
capt su `var' [`wtype'`e(wexp)'] if e(sample) & `subpop'
|
||
|
mat `results'[1,`j'] = cond(_rc,.,`results'[1,`j'] * r(sd) / `sddep')
|
||
|
}
|
||
|
}
|
||
|
local lastdepvar "`depvar'"
|
||
|
}
|
||
|
//return the results
|
||
|
ereturn matrix `prefix'beta = `results'
|
||
|
di _n as txt "added matrix:"
|
||
|
added_matrix `prefix'beta
|
||
|
end
|
||
|
|
||
|
* 8.
|
||
|
* -estadd- subroutine: Cox & Snell Pseudo R-Squared
|
||
|
program define estadd_coxsnell, eclass
|
||
|
version 8.2
|
||
|
syntax [, Prefix(name) Replace Quietly ]
|
||
|
//check e()-names
|
||
|
if "`replace'"=="" confirm_new_ename `prefix'coxsnell
|
||
|
//compute statistic
|
||
|
tempname results
|
||
|
scalar `results' = 1 - exp((e(ll_0)-e(ll))*2/e(N)) // = 1 - exp(e(ll_0)-e(ll))^(2/e(N))
|
||
|
//return the results
|
||
|
*di as txt "Cox & Snell Pseudo R2 = " as res `results'
|
||
|
ereturn scalar `prefix'coxsnell = `results'
|
||
|
di _n as txt "added scalar:"
|
||
|
added_scalar `prefix'coxsnell
|
||
|
end
|
||
|
|
||
|
* 9.
|
||
|
* -estadd- subroutine: Nagelkerke Pseudo R-Squared
|
||
|
program define estadd_nagelkerke, eclass
|
||
|
version 8.2
|
||
|
syntax [, Prefix(name) Replace Quietly ]
|
||
|
//check e()-names
|
||
|
if "`replace'"=="" confirm_new_ename `prefix'nagelkerke
|
||
|
//compute statistic
|
||
|
tempname results
|
||
|
scalar `results' = (1 - exp((e(ll_0)-e(ll))*2/e(N))) / (1 - exp(e(ll_0)*2/e(N)))
|
||
|
// = (1 - exp(e(ll_0)-e(ll))^(2/e(N))) / (1 - exp(e(ll_0))^(2/e(N)))
|
||
|
//return the results
|
||
|
*di as txt "Nagelkerke Pseudo R2 = " as res `results'
|
||
|
ereturn scalar `prefix'nagelkerke = `results'
|
||
|
di _n as txt "added scalar:"
|
||
|
added_scalar `prefix'nagelkerke
|
||
|
end
|
||
|
|
||
|
* 10.
|
||
|
* -estadd- subroutine: summary statistics for dependent variable
|
||
|
program define estadd_ysumm, eclass
|
||
|
version 8.2
|
||
|
syntax [, MEan SUm MIn MAx RAnge sd Var cv SEMean SKewness ///
|
||
|
Kurtosis MEDian p1 p5 p10 p25 p50 p75 p90 p95 p99 iqr q all ///
|
||
|
Prefix(passthru) Replace Quietly ]
|
||
|
//check availability of e(sample)
|
||
|
confirm_esample
|
||
|
//default prefix
|
||
|
if `"`prefix'"'=="" local prefix y
|
||
|
else {
|
||
|
local 0 ", `prefix'"
|
||
|
syntax [, prefix(name) ]
|
||
|
}
|
||
|
//use aweights with -summarize-
|
||
|
local wtype `e(wtype)'
|
||
|
if "`wtype'"=="pweight" local wtype aweight
|
||
|
//subpop?
|
||
|
local subpop "`e(subpop)'"
|
||
|
if "`subpop'"=="" local subpop 1
|
||
|
//determine list of stats
|
||
|
tempname results
|
||
|
local Stats p99 p95 p90 p75 p50 p25 p10 p5 p1 kurtosis ///
|
||
|
skewness var sd max min sum mean
|
||
|
if "`all'"!="" {
|
||
|
local stats `Stats'
|
||
|
local range range
|
||
|
local cv cv
|
||
|
local semean semean
|
||
|
local iqr iqr
|
||
|
local sumtype detail
|
||
|
}
|
||
|
else {
|
||
|
if "`q'"!="" {
|
||
|
local p25 p25
|
||
|
local p50 p50
|
||
|
local p75 p75
|
||
|
}
|
||
|
if "`median'"!="" local p50 p50
|
||
|
foreach stat of local Stats {
|
||
|
if "``stat''"!="" {
|
||
|
local stats: list stats | stat
|
||
|
}
|
||
|
}
|
||
|
if "`stats'"=="" & "`range'"=="" & "`cv'"=="" & ///
|
||
|
"`semean'"=="" & "`iqr'"=="" local stats sd max min mean
|
||
|
local sumtype sum mean min max
|
||
|
if "`:list stats - sumtype'"=="" & "`cv'"=="" & ///
|
||
|
"`semean'"=="" & "`iqr'"=="" local sumtype meanonly
|
||
|
else {
|
||
|
local sumtype `sumtype' Var sd
|
||
|
if "`:list stats - sumtype'"=="" & "`iqr'"=="" local sumtype
|
||
|
else local sumtype detail
|
||
|
}
|
||
|
}
|
||
|
local Stats: subinstr local stats "var" "Var"
|
||
|
local nstats: word count `iqr' `semean' `cv' `range' `stats'
|
||
|
if "`replace'"=="" {
|
||
|
foreach stat in `iqr' `semean' `cv' `range' `stats' {
|
||
|
confirm_new_ename `prefix'`=lower("`stat'")'
|
||
|
}
|
||
|
}
|
||
|
//calculate stats
|
||
|
local var: word 1 of `e(depvar)'
|
||
|
mat `results' = J(`nstats',1,.z)
|
||
|
qui su `var' [`wtype'`e(wexp)'] if e(sample) & `subpop', `sumtype'
|
||
|
local i 0
|
||
|
if "`iqr'"!="" {
|
||
|
mat `results'[`++i',1] = r(p75) - r(p25)
|
||
|
}
|
||
|
if "`semean'"!="" {
|
||
|
mat `results'[`++i',1] = r(sd) / sqrt(r(N))
|
||
|
}
|
||
|
if "`cv'"!="" {
|
||
|
mat `results'[`++i',1] = r(sd) / r(mean)
|
||
|
}
|
||
|
if "`range'"!="" {
|
||
|
mat `results'[`++i',1] = r(max) - r(min)
|
||
|
}
|
||
|
foreach stat of local Stats {
|
||
|
mat `results'[`++i',1] = r(`stat')
|
||
|
}
|
||
|
//return the results
|
||
|
local i 0
|
||
|
di as txt _n "added scalars:"
|
||
|
foreach stat in `iqr' `semean' `cv' `range' `stats' {
|
||
|
local sname = lower("`stat'")
|
||
|
ereturn scalar `prefix'`sname' = `results'[`++i',1]
|
||
|
added_scalar `prefix'`sname'
|
||
|
}
|
||
|
end
|
||
|
|
||
|
* 11.
|
||
|
* -estadd- subroutine: various summary statistics
|
||
|
program define estadd_summ, eclass
|
||
|
version 8.2
|
||
|
syntax [, MEan SUm MIn MAx RAnge sd Var cv SEMean SKewness ///
|
||
|
Kurtosis MEDian p1 p5 p10 p25 p50 p75 p90 p95 p99 iqr q all ///
|
||
|
Prefix(name) Replace Quietly ]
|
||
|
//check availability of e(sample)
|
||
|
confirm_esample
|
||
|
//use aweights with -summarize-
|
||
|
local wtype `e(wtype)'
|
||
|
if "`wtype'"=="pweight" local wtype aweight
|
||
|
//subpop?
|
||
|
local subpop "`e(subpop)'"
|
||
|
if "`subpop'"=="" local subpop 1
|
||
|
//determine list of stats
|
||
|
tempname results results2
|
||
|
local Stats p99 p95 p90 p75 p50 p25 p10 p5 p1 kurtosis ///
|
||
|
skewness var sd max min sum mean
|
||
|
if "`all'"!="" {
|
||
|
local stats `Stats'
|
||
|
local range range
|
||
|
local cv cv
|
||
|
local semean semean
|
||
|
local iqr iqr
|
||
|
local sumtype detail
|
||
|
}
|
||
|
else {
|
||
|
if "`q'"!="" {
|
||
|
local p25 p25
|
||
|
local p50 p50
|
||
|
local p75 p75
|
||
|
}
|
||
|
if "`median'"!="" local p50 p50
|
||
|
foreach stat of local Stats {
|
||
|
if "``stat''"!="" {
|
||
|
local stats: list stats | stat
|
||
|
}
|
||
|
}
|
||
|
if "`stats'"=="" & "`range'"=="" & "`cv'"=="" & ///
|
||
|
"`semean'"=="" & "`iqr'"=="" local stats sd max min mean
|
||
|
local sumtype sum mean min max
|
||
|
if "`:list stats - sumtype'"=="" & "`cv'"=="" & ///
|
||
|
"`semean'"=="" & "`iqr'"=="" local sumtype meanonly
|
||
|
else {
|
||
|
local sumtype `sumtype' Var sd
|
||
|
if "`:list stats - sumtype'"=="" & "`iqr'"=="" local sumtype
|
||
|
else local sumtype detail
|
||
|
}
|
||
|
}
|
||
|
local Stats: subinstr local stats "var" "Var"
|
||
|
local nstats: word count `iqr' `semean' `cv' `range' `stats'
|
||
|
if "`replace'"=="" {
|
||
|
foreach stat in `iqr' `semean' `cv' `range' `stats' {
|
||
|
confirm_new_ename `prefix'`=lower("`stat'")'
|
||
|
}
|
||
|
}
|
||
|
//copy coefficients matrix and determine varnames
|
||
|
mat `results' = e(b)
|
||
|
local vars: colnames `results'
|
||
|
if `nstats'>1 {
|
||
|
mat `results' = `results' \ J(`nstats'-1,colsof(`results'),.z)
|
||
|
}
|
||
|
//loop over variables: calculate stats
|
||
|
local j 0
|
||
|
foreach var of local vars {
|
||
|
local ++j
|
||
|
capture confirm_numvar `var'
|
||
|
if _rc mat `results'[1,`j'] = .z
|
||
|
else {
|
||
|
capt su `var' [`wtype'`e(wexp)'] if e(sample) & `subpop', `sumtype'
|
||
|
local i 0
|
||
|
if "`iqr'"!="" {
|
||
|
mat `results'[`++i',`j'] = cond(_rc,.,r(p75) - r(p25))
|
||
|
}
|
||
|
if "`semean'"!="" {
|
||
|
mat `results'[`++i',`j'] = cond(_rc,.,r(sd) / sqrt(r(N)))
|
||
|
}
|
||
|
if "`cv'"!="" {
|
||
|
mat `results'[`++i',`j'] = cond(_rc,.,r(sd) / r(mean))
|
||
|
}
|
||
|
if "`range'"!="" {
|
||
|
mat `results'[`++i',`j'] = cond(_rc,.,r(max) - r(min))
|
||
|
}
|
||
|
foreach stat of local Stats {
|
||
|
mat `results'[`++i',`j'] = cond(_rc,.,r(`stat'))
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
//return the results
|
||
|
local i 0
|
||
|
di as txt _n "added matrices:"
|
||
|
foreach stat in `iqr' `semean' `cv' `range' `stats' {
|
||
|
local sname = lower("`stat'")
|
||
|
mat `results2' = `results'[`++i',1...]
|
||
|
ereturn matrix `prefix'`sname' = `results2'
|
||
|
added_matrix `prefix'`sname'
|
||
|
}
|
||
|
end
|
||
|
|
||
|
* 12.
|
||
|
* -estadd- subroutine: variance inflation factors
|
||
|
program define estadd_vif, eclass
|
||
|
version 8.2
|
||
|
local caller : di _caller()
|
||
|
syntax [, TOLerance SQRvif Prefix(name) Replace Quietly ]
|
||
|
//check availability of e(sample)
|
||
|
confirm_esample
|
||
|
//check e()-names
|
||
|
if "`replace'"=="" {
|
||
|
confirm_new_ename `prefix'vif
|
||
|
if "`tolerance'"!="" confirm_new_ename `prefix'tolerance
|
||
|
if "`sqrvif'"!="" confirm_new_ename `prefix'sqrvif
|
||
|
}
|
||
|
//copy coefficients matrix and set to .z
|
||
|
tempname results results2 results3
|
||
|
matrix `results' = e(b)
|
||
|
forv j = 1/`=colsof(`results')' {
|
||
|
mat `results'[1,`j'] = .z
|
||
|
}
|
||
|
if "`tolerance'"!="" mat `results2' = `results'
|
||
|
if "`sqrvif'"!="" mat `results3' = `results'
|
||
|
//compute VIF and add to results vector
|
||
|
capt n `quietly' version `caller': vif
|
||
|
if _rc {
|
||
|
if _rc == 301 di as err "-estadd:vif- can only be used after -regress-"
|
||
|
exit _rc
|
||
|
}
|
||
|
local i 0
|
||
|
local name "`r(name_`++i')'"
|
||
|
while "`name'"!="" {
|
||
|
local j = colnumb(`results',"`name'")
|
||
|
if `j'<. {
|
||
|
matrix `results'[1,`j'] = r(vif_`i')
|
||
|
if "`tolerance'"!="" matrix `results2'[1,`j'] = 1 / r(vif_`i')
|
||
|
if "`sqrvif'"!="" matrix `results3'[1,`j'] = sqrt( r(vif_`i') )
|
||
|
}
|
||
|
local name "`r(name_`++i')'"
|
||
|
}
|
||
|
//return the results
|
||
|
if "`sqrvif'"!="" | "`tolerance'"!="" di as txt _n "added matrices:"
|
||
|
else di as txt _n "added matrix:"
|
||
|
if "`sqrvif'"!="" {
|
||
|
ereturn matrix `prefix'sqrvif = `results3'
|
||
|
added_matrix `prefix'sqrvif
|
||
|
}
|
||
|
if "`tolerance'"!="" {
|
||
|
ereturn matrix `prefix'tolerance = `results2'
|
||
|
added_matrix `prefix'tolerance
|
||
|
}
|
||
|
ereturn matrix `prefix'vif = `results'
|
||
|
added_matrix `prefix'vif
|
||
|
end
|
||
|
|
||
|
* 13.
|
||
|
* -estadd- subroutine: standardized factor change coefficients
|
||
|
program define estadd_ebsd, eclass
|
||
|
version 8.2
|
||
|
syntax [, Prefix(name) Replace Quietly ]
|
||
|
//check availability of e(sample)
|
||
|
confirm_esample
|
||
|
//check e()-names
|
||
|
if "`replace'"=="" confirm_new_ename `prefix'ebsd
|
||
|
//use aweights with -summarize-
|
||
|
local wtype `e(wtype)'
|
||
|
if "`wtype'"=="pweight" local wtype aweight
|
||
|
//subpop?
|
||
|
local subpop "`e(subpop)'"
|
||
|
if "`subpop'"=="" local subpop 1
|
||
|
//copy coefficients matrix and determine varnames
|
||
|
tempname results
|
||
|
mat `results' = e(b)
|
||
|
local vars: colnames `results'
|
||
|
//loop over variables: calculate -mean-
|
||
|
local j 0
|
||
|
foreach var of local vars {
|
||
|
local ++j
|
||
|
capture confirm_numvar `var'
|
||
|
if _rc mat `results'[1,`j'] = .z
|
||
|
else {
|
||
|
capt su `var' [`wtype'`e(wexp)'] if e(sample) & `subpop'
|
||
|
mat `results'[1,`j'] = cond(_rc,.,exp( `results'[1,`j'] * r(sd)))
|
||
|
}
|
||
|
}
|
||
|
//return the results
|
||
|
ereturn matrix `prefix'ebsd = `results'
|
||
|
di _n as txt "added matrix:"
|
||
|
added_matrix `prefix'ebsd
|
||
|
end
|
||
|
|
||
|
* 14.
|
||
|
* -estadd- subroutine: exponentiated coefficients
|
||
|
program define estadd_expb, eclass
|
||
|
version 8.2
|
||
|
syntax [, noCONStant Prefix(name) Replace Quietly ]
|
||
|
//check e()-names
|
||
|
if "`replace'"=="" confirm_new_ename `prefix'expb
|
||
|
//copy coefficients matrix and determine names of coefficients
|
||
|
tempname results
|
||
|
mat `results' = e(b)
|
||
|
local coefs: colnames `results'
|
||
|
//loop over coefficients
|
||
|
local j 0
|
||
|
foreach coef of local coefs {
|
||
|
local ++j
|
||
|
if `"`constant'"'!="" & `"`coef'"'=="_cons" {
|
||
|
mat `results'[1,`j'] = .z
|
||
|
}
|
||
|
else {
|
||
|
mat `results'[1,`j'] = exp(`results'[1,`j'])
|
||
|
}
|
||
|
}
|
||
|
//return the results
|
||
|
ereturn matrix `prefix'expb = `results'
|
||
|
di _n as txt "added matrix:"
|
||
|
added_matrix `prefix'expb
|
||
|
end
|
||
|
|
||
|
* 15.
|
||
|
* -estadd- subroutine: partial and semi-partial correlations
|
||
|
program define estadd_pcorr, eclass
|
||
|
version 8.2
|
||
|
syntax [, semi Prefix(name) Replace Quietly ]
|
||
|
//check availability of e(sample)
|
||
|
confirm_esample
|
||
|
//check e()-names
|
||
|
if "`replace'"=="" {
|
||
|
if "`semi'"!="" confirm_new_ename `prefix'spcorr
|
||
|
confirm_new_ename `prefix'pcorr
|
||
|
}
|
||
|
//copy coefficients matrix and set to .z
|
||
|
tempname results results2
|
||
|
matrix `results' = e(b)
|
||
|
forv j = 1/`=colsof(`results')' {
|
||
|
mat `results'[1,`j'] = .z
|
||
|
}
|
||
|
local eqs: coleq `results', quoted
|
||
|
local eq: word 1 of `eqs'
|
||
|
mat `results2' = `results'[1,"`eq':"]
|
||
|
local vars: colnames `results2'
|
||
|
foreach var of local vars {
|
||
|
capt confirm numeric var `var'
|
||
|
if !_rc local temp "`temp'`var' "
|
||
|
}
|
||
|
local vars "`temp'"
|
||
|
if "`semi'"!="" mat `results2' = `results'
|
||
|
else {
|
||
|
mat drop `results2'
|
||
|
local results2
|
||
|
}
|
||
|
local depv: word 1 of `e(depvar)'
|
||
|
//compute statistics and add to results vector
|
||
|
local wtype `e(wtype)'
|
||
|
if inlist("`wtype'","pweight","iweight") local wtype aweight
|
||
|
_estadd_pcorr_compute `depv' `vars' [`wtype'`e(wexp)'] if e(sample), ///
|
||
|
eq(`eq') results(`results') results2(`results2')
|
||
|
//return the results
|
||
|
if "`semi'"!="" {
|
||
|
di as txt _n "added matrices:"
|
||
|
ereturn matrix `prefix'spcorr = `results2'
|
||
|
added_matrix `prefix'spcorr
|
||
|
}
|
||
|
else di as txt _n "added matrix:"
|
||
|
ereturn matrix `prefix'pcorr = `results'
|
||
|
added_matrix `prefix'pcorr
|
||
|
end
|
||
|
program define _estadd_pcorr_compute // based on pcorr.ado by StataCorp
|
||
|
// and pcorr2.ado by Richard Williams
|
||
|
syntax varlist(min=1) [aw fw] [if], eq(str) results(str) [ results2(str) ]
|
||
|
marksample touse
|
||
|
tempname hcurrent
|
||
|
_est hold `hcurrent', restore
|
||
|
quietly reg `varlist' [`weight'`exp'] if `touse'
|
||
|
if (e(N)==0 | e(N)>=.) error 2000
|
||
|
local NmK = e(df_r)
|
||
|
local R2 = e(r2)
|
||
|
gettoken depv varlist: varlist
|
||
|
foreach var of local varlist {
|
||
|
quietly test `var'
|
||
|
if r(F)<. {
|
||
|
local s "1"
|
||
|
if _b[`var']<0 local s "-1"
|
||
|
local c = colnumb(`results',"`eq':`var'")
|
||
|
mat `results'[1,`c'] = `s' * sqrt(r(F)/(r(F)+`NmK'))
|
||
|
if "`results2'"!="" {
|
||
|
mat `results2'[1,`c'] = `s' * sqrt(r(F)*((1-`R2')/`NmK'))
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
end
|
||
|
|
||
|
* 16.
|
||
|
* -estadd- subroutine: Likelihood-ratio test
|
||
|
program define estadd_lrtest, eclass
|
||
|
version 8.2
|
||
|
local caller : di _caller()
|
||
|
syntax anything(id="model") [, Name(name) Prefix(name) Replace Quietly * ]
|
||
|
if "`name'"=="" local name lrtest_
|
||
|
//check e()-names
|
||
|
if "`replace'"=="" {
|
||
|
confirm_new_ename `prefix'`name'p
|
||
|
confirm_new_ename `prefix'`name'chi2
|
||
|
confirm_new_ename `prefix'`name'df
|
||
|
}
|
||
|
//compute statistics
|
||
|
`quietly' version `caller': lrtest `anything', `options'
|
||
|
//return the results
|
||
|
ereturn scalar `prefix'`name'p = r(p)
|
||
|
ereturn scalar `prefix'`name'chi2 = r(chi2)
|
||
|
ereturn scalar `prefix'`name'df = r(df)
|
||
|
di _n as txt "added scalars:"
|
||
|
added_scalar `prefix'`name'p
|
||
|
added_scalar `prefix'`name'chi2
|
||
|
added_scalar `prefix'`name'df
|
||
|
end
|
||
|
|
||
|
* 17.
|
||
|
* -estadd- subroutine: support for -brant- by Long and Freese
|
||
|
* (see http://www.indiana.edu/~jslsoc/spost.htm)
|
||
|
program define estadd_brant, eclass
|
||
|
version 8.2
|
||
|
local caller : di _caller()
|
||
|
syntax [ , Prefix(name) Replace Quietly * ]
|
||
|
capt findfile brant.ado
|
||
|
if _rc {
|
||
|
di as error "fitstat.ado from the -spost9_ado- package by Long and Freese required"
|
||
|
di as error `"type {stata "net from http://www.indiana.edu/~jslsoc/stata"}"'
|
||
|
error 499
|
||
|
}
|
||
|
// check names
|
||
|
if "`replace'"=="" {
|
||
|
foreach name in brant_chi2 brant_df brant_p brant {
|
||
|
confirm_new_ename `prefix'`name'
|
||
|
}
|
||
|
}
|
||
|
// compute and return the results
|
||
|
`quietly' version `caller': brant, `options'
|
||
|
di as txt _n "added scalars:"
|
||
|
foreach stat in chi2 df p {
|
||
|
ereturn scalar `prefix'brant_`stat' = r(`stat')
|
||
|
added_scalar `prefix'brant_`stat'
|
||
|
}
|
||
|
tempname mat
|
||
|
matrix `mat' = r(ivtests)
|
||
|
matrix `mat' = `mat''
|
||
|
ereturn matrix `prefix'brant = `mat'
|
||
|
di as txt _n "added matrix:"
|
||
|
added_matrix `prefix'brant _rown
|
||
|
end
|
||
|
|
||
|
* 18.
|
||
|
* -estadd- subroutine: support for -fitstat- by Long and Freese
|
||
|
* (see http://www.indiana.edu/~jslsoc/spost.htm)
|
||
|
program define estadd_fitstat, eclass
|
||
|
version 8.2
|
||
|
local caller : di _caller()
|
||
|
syntax [ , Prefix(name) Replace Quietly Bic * ]
|
||
|
capt findfile fitstat.ado
|
||
|
if _rc {
|
||
|
di as error "fitstat.ado from the -spost9_ado- package by Long and Freese required"
|
||
|
di as error `"type {stata "net from http://www.indiana.edu/~jslsoc/stata"}"'
|
||
|
error 499
|
||
|
}
|
||
|
`quietly' version `caller': fitstat, `bic' `options'
|
||
|
local stats: r(scalars)
|
||
|
local allstats ///
|
||
|
dev dev_df lrx2 lrx2_df lrx2_p r2_adj r2_mf r2_mfadj r2_ml ///
|
||
|
r2_cu r2_mz r2_ef v_ystar v_error r2_ct r2_ctadj aic aic_n ///
|
||
|
bic bic_p statabic stataaic n_rhs n_parm
|
||
|
local stats: list allstats & stats
|
||
|
if "`bic'"!="" {
|
||
|
local bic aic aic_n bic bic_p statabic stataaic
|
||
|
local stats: list bic & stats
|
||
|
}
|
||
|
|
||
|
|
||
|
// check names
|
||
|
if "`replace'"=="" {
|
||
|
foreach stat of local stats {
|
||
|
if inlist("`stat'", "bic", "aic") local rname `stat'0
|
||
|
else local rname `stat'
|
||
|
confirm_new_ename `prefix'`rname'
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// return the results
|
||
|
di as txt _n "added scalars:"
|
||
|
foreach stat of local stats {
|
||
|
if inlist("`stat'", "bic", "aic") local rname `stat'0
|
||
|
else local rname `stat'
|
||
|
ereturn scalar `prefix'`rname' = r(`stat')
|
||
|
added_scalar `prefix'`rname'
|
||
|
}
|
||
|
end
|
||
|
|
||
|
* 19.
|
||
|
* -estadd- subroutine: support for -listcoef- by Long and Freese
|
||
|
* (see http://www.indiana.edu/~jslsoc/spost.htm)
|
||
|
program define estadd_listcoef, eclass
|
||
|
version 8.2
|
||
|
local caller : di _caller()
|
||
|
syntax [anything] [ , Prefix(name) Replace Quietly ///
|
||
|
nosd gt lt ADJacent Matrix EXpand * ]
|
||
|
|
||
|
// handle some options and look for e(sample)
|
||
|
if `"`matrix'"'!="" {
|
||
|
local matrix matrix
|
||
|
}
|
||
|
if `"`e(cmd)'"'=="slogit" & "`expand'"!="" {
|
||
|
di as err "-expand- option not supported"
|
||
|
exit 198
|
||
|
}
|
||
|
confirm_esample
|
||
|
|
||
|
// set some constants
|
||
|
local listcoef_matrices "xs ys std fact facts pct pcts"
|
||
|
if "`sd'"=="" local listcoef_matrices "`listcoef_matrices' sdx"
|
||
|
|
||
|
// run listcoef
|
||
|
capt findfile listcoef.ado
|
||
|
if _rc {
|
||
|
di as error "-listcoef- from the -spost9_ado- package by Long and Freese required"
|
||
|
di as error `"type {stata "net from http://www.indiana.edu/~jslsoc/stata"}"'
|
||
|
error 499
|
||
|
}
|
||
|
`quietly' version `caller': listcoef `anything' , matrix `gt' `lt' `adjacent' `options'
|
||
|
|
||
|
// check existing e()'s
|
||
|
if "`replace'"=="" {
|
||
|
confirm_new_ename `prefix'pvalue
|
||
|
foreach matrix of local listcoef_matrices {
|
||
|
_estadd_listcoef_ChkEName b_`matrix', prefix(`prefix')
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// grab r()-results and post in e()
|
||
|
di as txt _n "added matrices:"
|
||
|
if inlist(`"`e(cmd)'"',"mlogit","mprobit") {
|
||
|
_estadd_listcoef_AddResToNomModl `listcoef_matrices', prefix(`prefix') `gt' `lt' `adjacent'
|
||
|
}
|
||
|
else {
|
||
|
foreach matrix of local listcoef_matrices {
|
||
|
_estadd_listcoef_AddMatToE `matrix', prefix(`prefix')
|
||
|
}
|
||
|
}
|
||
|
end
|
||
|
program define _estadd_listcoef_ChkEName
|
||
|
syntax name [, prefix(str) ]
|
||
|
capt confirm matrix r(`namelist')
|
||
|
if _rc exit
|
||
|
confirm_new_ename `prefix'`namelist'
|
||
|
end
|
||
|
program define _estadd_listcoef_AddMatToE, eclass
|
||
|
syntax name [, prefix(str) ]
|
||
|
capt confirm matrix r(b_`namelist')
|
||
|
if _rc exit
|
||
|
tempname tmp
|
||
|
matrix `tmp' = r(b_`namelist')
|
||
|
capt confirm matrix r(b2_`namelist')
|
||
|
if _rc==0 {
|
||
|
local eqnames: coleq e(b), quoted
|
||
|
local eqnames: list uniq eqnames
|
||
|
local eqname: word 1 of `eqnames'
|
||
|
mat coleq `tmp' = `"`eqname'"'
|
||
|
tempname tmp2
|
||
|
matrix `tmp2' = r(b2_`namelist')
|
||
|
local eqname: word 2 of `eqnames'
|
||
|
mat coleq `tmp2' = `"`eqname'"'
|
||
|
mat `tmp' = `tmp' , `tmp2'
|
||
|
mat drop `tmp2'
|
||
|
}
|
||
|
ereturn matrix `prefix'b_`namelist' = `tmp'
|
||
|
added_matrix `prefix'b_`namelist' _rown
|
||
|
end
|
||
|
program define _estadd_listcoef_AddResToNomModl, eclass
|
||
|
syntax anything(name=listcoef_matrices) [, prefix(str) gt lt ADJacent ]
|
||
|
if "`lt'"=="" & "`gt'"=="" {
|
||
|
local lt lt
|
||
|
local gt gt
|
||
|
}
|
||
|
local adjacent = "`adjacent'"!=""
|
||
|
local lt = "`lt'"!=""
|
||
|
local gt = "`gt'"!=""
|
||
|
|
||
|
// outcomes and labels
|
||
|
tempname outcomes
|
||
|
if `"`e(cmd)'"'=="mlogit" {
|
||
|
if c(stata_version) < 9 local type cat
|
||
|
else local type out
|
||
|
mat `outcomes' = e(`type')
|
||
|
local noutcomes = colsof(`outcomes')
|
||
|
local eqnames `"`e(eqnames)'"'
|
||
|
if (`:list sizeof eqnames'<`noutcomes') {
|
||
|
local ibase = e(ibase`type')
|
||
|
}
|
||
|
else local ibase 0
|
||
|
forv i = 1/`noutcomes' {
|
||
|
if `i'==`ibase' {
|
||
|
local outcomelab`i' `"`e(baselab)'"'
|
||
|
}
|
||
|
else {
|
||
|
gettoken eq eqnames : eqnames
|
||
|
local outcomelab`i' `"`eq'"'
|
||
|
}
|
||
|
if `"`outcomelab`i''"'=="" {
|
||
|
local outcomelab`i': di `outcomes'[1,`i']
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
else if `"`e(cmd)'"'=="mprobit" {
|
||
|
mat `outcomes' = e(outcomes)'
|
||
|
local noutcomes = colsof(`outcomes')
|
||
|
forv i = 1/`noutcomes' {
|
||
|
local outcomelab`i' `"`e(out`i')'"'
|
||
|
}
|
||
|
}
|
||
|
else {
|
||
|
di as err `"`e(cmd)' not supported"
|
||
|
exit 499
|
||
|
}
|
||
|
|
||
|
// collect vectors
|
||
|
tempname stats
|
||
|
mat `stats' = r(b) \ r(b_z) \ r(b_z) \ r(b_p)
|
||
|
forv i = 1/`=colsof(`stats')' {
|
||
|
mat `stats'[2,`i'] = `stats'[1,`i'] / `stats'[3,`i']
|
||
|
}
|
||
|
mat rown `stats' = "b" "se" "z" "P>|z|"
|
||
|
local enames "b_raw b_se b_z b_p"
|
||
|
foreach matrix of local listcoef_matrices {
|
||
|
capt confirm matrix r(b_`matrix')
|
||
|
if _rc continue
|
||
|
mat `stats' = `stats' \ r(b_`matrix')
|
||
|
local enames `"`enames' b_`matrix'"'
|
||
|
}
|
||
|
|
||
|
// select/reorder contrasts of interest
|
||
|
local contrast "r(contrast)"
|
||
|
local ncontrast = colsof(`contrast')
|
||
|
tempname stats0 temp
|
||
|
matrix rename `stats' `stats0'
|
||
|
forv i = 1/`noutcomes' {
|
||
|
local out1 = `outcomes'[1, `i']
|
||
|
local j 0
|
||
|
forv j = 1/`noutcomes' {
|
||
|
local out2 = `outcomes'[1, `j']
|
||
|
if `out1'==`out2' continue
|
||
|
if `adjacent' & abs(`i'-`j')>1 continue
|
||
|
if `lt'==0 & `out1'<`out2' continue
|
||
|
if `gt'==0 & `out1'>`out2' continue
|
||
|
forv l = 1/`ncontrast' {
|
||
|
if el(`contrast',1,`l')!=`out1' continue
|
||
|
if el(`contrast',2,`l')!=`out2' continue
|
||
|
mat `temp' = `stats0'[1..., `l']
|
||
|
mat coleq `temp' = `"`outcomelab`i''-`outcomelab`j'"'
|
||
|
mat `stats' = nullmat(`stats'), `temp'
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
capt mat drop `stats0'
|
||
|
|
||
|
// post rows to e()
|
||
|
local i 0
|
||
|
foreach ename of local enames {
|
||
|
local ++i
|
||
|
mat `temp' = `stats'[`i', 1...]
|
||
|
ereturn matrix `prefix'`ename' = `temp'
|
||
|
added_matrix `prefix'`ename' _rown
|
||
|
}
|
||
|
end
|
||
|
|
||
|
* 20.
|
||
|
* -estadd- subroutine: support for -mlogtest- by Long and Freese
|
||
|
* (see http://www.indiana.edu/~jslsoc/spost.htm)
|
||
|
program define estadd_mlogtest, eclass
|
||
|
version 8.2
|
||
|
local caller : di _caller()
|
||
|
syntax [anything] [ , Prefix(name) Replace Quietly set(passthru) * ]
|
||
|
`quietly' version `caller': mlogtest `anything' , `set' `options'
|
||
|
local rmat: r(matrices)
|
||
|
|
||
|
// check names
|
||
|
if `"`replace'"'=="" {
|
||
|
foreach m in combine lrcomb {
|
||
|
if `:list m in rmat'==0 continue
|
||
|
forv r = 1/`=rowsof(r(`m'))' {
|
||
|
local cat1 = el(r(`m'),`r',1)
|
||
|
local cat2 = el(r(`m'),`r',2)
|
||
|
confirm_new_ename `prefix'`m'_`cat1'_`cat2'_chi2
|
||
|
confirm_new_ename `prefix'`m'_`cat1'_`cat2'_df
|
||
|
confirm_new_ename `prefix'`m'_`cat1'_`cat2'_p
|
||
|
}
|
||
|
}
|
||
|
foreach m in hausman suest smhsiao {
|
||
|
if `:list m in rmat'==0 continue
|
||
|
forv r = 1/`=rowsof(r(`m'))' {
|
||
|
local cat = el(r(`m'),`r',1)
|
||
|
confirm_new_ename `prefix'`m'_`cat'_chi2
|
||
|
confirm_new_ename `prefix'`m'_`cat'_df
|
||
|
confirm_new_ename `prefix'`m'_`cat'_p
|
||
|
}
|
||
|
}
|
||
|
if `"`set'"'!="" {
|
||
|
foreach m in wald lrtest {
|
||
|
if `:list m in rmat'==0 continue
|
||
|
local i 0
|
||
|
local r = rownumb(r(`m'),"set_`++i'")
|
||
|
while(`r'<.) {
|
||
|
confirm_new_ename `prefix'`m'_set`i'_chi2
|
||
|
confirm_new_ename `prefix'`m'_set`i'_df
|
||
|
confirm_new_ename `prefix'`m'_set`i'_p
|
||
|
local r = rownumb(r(`m'),"set_`++i'")
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
foreach m in wald lrtest {
|
||
|
if `:list m in rmat'==0 continue
|
||
|
local r .
|
||
|
if `"`set'"'!="" local r = rownumb(r(`m'),"set_1")-1
|
||
|
if `r'<1 continue
|
||
|
confirm_new_ename `prefix'`m'
|
||
|
}
|
||
|
}
|
||
|
|
||
|
local di_added_scalars `"di _n as txt "added scalars:"'
|
||
|
// combine
|
||
|
foreach m in combine lrcomb {
|
||
|
if `:list m in rmat'==0 continue
|
||
|
`di_added_scalars'
|
||
|
local di_added_scalars
|
||
|
forv r = 1/`=rowsof(r(`m'))' {
|
||
|
local cat1 = el(r(`m'),`r',1)
|
||
|
local cat2 = el(r(`m'),`r',2)
|
||
|
eret scalar `prefix'`m'_`cat1'_`cat2'_chi2 = el(r(`m'),`r',3)
|
||
|
added_scalar `prefix'`m'_`cat1'_`cat2'_chi2
|
||
|
eret scalar `prefix'`m'_`cat1'_`cat2'_df = el(r(`m'),`r',4)
|
||
|
added_scalar `prefix'`m'_`cat1'_`cat2'_df
|
||
|
eret scalar `prefix'`m'_`cat1'_`cat2'_p = el(r(`m'),`r',5)
|
||
|
added_scalar `prefix'`m'_`cat1'_`cat2'_p
|
||
|
}
|
||
|
}
|
||
|
// iia
|
||
|
foreach m in hausman suest smhsiao {
|
||
|
if `:list m in rmat'==0 continue
|
||
|
`di_added_scalars'
|
||
|
local di_added_scalars
|
||
|
if "`m'"=="smhsiao" local skip 2
|
||
|
else local skip 0
|
||
|
forv r = 1/`=rowsof(r(`m'))' {
|
||
|
local cat = el(r(`m'),`r',1)
|
||
|
eret scalar `prefix'`m'_`cat'_chi2 = el(r(`m'),`r',2+`skip')
|
||
|
added_scalar `prefix'`m'_`cat'_chi2
|
||
|
eret scalar `prefix'`m'_`cat'_df = el(r(`m'),`r',3+`skip')
|
||
|
added_scalar `prefix'`m'_`cat'_df
|
||
|
eret scalar `prefix'`m'_`cat'_p = el(r(`m'),`r',4+`skip')
|
||
|
added_scalar `prefix'`m'_`cat'_p
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// wald/lrtest
|
||
|
tempname tmp
|
||
|
if `"`set'"'!="" {
|
||
|
foreach m in wald lrtest {
|
||
|
if `:list m in rmat'==0 continue
|
||
|
local i 0
|
||
|
local r = rownumb(r(`m'),"set_`++i'")
|
||
|
if `r'>=. continue
|
||
|
`di_added_scalars'
|
||
|
local di_added_scalars
|
||
|
while(`r'<.) {
|
||
|
eret scalar `prefix'`m'_set`i'_chi2 = el(r(`m'),`r',1)
|
||
|
added_scalar `prefix'`m'_set`i'_chi2
|
||
|
eret scalar `prefix'`m'_set`i'_df = el(r(`m'),`r',2)
|
||
|
added_scalar `prefix'`m'_set`i'_df
|
||
|
eret scalar `prefix'`m'_set`i'_p = el(r(`m'),`r',3)
|
||
|
added_scalar `prefix'`m'_set`i'_p
|
||
|
local r = rownumb(r(`m'),"set_`++i'")
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
local di_added_matrices `"di _n as txt "added matrices:"'
|
||
|
foreach m in wald lrtest {
|
||
|
if `:list m in rmat'==0 continue
|
||
|
local r .
|
||
|
if `"`set'"'!="" local r = rownumb(r(`m'),"set_1")-1
|
||
|
if `r'<1 continue
|
||
|
`di_added_matrices'
|
||
|
local di_added_matrices
|
||
|
mat `tmp' = r(`m')
|
||
|
mat `tmp' = `tmp'[1..`r',1...]'
|
||
|
eret mat `prefix'`m' = `tmp'
|
||
|
added_matrix `prefix'`m' _rown
|
||
|
}
|
||
|
|
||
|
end
|
||
|
|
||
|
|
||
|
* 21.
|
||
|
* -estadd- subroutine: support for -prchange- by Long and Freese
|
||
|
* (see http://www.indiana.edu/~jslsoc/spost.htm)
|
||
|
program define estadd_prchange
|
||
|
version 8.2
|
||
|
local caller : di _caller()
|
||
|
syntax [anything] [if] [in] [ , Prefix(name) Replace Quietly ///
|
||
|
PAttern(str) Binary(str) Continuous(str) NOAvg Avg split SPLIT2(name) ///
|
||
|
adapt /// old syntax; now works as synonym for noavg
|
||
|
Outcome(passthru) Fromto noBAse * ]
|
||
|
|
||
|
// handle some options
|
||
|
if `"`split2'"'!="" local split split
|
||
|
if "`split'"!="" & `"`outcome'"'!="" {
|
||
|
di as err "split and outcome() not both allowed"
|
||
|
exit 198
|
||
|
}
|
||
|
if "`split'"!="" & `"`avg'`noavg'"'!="" {
|
||
|
di as err "split and avg not both allowed"
|
||
|
exit 198
|
||
|
}
|
||
|
if "`avg'"!="" & `"`outcome'"'!="" {
|
||
|
di as err "avg and outcome not both allowed"
|
||
|
exit 198
|
||
|
}
|
||
|
if "`avg'"!="" & "`noavg'"!="" {
|
||
|
di as err "avg and noavg not both allowed"
|
||
|
exit 198
|
||
|
}
|
||
|
if `"`adapt'"'!="" local noavg noavg
|
||
|
if `:list sizeof binary'>1 | `:list sizeof continuous'>1 error 198
|
||
|
estadd_prchange_ExpandType binary `"`binary'"'
|
||
|
estadd_prchange_ExpandType continuous `"`continuous'"'
|
||
|
if `"`binary'"'=="" local binary 2
|
||
|
if `"`continuous'"'=="" local continuous 4
|
||
|
if `"`pattern'"'!="" {
|
||
|
estadd_prchange_ExpandType pattern `"`pattern'"'
|
||
|
}
|
||
|
|
||
|
// check e(sample)
|
||
|
confirm_esample
|
||
|
|
||
|
// run prchange
|
||
|
capt findfile prchange.ado
|
||
|
if _rc {
|
||
|
di as error "-prchange- from the -spost9_ado- package by Long and Freese required"
|
||
|
di as error `"type {stata "net from http://www.indiana.edu/~jslsoc/stata"}"'
|
||
|
error 499
|
||
|
}
|
||
|
`quietly' version `caller': prchange `anything' `if' `in', `base' `outcome' `fromto' `options'
|
||
|
|
||
|
// determine type of model (ordinal: nomord = 1; nominal: nomord = 2)
|
||
|
local nomord = (r(modeltype)=="typical nomord")
|
||
|
if inlist(`"`e(cmd)'"',"mlogit","mprobit") local nomord = 2
|
||
|
if "`avg'`noavg'"!="" {
|
||
|
if `nomord'==0 {
|
||
|
di as err "avg not allowed with this model"
|
||
|
exit 198
|
||
|
}
|
||
|
}
|
||
|
if !`nomord' & "`split'"!="" {
|
||
|
di as err "split not allowed with this model"
|
||
|
exit 198
|
||
|
}
|
||
|
|
||
|
// determine outcome number (in prchange-returns)
|
||
|
if `"`outcome'"'!="" {
|
||
|
if `nomord' {
|
||
|
forv i = 1/`=colsof(r(catval))' {
|
||
|
if el(r(catval), 1, `i') == r(outcome) {
|
||
|
local outcomenum `i'
|
||
|
continue, break
|
||
|
}
|
||
|
}
|
||
|
if "`outcomenum'"=="" { // should never happen
|
||
|
di as err `"outcome `outcome' not found"'
|
||
|
exit 499
|
||
|
}
|
||
|
}
|
||
|
else {
|
||
|
local outcomenum = colnumb(r(predval), `"`r(outcome)'"')
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// check names
|
||
|
if "`replace'"=="" {
|
||
|
if `"`outcome'"'!="" | "`split'"!="" | `nomord'==0 {
|
||
|
confirm_new_ename `prefix'predval
|
||
|
if `"`outcome'"'!="" | "`split'"!="" {
|
||
|
confirm_new_ename `prefix'outcome
|
||
|
}
|
||
|
}
|
||
|
else {
|
||
|
forv i = 1/`=colsof(r(catval))' {
|
||
|
local theoutcome: di el(r(catval),1,`i')
|
||
|
confirm_new_ename `prefix'predval`theoutcome'
|
||
|
}
|
||
|
}
|
||
|
confirm_new_ename `prefix'delta
|
||
|
confirm_new_ename `prefix'centered
|
||
|
confirm_new_ename `prefix'dc
|
||
|
if "`fromto'"!="" {
|
||
|
confirm_new_ename `prefix'dcfrom
|
||
|
confirm_new_ename `prefix'dcto
|
||
|
}
|
||
|
if "`nobase'"=="" {
|
||
|
confirm_new_ename `prefix'X
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// grab r()-results and post in e()
|
||
|
if "`split'"!="" {
|
||
|
if `"`split2'"'=="" {
|
||
|
local split2 `"`e(_estadd_estimates_name)'"'
|
||
|
if `"`split2'"'=="" {
|
||
|
local split2 `"`e(cmd)'"'
|
||
|
}
|
||
|
local split2 `"`split2'_"'
|
||
|
}
|
||
|
_estadd_prchange_StoreEachOutc `split2' , nomord(`nomord') ///
|
||
|
pattern(`pattern') binary(`binary') continuous(`continuous') ///
|
||
|
`base' `fromto' prefix(`prefix')
|
||
|
}
|
||
|
else {
|
||
|
_estadd_prchange_AddStuffToE, nomord(`nomord') outcome(`outcomenum') ///
|
||
|
pattern(`pattern') binary(`binary') continuous(`continuous') ///
|
||
|
`avg' `noavg' `base' `fromto' prefix(`prefix')
|
||
|
}
|
||
|
end
|
||
|
program estadd_prchange_ExpandType
|
||
|
args name list
|
||
|
foreach l of local list {
|
||
|
local w = length(`"`l'"')
|
||
|
if `"`l'"'==substr("minmax",1,max(2,`w')) local type 1
|
||
|
else if `"`l'"'==substr("01",1,max(1,`w')) local type 2
|
||
|
else if `"`l'"'==substr("delta",1,max(1,`w')) local type 3
|
||
|
else if `"`l'"'==substr("sd",1,max(1,`w')) local type 4
|
||
|
else if `"`l'"'==substr("margefct",1,max(1,`w')) local type 5
|
||
|
else {
|
||
|
di as err `"'`l'' not allowed"'
|
||
|
exit 198
|
||
|
}
|
||
|
local newlist `newlist' `type'
|
||
|
}
|
||
|
c_local `name' `newlist'
|
||
|
end
|
||
|
program define _estadd_prchange_AddStuffToE, eclass
|
||
|
// input add
|
||
|
// ========================= ========================================
|
||
|
// outcome() nomord opt change changenm change# predval outcome
|
||
|
// no 0 - x last
|
||
|
// yes 0 - x x x
|
||
|
// no 1/2 - x all all
|
||
|
// yes 1/2 - x x x
|
||
|
// no 1/2 avg x all
|
||
|
// no 1/2 noavg all all
|
||
|
// nobase=="" => add X, SD, Min, Max
|
||
|
// all models => add centered, delta
|
||
|
syntax , nomord(str) [ pattern(passthru) binary(passthru) continuous(passthru) ///
|
||
|
outcome(str) NOAVG avg nobase fromto prefix(str) ] //
|
||
|
// prepare predval and determine value of outcome
|
||
|
if `"`outcome'"'!="" {
|
||
|
tempname predv
|
||
|
mat `predv' = r(predval)
|
||
|
mat `predv' = `predv'[1...,`outcome']
|
||
|
if `nomord' {
|
||
|
local theoutcome: di el(r(catval),1,`outcome')
|
||
|
}
|
||
|
else {
|
||
|
local theoutcome: colnames `predv'
|
||
|
}
|
||
|
}
|
||
|
// add scalars
|
||
|
di _n as txt "added scalars:"
|
||
|
// - predval and outcome
|
||
|
local cpredval = colsof(r(predval))
|
||
|
if `"`outcome'"'!="" {
|
||
|
ereturn scalar `prefix'predval = `predv'[1,1]
|
||
|
added_scalar `prefix'predval `"`lab_predval'"'
|
||
|
ereturn scalar `prefix'outcome = `theoutcome'
|
||
|
added_scalar `prefix'outcome
|
||
|
}
|
||
|
else if `nomord' { // add all
|
||
|
forv i=1/`cpredval' {
|
||
|
local theoutcome: di el(r(catval),1,`i')
|
||
|
ereturn scalar `prefix'predval`theoutcome' = el(r(predval),1,`i')
|
||
|
added_scalar `prefix'predval`theoutcome'
|
||
|
}
|
||
|
}
|
||
|
else { // add last
|
||
|
ereturn scalar `prefix'predval = el(r(predval),1,`cpredval')
|
||
|
added_scalar `prefix'predval
|
||
|
}
|
||
|
// - delta and centered
|
||
|
ereturn scalar `prefix'delta = r(delta)
|
||
|
added_scalar `prefix'delta
|
||
|
ereturn scalar `prefix'centered = r(centered)
|
||
|
added_scalar `prefix'centered
|
||
|
// add matrices
|
||
|
di _n as txt "added matrices:"
|
||
|
if `nomord'==0 {
|
||
|
if r(modeltype)=="twoeq count" & "`test'"=="" {
|
||
|
local eq: coleq e(b)
|
||
|
local eq: word 1 of `eq'
|
||
|
}
|
||
|
_estadd_prchange_PostMat r(change), prefix(`prefix') ///
|
||
|
name(dc) `pattern' `binary' `continuous' `fromto' eq(`eq')
|
||
|
}
|
||
|
else {
|
||
|
if `"`outcome'"'=="" {
|
||
|
if "`avg'"!="" local nomordmat "r(changemn)"
|
||
|
else {
|
||
|
tempname nomordmat
|
||
|
_estadd_prchange_GatherNomChMat `nomordmat' `noavg'
|
||
|
}
|
||
|
_estadd_prchange_PostMat `nomordmat', prefix(`prefix') ///
|
||
|
name(dc) `pattern' `binary' `continuous' `fromto'
|
||
|
}
|
||
|
else {
|
||
|
if `nomord'==2 {
|
||
|
_estadd_prchange_GetEqnmNomModl `theoutcome'
|
||
|
}
|
||
|
_estadd_prchange_PostMat r(change`theoutcome'), prefix(`prefix') ///
|
||
|
name(dc) `pattern' `binary' `continuous' `fromto' eq(`eq')
|
||
|
}
|
||
|
}
|
||
|
if `"`base'"'=="" {
|
||
|
_estadd_prchange_PostMat r(baseval), prefix(`prefix') name(X)
|
||
|
}
|
||
|
if `"`pattern'"'=="" {
|
||
|
_estadd_prchange_dcNote, prefix(`prefix') name(dc) `binary' `continuous'
|
||
|
}
|
||
|
end
|
||
|
program define _estadd_prchange_dcNote
|
||
|
syntax [ , prefix(str) name(str) binary(str) continuous(str) ]
|
||
|
local res `""{res:minmax} change" "{res:01} change" "{res:delta} change" "{res:sd} change" "{res:margefct}""'
|
||
|
local bres: word `binary' of `res'
|
||
|
local cres: word `continuous' of `res'
|
||
|
di _n as txt `"first row in e(dc) contains:"'
|
||
|
di _n `" `bres' for binary variables"'
|
||
|
di `" `cres' for continuous variables"'
|
||
|
end
|
||
|
program define _estadd_prchange_PostMat, eclass
|
||
|
syntax anything, name(str) [ Fromto eq(str) prefix(str) ///
|
||
|
pattern(passthru) binary(passthru) continuous(passthru) ]
|
||
|
capt confirm matrix `anything'
|
||
|
if _rc exit
|
||
|
tempname tmp1
|
||
|
local nmlist "`name'"
|
||
|
matrix `tmp1' = `anything'
|
||
|
if `"`eq'"'!="" {
|
||
|
mat coleq `tmp1' = `"`eq'"'
|
||
|
}
|
||
|
if `"`pattern'`binary'`continuous'"'!="" {
|
||
|
tempname pattmat
|
||
|
_estadd_prchange_Merge `tmp1', pattmat(`pattmat') `pattern' `binary' `continuous' `fromto'
|
||
|
}
|
||
|
if "`fromto'"!="" {
|
||
|
local nmlist "`nmlist' `name'from `name'to"
|
||
|
tempname tmp tmp2 tmp3
|
||
|
mat rename `tmp1' `tmp'
|
||
|
local r = rowsof(`tmp')
|
||
|
local i = 1
|
||
|
while (`i'<=`r') {
|
||
|
if (`r'-`i')>=2 {
|
||
|
mat `tmp2' = nullmat(`tmp2') \ `tmp'[`i++',1...] // from
|
||
|
mat `tmp3' = nullmat(`tmp3') \ `tmp'[`i++',1...] // to
|
||
|
}
|
||
|
mat `tmp1' = nullmat(`tmp1') \ `tmp'[`i++',1...]
|
||
|
}
|
||
|
mat drop `tmp'
|
||
|
}
|
||
|
local i 0
|
||
|
foreach nm of local nmlist {
|
||
|
local ++i
|
||
|
local rown: rown `tmp`i''
|
||
|
mat rown `tmp`i'' = `rown' // fix problem with leading blanks in equations
|
||
|
ereturn matrix `prefix'`nm' = `tmp`i''
|
||
|
added_matrix `prefix'`nm' _rown
|
||
|
}
|
||
|
if `"`pattmat'"'!="" {
|
||
|
ereturn matrix `prefix'pattern = `pattmat'
|
||
|
added_matrix `prefix'pattern
|
||
|
}
|
||
|
end
|
||
|
program define _estadd_prchange_Merge
|
||
|
syntax name(name=tmp1) [, pattmat(str) pattern(str) binary(str) continuous(str) fromto ]
|
||
|
tempname tmp
|
||
|
mat rename `tmp1' `tmp'
|
||
|
local r = cond("`fromto'"!="", 3, 1)
|
||
|
mat `tmp1' = `tmp'[1..`r',1...]*.
|
||
|
mat `pattmat' = `tmp'[1,1...]*.
|
||
|
local rtot = rowsof(`tmp')
|
||
|
mat rown `tmp1' = main
|
||
|
mat rown `pattmat' = :type
|
||
|
local vars: colnames `tmp1'
|
||
|
local eqs: coleq `tmp1', quoted
|
||
|
local j 0
|
||
|
foreach var of local vars {
|
||
|
local ++j
|
||
|
gettoken eq eqs : eqs
|
||
|
if `"`eq'"'!=`"`lasteq'"' gettoken type rest : pattern
|
||
|
else gettoken type rest : rest
|
||
|
local lasteq `"`eq'"'
|
||
|
if `"`type'"'=="" {
|
||
|
capt assert `var'==0|`var'==1 if e(sample) & `var'<.
|
||
|
if _rc local type `continuous'
|
||
|
else local type `binary'
|
||
|
}
|
||
|
local ii = (`type'-1)*`r'+1
|
||
|
forv i = 1/`r' {
|
||
|
if `r'>1 & `i'<3 & `ii'>=`rtot' {
|
||
|
mat `tmp1'[`i',`j'] = .z
|
||
|
}
|
||
|
else {
|
||
|
mat `tmp1'[`i',`j'] = `tmp'[`ii++',`j']
|
||
|
}
|
||
|
}
|
||
|
mat `pattmat'[1,`j'] = `type'
|
||
|
}
|
||
|
mat `tmp1' = `tmp1' \ `tmp'
|
||
|
end
|
||
|
program define _estadd_prchange_GatherNomChMat
|
||
|
args mat noavg
|
||
|
local cmd `"`e(cmd)'"'
|
||
|
tempname tmpmat
|
||
|
if `"`noavg'"'=="" {
|
||
|
mat `tmpmat' = r(changemn)
|
||
|
mat coleq `tmpmat' = `"Avg|Chg|"'
|
||
|
mat `mat' = `tmpmat'
|
||
|
}
|
||
|
if `"`cmd'"'=="mlogit" {
|
||
|
if c(stata_version) < 9 local outcat cat
|
||
|
else local outcat out
|
||
|
local k_cat = e(k_`outcat')
|
||
|
local eqnames `"`e(eqnames)'"'
|
||
|
if `k_cat'>`:list sizeof eqnames' { // no base equation
|
||
|
local ibase = e(ibase`outcat')
|
||
|
local baselab `"`e(baselab)'"'
|
||
|
if `"`baselab'"'=="" {
|
||
|
local baselab `"`e(base`outcat')'"'
|
||
|
}
|
||
|
forv i = 1/`k_cat' {
|
||
|
if `i'==`ibase' {
|
||
|
local eq `"`"`baselab'"'"'
|
||
|
}
|
||
|
else gettoken eq eqnames : eqnames, quotes
|
||
|
local temp `"`temp' `eq'"'
|
||
|
}
|
||
|
local eqnames: list retok temp
|
||
|
}
|
||
|
local i 0
|
||
|
foreach eq of local eqnames {
|
||
|
local ++i
|
||
|
local theoutcome: di el(e(`outcat'),1,`i')
|
||
|
mat `tmpmat' = r(change`theoutcome')
|
||
|
mat coleq `tmpmat' = `"`eq'"'
|
||
|
mat `mat' = nullmat(`mat'), `tmpmat'
|
||
|
}
|
||
|
}
|
||
|
else if `"`cmd'"'=="mprobit" {
|
||
|
local eqnames `"`e(outeqs)'"'
|
||
|
local i 0
|
||
|
foreach eq of local eqnames {
|
||
|
local ++i
|
||
|
local theoutcome: di el(e(outcomes),`i',1)
|
||
|
mat `tmpmat' = r(change`theoutcome')
|
||
|
mat coleq `tmpmat' = `"`eq'"'
|
||
|
mat `mat' = nullmat(`mat'), `tmpmat'
|
||
|
}
|
||
|
}
|
||
|
else { // ordered models
|
||
|
local eqnames : colnames r(catval)
|
||
|
local i 0
|
||
|
foreach eq of local eqnames {
|
||
|
local ++i
|
||
|
local theoutcome: di el(r(catval),1,`i')
|
||
|
mat `tmpmat' = r(change`theoutcome')
|
||
|
mat coleq `tmpmat' = `"`eq'"'
|
||
|
mat `mat' = nullmat(`mat'), `tmpmat'
|
||
|
}
|
||
|
}
|
||
|
end
|
||
|
program define _estadd_prchange_GetEqnmNomModl
|
||
|
args theoutcome
|
||
|
local cmd `"`e(cmd)'"'
|
||
|
if `"`cmd'"'=="mlogit" {
|
||
|
if c(stata_version) < 9 local outcat cat
|
||
|
else local outcat out
|
||
|
local k_cat = e(k_`outcat')
|
||
|
local eqnames `"`e(eqnames)'"'
|
||
|
local nobase = (`k_cat'>`:list sizeof eqnames')
|
||
|
if `nobase' {
|
||
|
local ibase = e(ibase`outcat')
|
||
|
local baselab `"`e(baselab)'"'
|
||
|
}
|
||
|
forv i = 1/`k_cat' {
|
||
|
if `nobase' {
|
||
|
if `i'==`ibase' {
|
||
|
local eq `"`baselab'"'
|
||
|
}
|
||
|
else gettoken eq eqnames : eqnames
|
||
|
}
|
||
|
else gettoken eq eqnames : eqnames
|
||
|
if el(e(`outcat'),1,`i')==`theoutcome' {
|
||
|
local value `"`eq'"'
|
||
|
continue, break
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
else if `"`cmd'"'=="mprobit" {
|
||
|
local eqnames `"`e(outeqs)'"'
|
||
|
local i 0
|
||
|
foreach eq of local eqnames {
|
||
|
if el(e(outcomes),`++i',1)==`theoutcome' {
|
||
|
local value `"`eq'"'
|
||
|
continue, break
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
if `"`value'"'=="" local value `theoutcome'
|
||
|
c_local eq `"`value'"'
|
||
|
end
|
||
|
program define _estadd_prchange_StoreEachOutc // only for nomord models
|
||
|
syntax anything [, nomord(str) nobase fromto prefix(passthru) ///
|
||
|
pattern(passthru) binary(passthru) continuous(passthru) ]
|
||
|
// backup estimates
|
||
|
tempname hcurrent
|
||
|
_est hold `hcurrent', copy restore estsystem
|
||
|
if `"`nomord'"'=="2" { // backup b and V
|
||
|
tempname b bi V Vi
|
||
|
mat `b' = e(b)
|
||
|
mat `V' = e(V)
|
||
|
}
|
||
|
// cycle through categories
|
||
|
local k_kat = colsof(r(predval))
|
||
|
tempname catval catvali
|
||
|
mat `catval' = r(catval)
|
||
|
forv i=1/`k_kat' {
|
||
|
mat `catvali' = `catval'[1...,`i']
|
||
|
local catlabi: colnames `catvali'
|
||
|
local catnumi: di `catvali'[1,1]
|
||
|
if `"`nomord'"'=="2" {
|
||
|
_estadd_prchange_GetEqnmNomModl `catnumi'
|
||
|
if colnumb(`b', `"`eq':"')<. {
|
||
|
mat `bi' = `b'[1...,`"`eq':"']
|
||
|
mat `Vi' = `V'[`"`eq':"',`"`eq':"']
|
||
|
}
|
||
|
else { // base outcome; get first eq and set zero
|
||
|
local tmp : coleq `b', q
|
||
|
gettoken tmp : tmp
|
||
|
mat `bi' = `b'[1...,`"`tmp':"'] * 0
|
||
|
mat `Vi' = `V'[`"`tmp':"',`"`tmp':"'] * 0
|
||
|
}
|
||
|
mat coleq `bi' = ""
|
||
|
mat coleq `Vi' = ""
|
||
|
mat roweq `Vi' = ""
|
||
|
erepost b=`bi' V=`Vi'
|
||
|
}
|
||
|
`qui' _estadd_prchange_AddStuffToE, nomord(1) outcome(`i') ///
|
||
|
`base' `fromto' `pattern' `binary' `continuous' `prefix'
|
||
|
`qui' di ""
|
||
|
local qui qui
|
||
|
_eststo `anything'`catnumi', title(`"`catlabi'"') // store without e(sample)
|
||
|
di as txt "results for outcome " as res `catnumi' ///
|
||
|
as txt " stored as " as res "`anything'`catnumi'"
|
||
|
}
|
||
|
// retore estimates
|
||
|
_est unhold `hcurrent'
|
||
|
end
|
||
|
|
||
|
* 22.
|
||
|
* -estadd- subroutine: support for -prvalue- by Long and Freese
|
||
|
* (see http://www.indiana.edu/~jslsoc/spost.htm)
|
||
|
program define estadd_prvalue, eclass
|
||
|
version 9.2
|
||
|
local caller : di _caller()
|
||
|
syntax [anything] [if] [in] [ , Prefix(passthru) Replace Quietly ///
|
||
|
LABel(str) Title(passthru) swap Diff * ]
|
||
|
|
||
|
// post
|
||
|
if `"`anything'"'!="" {
|
||
|
gettoken post post2 : anything
|
||
|
if `"`post'"'!="post" {
|
||
|
di as err `"`post' not allowed"'
|
||
|
exit 198
|
||
|
}
|
||
|
else if `"`label'"'!="" {
|
||
|
di as err "label() not allowed"
|
||
|
exit 198
|
||
|
}
|
||
|
_estadd_prvalue_Post `post2' `if' `in', `prefix' `replace' `quietly' ///
|
||
|
`title' `swap' `diff' `options'
|
||
|
exit
|
||
|
}
|
||
|
else if `"`title'"'!="" {
|
||
|
di as err "title() not allowed"
|
||
|
exit 198
|
||
|
}
|
||
|
else if "`swap'"!="" {
|
||
|
di as err "swap not allowed"
|
||
|
exit 198
|
||
|
}
|
||
|
|
||
|
// look for e(sample)
|
||
|
confirm_esample
|
||
|
|
||
|
// run prvalue
|
||
|
capt findfile prvalue.ado
|
||
|
if _rc {
|
||
|
di as error "-prvalue- from the -spost9_ado- package by Long and Freese required"
|
||
|
di as error `"type {stata "net from http://www.indiana.edu/~jslsoc/stata"}"'
|
||
|
error 499
|
||
|
}
|
||
|
`quietly' version `caller': prvalue `if' `in', `diff' `options'
|
||
|
|
||
|
// append?
|
||
|
capture confirm existence `e(_estadd_prvalue)'
|
||
|
local append = (_rc==0) & ("`replace'"=="")
|
||
|
tempname prvalue prvalue_x prvalue_x2
|
||
|
if `append' {
|
||
|
mat `prvalue' = e(_estadd_prvalue)
|
||
|
mat `prvalue_x' = e(_estadd_prvalue_x)
|
||
|
capt mat `prvalue_x2' = e(_estadd_prvalue_x2)
|
||
|
local ires = rowsof(`prvalue') + 1
|
||
|
}
|
||
|
else local ires 1
|
||
|
if `"`label'"'=="" {
|
||
|
local label "pred`ires'"
|
||
|
}
|
||
|
else {
|
||
|
local label = substr(`"`label'"', 1, 30) // 30 characters max
|
||
|
local problemchars `": . `"""'"'
|
||
|
foreach char of local problemchars {
|
||
|
local label: subinstr local label `"`char'"' "_", all
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// collect results
|
||
|
tempname pred
|
||
|
mat `pred' = r(pred)
|
||
|
if `"`diff'"'!="" {
|
||
|
_estadd_prvalue_GetRidOfD `pred'
|
||
|
}
|
||
|
_estadd_prvalue_ReshapePred `pred', label(`label')
|
||
|
_estadd_prvalue_AddPred `prvalue' `pred' `append'
|
||
|
_estadd_prvalue_AddX `prvalue_x', label(`label')
|
||
|
capture confirm matrix r(x2)
|
||
|
local hasx2 = _rc==0
|
||
|
if `hasx2' {
|
||
|
_estadd_prvalue_AddX `prvalue_x2', label(`label') two
|
||
|
}
|
||
|
|
||
|
// post in e()
|
||
|
di as txt _n cond(`append',"updated","added") " matrices:"
|
||
|
ereturn matrix _estadd_prvalue = `prvalue'
|
||
|
added_matrix _estadd_prvalue
|
||
|
ereturn matrix _estadd_prvalue_x = `prvalue_x'
|
||
|
added_matrix _estadd_prvalue_x
|
||
|
if `hasx2' {
|
||
|
ereturn matrix _estadd_prvalue_x2 = `prvalue_x2'
|
||
|
added_matrix _estadd_prvalue_x2
|
||
|
}
|
||
|
end
|
||
|
program _estadd_prvalue_GetRidOfD
|
||
|
args pred
|
||
|
local coln: colnames `pred'
|
||
|
local firstcol: word 1 of `coln'
|
||
|
local nfirstcol = substr("`firstcol'",2,.)
|
||
|
local coln : subinstr local coln "`firstcol'" "`nfirstcol'" , word
|
||
|
mat coln `pred' = `coln'
|
||
|
end
|
||
|
program _estadd_prvalue_ReshapePred
|
||
|
syntax anything, label(str)
|
||
|
tempname tmp res
|
||
|
local r = rowsof(`anything')
|
||
|
forv i=1/`r' {
|
||
|
mat `tmp' = `anything'[`i',1...]
|
||
|
local nm: rownames `tmp'
|
||
|
mat coleq `tmp' = `"`nm'"'
|
||
|
mat `res' = nullmat(`res'), `tmp'
|
||
|
}
|
||
|
mat rown `res' = `"`label'"'
|
||
|
mat `anything' = `res'
|
||
|
end
|
||
|
program _estadd_prvalue_AddPred
|
||
|
args prvalue pred append
|
||
|
if `append' {
|
||
|
local coln1: colfullnames `prvalue'
|
||
|
local coln2: colfullnames `pred'
|
||
|
if `"`coln1'"'!=`"`coln2'"' {
|
||
|
di as err "incompatible prvalue results"
|
||
|
exit 498
|
||
|
}
|
||
|
}
|
||
|
mat `prvalue' = nullmat(`prvalue') \ `pred'
|
||
|
end
|
||
|
program _estadd_prvalue_AddX
|
||
|
syntax anything, label(str) [ two ]
|
||
|
if "`two'"!="" local two 2
|
||
|
tempname tmp
|
||
|
mat `tmp' = r(x`two')
|
||
|
mat rown `tmp' = `"`label'"'
|
||
|
mat `anything' = nullmat(`anything') \ `tmp'
|
||
|
end
|
||
|
program _estadd_prvalue_Post, eclass
|
||
|
syntax [name(name=post2)] [ , Prefix(name) Replace Quietly ///
|
||
|
Title(passthru) swap ]
|
||
|
capture confirm matrix e(_estadd_prvalue)
|
||
|
if _rc {
|
||
|
di as err "prvalue results not found"
|
||
|
exit 498
|
||
|
}
|
||
|
// backup estimates
|
||
|
tempname hcurrent
|
||
|
_est hold `hcurrent', copy restore estsystem
|
||
|
local cmd = e(cmd)
|
||
|
local depvar = e(depvar)
|
||
|
local N = e(N)
|
||
|
local estname `"`e(_estadd_estimates_name)'"'
|
||
|
|
||
|
// get results
|
||
|
tempname prvalue prvalue_x prvalue_x2
|
||
|
mat `prvalue' = e(_estadd_prvalue)
|
||
|
mat `prvalue_x' = e(_estadd_prvalue_x)
|
||
|
capture confirm matrix e(_estadd_prvalue_x2)
|
||
|
local hasx2 = _rc==0
|
||
|
if `hasx2' {
|
||
|
mat `prvalue_x2' = e(_estadd_prvalue_x2)
|
||
|
}
|
||
|
|
||
|
// return prvalues
|
||
|
tempname tmp tmp2 b se
|
||
|
if "`swap'"=="" {
|
||
|
local eqs: coleq `prvalue', q
|
||
|
local eqs: list uniq eqs
|
||
|
foreach eq of local eqs {
|
||
|
mat `tmp' = `prvalue'[1...,`"`eq':"']
|
||
|
mat `tmp2' = `tmp'[1...,1]'
|
||
|
mat coleq `tmp2' = `"`eq'"'
|
||
|
mat roweq `tmp2' = ""
|
||
|
mat `b' = nullmat(`b'), `tmp2'
|
||
|
mat `tmp2' = `tmp'[1...,`"`eq':SE"']'
|
||
|
mat coleq `tmp2' = `"`eq'"'
|
||
|
mat roweq `tmp2' = ""
|
||
|
mat `se' = nullmat(`se'), `tmp2'
|
||
|
}
|
||
|
mat drop `tmp' `tmp2'
|
||
|
}
|
||
|
else {
|
||
|
local r = rowsof(`prvalue')
|
||
|
local c = colsof(`prvalue')
|
||
|
local coln: colnames `prvalue'
|
||
|
local eqs: coleq `prvalue', q
|
||
|
mat coln `prvalue' = `eqs'
|
||
|
mat coleq `prvalue' = `coln'
|
||
|
local coln: list uniq coln
|
||
|
local ncol: list sizeof coln
|
||
|
local icol: list posof "SE" in coln
|
||
|
forv i=1/`r' {
|
||
|
mat `tmp' = `prvalue'[`i',1...]
|
||
|
local labl : rownames `tmp'
|
||
|
forv j=1(`ncol')`c' {
|
||
|
mat `tmp2' = nullmat(`tmp2'), `tmp'[1...,`j']
|
||
|
}
|
||
|
mat coleq `tmp2' = `"`labl'"'
|
||
|
mat `b' = nullmat(`b'), `tmp2'
|
||
|
mat drop `tmp2'
|
||
|
forv j=`icol'(`ncol')`c' {
|
||
|
mat `tmp2' = nullmat(`tmp2'), `tmp'[1...,`j']
|
||
|
}
|
||
|
mat coleq `tmp2' = `"`labl'"'
|
||
|
mat `se' = nullmat(`se'), `tmp2'
|
||
|
mat drop `tmp2'
|
||
|
}
|
||
|
mat drop `tmp'
|
||
|
}
|
||
|
ereturn post `b', obs(`N')
|
||
|
ereturn local model "`cmd'"
|
||
|
ereturn local cmd "estadd_prvalue"
|
||
|
ereturn local depvar "`depvar'"
|
||
|
di as txt _n "scalars:"
|
||
|
added_scalar N
|
||
|
di as txt _n "macros:"
|
||
|
added_macro depvar
|
||
|
added_macro cmd
|
||
|
added_macro model
|
||
|
added_macro properties
|
||
|
di as txt _n "matrices:"
|
||
|
added_matrix b "predictions"
|
||
|
ereturn matrix se = `se'
|
||
|
added_matrix se "standard errors"
|
||
|
local istat 0
|
||
|
foreach stat in LB UB Category Cond {
|
||
|
local elabel: word `++istat' of "lower CI bounds" "upper CI bounds" ///
|
||
|
"outcome values" "conditional predictions"
|
||
|
if "`swap'"=="" {
|
||
|
foreach eq of local eqs {
|
||
|
local colnumb = colnumb(`prvalue',`"`eq':`stat'"')
|
||
|
if `colnumb'>=. continue
|
||
|
mat `tmp2' = `prvalue'[1...,`colnumb']'
|
||
|
mat coleq `tmp2' = `"`eq'"'
|
||
|
mat roweq `tmp2' = ""
|
||
|
mat `tmp' = nullmat(`tmp'), `tmp2'
|
||
|
}
|
||
|
}
|
||
|
else {
|
||
|
local icol: list posof "`stat'" in coln
|
||
|
if `icol'==0 continue
|
||
|
forv i=1/`r' {
|
||
|
mat `tmp2' = `prvalue'[`i',1...]
|
||
|
local labl : rownames `tmp2'
|
||
|
mat coleq `tmp2' = `"`labl'"'
|
||
|
forv j=`icol'(`ncol')`c' {
|
||
|
mat `tmp' = nullmat(`tmp'), `tmp2'[1...,`j']
|
||
|
}
|
||
|
}
|
||
|
mat drop `tmp2'
|
||
|
}
|
||
|
capt confirm matrix `tmp'
|
||
|
if _rc==0 {
|
||
|
ereturn matrix `prefix'`stat' = `tmp'
|
||
|
added_matrix `prefix'`stat' "`elabel'"
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// return x-values
|
||
|
matrix `prvalue_x' = `prvalue_x''
|
||
|
ereturn matrix `prefix'X = `prvalue_x'
|
||
|
added_matrix `prefix'X _rown
|
||
|
if `hasx2' {
|
||
|
matrix `prvalue_x2' = `prvalue_x2''
|
||
|
ereturn matrix `prefix'X2 = `prvalue_x2'
|
||
|
added_matrix `prefix'X2 _rown
|
||
|
}
|
||
|
|
||
|
// store
|
||
|
if "`post2'"!="" {
|
||
|
_eststo `estname'`post2', `title'
|
||
|
di as txt _n "results stored as " as res "`estname'`post2'"
|
||
|
}
|
||
|
else if `"`title'"'!="" {
|
||
|
estimates change ., `title'
|
||
|
}
|
||
|
|
||
|
// retore estimates
|
||
|
if "`post2'"!="" {
|
||
|
_est unhold `hcurrent'
|
||
|
}
|
||
|
else {
|
||
|
_est unhold `hcurrent', not
|
||
|
}
|
||
|
end
|
||
|
|
||
|
* 23.
|
||
|
* -estadd- subroutine: support for -asprvalue- by Long and Freese
|
||
|
* (see http://www.indiana.edu/~jslsoc/spost.htm)
|
||
|
program define estadd_asprvalue, eclass
|
||
|
version 9.2
|
||
|
local caller : di _caller()
|
||
|
syntax [anything] [ , Prefix(passthru) Replace Quietly ///
|
||
|
LABel(str) Title(passthru) swap * ]
|
||
|
|
||
|
// post
|
||
|
if `"`anything'"'!="" {
|
||
|
gettoken post post2 : anything
|
||
|
if `"`post'"'!="post" {
|
||
|
di as err `"`post' not allowed"'
|
||
|
exit 198
|
||
|
}
|
||
|
else if `"`label'"'!="" {
|
||
|
di as err "label() not allowed"
|
||
|
exit 198
|
||
|
}
|
||
|
_estadd_asprvalue_Post `post2' , `prefix' `replace' `quietly' ///
|
||
|
`title' `swap' `options'
|
||
|
exit
|
||
|
}
|
||
|
else if `"`title'"'!="" {
|
||
|
di as err "title() not allowed"
|
||
|
exit 198
|
||
|
}
|
||
|
else if "`swap'"!="" {
|
||
|
di as err "swap not allowed"
|
||
|
exit 198
|
||
|
}
|
||
|
|
||
|
// look for e(sample)
|
||
|
confirm_esample
|
||
|
|
||
|
// run prvalue
|
||
|
capt findfile asprvalue.ado
|
||
|
if _rc {
|
||
|
di as error "-asprvalue- from the -spost9_ado- package by Long and Freese required"
|
||
|
di as error `"type {stata "net from http://www.indiana.edu/~jslsoc/stata"}"'
|
||
|
error 499
|
||
|
}
|
||
|
`quietly' version `caller': asprvalue , `options'
|
||
|
|
||
|
// append?
|
||
|
capture confirm existence `e(_estadd_asprval)'
|
||
|
local append = (_rc==0) & ("`replace'"=="")
|
||
|
tempname asprval asprval_asv asprval_csv
|
||
|
if `append' {
|
||
|
mat `asprval' = e(_estadd_asprval)
|
||
|
capt mat `asprval_asv' = e(_estadd_asprval_asv)
|
||
|
capt mat `asprval_csv' = e(_estadd_asprval_csv)
|
||
|
local ires = rowsof(`asprval') + 1
|
||
|
}
|
||
|
else local ires 1
|
||
|
if `"`label'"'=="" {
|
||
|
local label "pred`ires'"
|
||
|
}
|
||
|
else {
|
||
|
local label = substr(`"`label'"', 1, 30) // 30 characters max
|
||
|
local problemchars `": . `"""'"'
|
||
|
foreach char of local problemchars {
|
||
|
local label: subinstr local label `"`char'"' "_", all
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// collect results
|
||
|
tempname res
|
||
|
mat `res' = r(p)
|
||
|
_estadd_asprvalue_Reshape `res', label(`label')
|
||
|
_estadd_asprvalue_Add `asprval' `res' `append'
|
||
|
capture confirm matrix r(asv)
|
||
|
local hasasv = _rc==0
|
||
|
if `hasasv' {
|
||
|
mat `res' = r(asv)
|
||
|
_estadd_asprvalue_Reshape `res', label(`label')
|
||
|
_estadd_asprvalue_Add `asprval_asv' `res' `append'
|
||
|
}
|
||
|
capture confirm matrix r(csv)
|
||
|
local hascsv = _rc==0
|
||
|
if `hascsv' {
|
||
|
_estadd_asprvalue_AddCsv `asprval_csv', label(`label')
|
||
|
}
|
||
|
|
||
|
// post in e()
|
||
|
di as txt _n cond(`append',"updated","added") " matrices:"
|
||
|
ereturn matrix _estadd_asprval = `asprval'
|
||
|
added_matrix _estadd_asprval
|
||
|
if `hasasv' {
|
||
|
ereturn matrix _estadd_asprval_asv = `asprval_asv'
|
||
|
added_matrix _estadd_asprval_asv
|
||
|
}
|
||
|
if `hascsv' {
|
||
|
ereturn matrix _estadd_asprval_csv = `asprval_csv'
|
||
|
added_matrix _estadd_asprval_csv
|
||
|
}
|
||
|
end
|
||
|
program _estadd_asprvalue_Reshape
|
||
|
syntax anything, label(str)
|
||
|
tempname tmp res
|
||
|
local r = rowsof(`anything')
|
||
|
forv i=1/`r' {
|
||
|
mat `tmp' = `anything'[`i',1...]
|
||
|
local nm: rownames `tmp'
|
||
|
mat coleq `tmp' = `"`nm'"'
|
||
|
mat `res' = nullmat(`res'), `tmp'
|
||
|
}
|
||
|
mat rown `res' = `"`label'"'
|
||
|
mat `anything' = `res'
|
||
|
end
|
||
|
program _estadd_asprvalue_Add
|
||
|
args master using append
|
||
|
if `append' {
|
||
|
local coln1: colfullnames `master'
|
||
|
local coln2: colfullnames `using'
|
||
|
if `"`coln1'"'!=`"`coln2'"' {
|
||
|
di as err "incompatible asprvalue results"
|
||
|
exit 498
|
||
|
}
|
||
|
}
|
||
|
mat `master' = nullmat(`master') \ `using'
|
||
|
end
|
||
|
program _estadd_asprvalue_AddCsv
|
||
|
syntax anything, label(str)
|
||
|
tempname tmp
|
||
|
mat `tmp' = r(csv)
|
||
|
mat rown `tmp' = `"`label'"'
|
||
|
mat `anything' = nullmat(`anything') \ `tmp'
|
||
|
end
|
||
|
program _estadd_asprvalue_Post, eclass
|
||
|
syntax [name(name=post2)] [ , Prefix(name) Replace Quietly ///
|
||
|
Title(passthru) swap ]
|
||
|
capture confirm matrix e(_estadd_asprval)
|
||
|
if _rc {
|
||
|
di as err "asprvalue results not found"
|
||
|
exit 498
|
||
|
}
|
||
|
|
||
|
// backup estimates
|
||
|
tempname hcurrent
|
||
|
_est hold `hcurrent', copy restore estsystem
|
||
|
local cmd = e(cmd)
|
||
|
local depvar = e(depvar)
|
||
|
local N = e(N)
|
||
|
local estname `"`e(_estadd_estimates_name)'"'
|
||
|
|
||
|
// get results
|
||
|
tempname asprval asprval_asv asprval_csv
|
||
|
mat `asprval' = e(_estadd_asprval)
|
||
|
capture confirm matrix e(_estadd_asprval_asv)
|
||
|
local hasasv = _rc==0
|
||
|
if `hasasv' {
|
||
|
mat `asprval_asv' = e(_estadd_asprval_asv)
|
||
|
}
|
||
|
capture confirm matrix e(_estadd_asprval_csv)
|
||
|
local hascsv = _rc==0
|
||
|
if `hascsv' {
|
||
|
mat `asprval_csv' = e(_estadd_asprval_csv)
|
||
|
}
|
||
|
|
||
|
// return predictions
|
||
|
tempname tmp tmp2 b
|
||
|
if "`swap'"=="" {
|
||
|
local eqs: coleq `asprval', q
|
||
|
local eqs: list uniq eqs
|
||
|
foreach eq of local eqs {
|
||
|
mat `tmp' = `asprval'[1...,`"`eq':"']
|
||
|
mat `tmp2' = `tmp'[1...,1]'
|
||
|
mat coleq `tmp2' = `"`eq'"'
|
||
|
mat roweq `tmp2' = ""
|
||
|
mat `b' = nullmat(`b'), `tmp2'
|
||
|
}
|
||
|
mat drop `tmp' `tmp2'
|
||
|
}
|
||
|
else {
|
||
|
local r = rowsof(`asprval')
|
||
|
local coln: colnames `asprval'
|
||
|
local eqs: coleq `asprval', q
|
||
|
mat coln `asprval' = `eqs'
|
||
|
forv i=1/`r' {
|
||
|
mat `tmp' = `asprval'[`i',1...]
|
||
|
local labl : rownames `tmp'
|
||
|
mat coleq `tmp' = `"`labl'"'
|
||
|
mat `b' = nullmat(`b'), `tmp'
|
||
|
}
|
||
|
mat drop `tmp'
|
||
|
}
|
||
|
ereturn post `b', obs(`N')
|
||
|
ereturn local model "`cmd'"
|
||
|
ereturn local cmd "estadd_asprvalue"
|
||
|
ereturn local depvar "`depvar'"
|
||
|
di as txt _n "scalars:"
|
||
|
added_scalar N
|
||
|
di as txt _n "macros:"
|
||
|
added_macro depvar
|
||
|
added_macro cmd
|
||
|
added_macro model
|
||
|
added_macro properties
|
||
|
di as txt _n "matrices:"
|
||
|
added_matrix b "predictions"
|
||
|
|
||
|
// return asv-values
|
||
|
if `hasasv' {
|
||
|
if "`swap'"=="" {
|
||
|
local vars: coleq `asprval_asv'
|
||
|
local vars: list uniq vars
|
||
|
local cats: colnames `asprval_asv'
|
||
|
local cats: list uniq cats
|
||
|
foreach var of local vars {
|
||
|
foreach cat of local cats {
|
||
|
mat `tmp2' = `asprval_asv'[1...,`"`var':`cat'"']'
|
||
|
mat coleq `tmp2' = `"`cat'"'
|
||
|
mat roweq `tmp2' = ""
|
||
|
mat `tmp' = nullmat(`tmp'), `tmp2'
|
||
|
}
|
||
|
mat rown `tmp' = `"`var'"'
|
||
|
mat `b' = nullmat(`b') \ `tmp'
|
||
|
mat drop `tmp'
|
||
|
}
|
||
|
}
|
||
|
else {
|
||
|
local r = rowsof(`asprval_asv')
|
||
|
local vars: coleq `asprval_asv'
|
||
|
local vars: list uniq vars
|
||
|
forv i=1/`r' {
|
||
|
foreach var of local vars {
|
||
|
mat `tmp2' = `asprval_asv'[`i',`"`var':"']
|
||
|
local lbl: rownames `tmp2'
|
||
|
mat coleq `tmp2' = `"`lbl'"'
|
||
|
mat rown `tmp2' = `"`var'"'
|
||
|
mat `tmp' = nullmat(`tmp') \ `tmp2'
|
||
|
}
|
||
|
mat `b' = nullmat(`b') , `tmp'
|
||
|
mat drop `tmp'
|
||
|
}
|
||
|
}
|
||
|
ereturn matrix `prefix'asv = `b'
|
||
|
added_matrix `prefix'asv _rown
|
||
|
}
|
||
|
// return csv-values
|
||
|
if `hascsv' {
|
||
|
matrix `asprval_csv' = `asprval_csv''
|
||
|
ereturn matrix `prefix'csv = `asprval_csv'
|
||
|
added_matrix `prefix'csv _rown
|
||
|
}
|
||
|
|
||
|
// store
|
||
|
if "`post2'"!="" {
|
||
|
_eststo `estname'`post2', `title'
|
||
|
di as txt _n "results stored as " as res "`estname'`post2'"
|
||
|
}
|
||
|
else if `"`title'"'!="" {
|
||
|
estimates change ., `title'
|
||
|
}
|
||
|
|
||
|
// retore estimates
|
||
|
if "`post2'"!="" {
|
||
|
_est unhold `hcurrent'
|
||
|
}
|
||
|
else {
|
||
|
_est unhold `hcurrent', not
|
||
|
}
|
||
|
end
|
||
|
|
||
|
* 24. estadd_margins
|
||
|
program define estadd_margins, eclass
|
||
|
version 11.0
|
||
|
local caller : di _caller()
|
||
|
syntax [ anything(everything equalok)] [fw aw iw pw] [, Prefix(name) Replace Quietly * ]
|
||
|
|
||
|
// set default prefix
|
||
|
if "`prefix'"=="" local prefix "margins_"
|
||
|
|
||
|
// compute and return the results
|
||
|
if `"`weight'`exp'"'!="" local wgtexp `"[`weight'`exp']"'
|
||
|
`quietly' version `caller': margins `anything' `wgtexp', `options'
|
||
|
|
||
|
// check names
|
||
|
local rscalars: r(scalars)
|
||
|
local rmacros: r(macros)
|
||
|
local rmatrices: r(matrices)
|
||
|
local rmatrices: subinstr local rmatrices "V" "se", word
|
||
|
if "`replace'"=="" {
|
||
|
foreach nmlist in rscalars rmacros rmatrices {
|
||
|
foreach name of local `nmlist' {
|
||
|
confirm_new_ename `prefix'`name'
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// add results
|
||
|
di as txt _n "added scalars:"
|
||
|
foreach name of local rscalars {
|
||
|
ereturn scalar `prefix'`name' = r(`name')
|
||
|
added_scalar `prefix'`name'
|
||
|
}
|
||
|
di as txt _n "added macros:"
|
||
|
foreach name of local rmacros {
|
||
|
ereturn local `prefix'`name' `"`r(`name')'"'
|
||
|
added_macro `prefix'`name'
|
||
|
}
|
||
|
di as txt _n "added matrices:"
|
||
|
tempname tmpmat
|
||
|
foreach name of local rmatrices {
|
||
|
if "`name'"=="se" {
|
||
|
mat `tmpmat' = vecdiag(r(V))
|
||
|
forv i = 1/`=colsof(`tmpmat')' {
|
||
|
mat `tmpmat'[1,`i'] = sqrt(`tmpmat'[1,`i'])
|
||
|
}
|
||
|
}
|
||
|
else {
|
||
|
mat `tmpmat' = r(`name')
|
||
|
}
|
||
|
eret matrix `prefix'`name' = `tmpmat'
|
||
|
added_matrix `prefix'`name'
|
||
|
}
|
||
|
end
|
||
|
|
||
|
* 99.
|
||
|
* copy of erepost.ado, version 1.0.1, Ben Jann, 30jul2007
|
||
|
* used by estadd_listcoef and estadd_prchange
|
||
|
prog erepost, eclass
|
||
|
version 8.2
|
||
|
syntax [anything(equalok)] [, cmd(str) noEsample Esample2(varname) REName ///
|
||
|
Obs(passthru) Dof(passthru) PROPerties(passthru) * ]
|
||
|
if "`esample'"!="" & "`esample2'"!="" {
|
||
|
di as err "only one allowed of noesample and esample()"
|
||
|
exit 198
|
||
|
}
|
||
|
// parse [b = b] [V = V]
|
||
|
if `"`anything'"'!="" {
|
||
|
tokenize `"`anything'"', parse(" =")
|
||
|
if `"`7'"'!="" error 198
|
||
|
if `"`1'"'=="b" {
|
||
|
if `"`2'"'=="=" & `"`3'"'!="" {
|
||
|
local b `"`3'"'
|
||
|
confirm matrix `b'
|
||
|
}
|
||
|
else error 198
|
||
|
if `"`4'"'=="V" {
|
||
|
if `"`5'"'=="=" & `"`6'"'!="" {
|
||
|
local v `"`6'"'
|
||
|
confirm matrix `b'
|
||
|
}
|
||
|
else error 198
|
||
|
}
|
||
|
else if `"`4'"'!="" error 198
|
||
|
}
|
||
|
else if `"`1'"'=="V" {
|
||
|
if `"`4'"'!="" error 198
|
||
|
if `"`2'"'=="=" & `"`3'"'!="" {
|
||
|
local v `"`3'"'
|
||
|
confirm matrix `v'
|
||
|
}
|
||
|
else error 198
|
||
|
}
|
||
|
else error 198
|
||
|
}
|
||
|
//backup existing e()'s
|
||
|
if "`esample2'"!="" {
|
||
|
local sample "`esample2'"
|
||
|
}
|
||
|
else if "`esample'"=="" {
|
||
|
tempvar sample
|
||
|
gen byte `sample' = e(sample)
|
||
|
}
|
||
|
local emacros: e(macros)
|
||
|
if `"`properties'"'!="" {
|
||
|
local emacros: subinstr local emacros "properties" "", word
|
||
|
}
|
||
|
foreach emacro of local emacros {
|
||
|
local e_`emacro' `"`e(`emacro')'"'
|
||
|
}
|
||
|
local escalars: e(scalars)
|
||
|
if `"`obs'"'!="" {
|
||
|
local escalars: subinstr local escalars "N" "", word
|
||
|
}
|
||
|
if `"`dof'"'!="" {
|
||
|
local escalars: subinstr local escalars "df_r" "", word
|
||
|
}
|
||
|
foreach escalar of local escalars {
|
||
|
tempname e_`escalar'
|
||
|
scalar `e_`escalar'' = e(`escalar')
|
||
|
}
|
||
|
local ematrices: e(matrices)
|
||
|
if "`b'"=="" & `:list posof "b" in ematrices' {
|
||
|
tempname b
|
||
|
mat `b' = e(b)
|
||
|
}
|
||
|
if "`v'"=="" & `:list posof "V" in ematrices' {
|
||
|
tempname v
|
||
|
mat `v' = e(V)
|
||
|
}
|
||
|
local bV "b V"
|
||
|
local ematrices: list ematrices - bV
|
||
|
foreach ematrix of local ematrices {
|
||
|
tempname e_`ematrix'
|
||
|
matrix `e_`ematrix'' = e(`ematrix')
|
||
|
}
|
||
|
// rename
|
||
|
if "`b'"!="" & "`v'"!="" & "`rename'"!="" {
|
||
|
local eqnames: coleq `b', q
|
||
|
local vnames: colnames `b'
|
||
|
mat coleq `v' = `eqnames'
|
||
|
mat coln `v' = `vnames'
|
||
|
mat roweq `v' = `eqnames'
|
||
|
mat rown `v' = `vnames'
|
||
|
}
|
||
|
// post results
|
||
|
if "`esample'"=="" {
|
||
|
eret post `b' `v', esample(`sample') `obs' `dof' `properties' `options'
|
||
|
}
|
||
|
else {
|
||
|
eret post `b' `v', `obs' `dof' `properties' `options'
|
||
|
}
|
||
|
foreach emacro of local emacros {
|
||
|
eret local `emacro' `"`e_`emacro''"'
|
||
|
}
|
||
|
if `"`cmd'"'!="" {
|
||
|
eret local cmd `"`cmd'"'
|
||
|
}
|
||
|
foreach escalar of local escalars {
|
||
|
eret scalar `escalar' = scalar(`e_`escalar'')
|
||
|
}
|
||
|
foreach ematrix of local ematrices {
|
||
|
eret matrix `ematrix' = `e_`ematrix''
|
||
|
}
|
||
|
end
|