*! version 1.04, Ben Jann, 02dec2005
program define estout1
version 8.2
local allvalues "b se t p"
syntax [anything] [using] [ , EQuations(passthru) Keep(passthru) Drop(passthru) ///
nob B2(string) se SE2(string) SEDrop(string) SEKeep(string) ///
t T2(string) abs TDrop(string) TKeep(string) ///
p P2(string) PDrop(string) PKeep(string) ///
star STAR2(string) starsym(string) starpos(string) DETACHstar ///
Stats(string) STFmt(string) STLabels(string asis) STStar STStar2(string) ///
eform Label CONSlbl(string) Wide noHead ///
VARwidth(integer -1) MODELwidth(integer -1) ///
PREHead(string asis) POSTHead(string asis) PREFoot(string asis) POSTFoot(string asis) ///
BEGin(string) end(string) DELimiter(string) style(string) ///
Replace Append noTYpe showtabs ]
local eform="`eform'"!=""
local wide="`wide'"!=""
local head="`head'"==""
*b-, se-, t-, p-Values, formats
if "`abs'"!=""&"`t'"==""&`"`t2'"'=="" local t t
foreach v of local allvalues {
if "``v''"!=""&`"``v'2'"'!="" {
di as error "`v'() and ``v'' may not be specified together"
exit 198
}
if "`v'"=="b" {
local b="`b'"==""
local bfmt "%9.3f"
}
else local `v'=`"``v'2'"'!=""|"``v''"!=""|`"``v'keep'"'!=""
if ``v'' {
local temp: word count ``v'2'
if `temp'>2 {
di as error `"`v'(``v'2') not allowed"'
exit 198
}
local `v'par 0
tokenize `"``v'2'"'
while `"`1'"'!="" {
capt local temp: display `1' 1
if _rc|index(`"`1'"',"%")!=1 {
if substr("parentheses",1,length(`"`1'"'))==`"`1'"' local `v'par 1
else {
di as error `"`1' in `v'(``v'2') not allowed"'
exit 198
}
}
else local `v'fmt "`1'"
mac shift
}
if "``v'fmt'"=="" local `v'fmt "`bfmt'"
}
}
*Default format/labels/stars for overall statistics
local stats: list uniq stats
if "`stfmt'"=="" local stfmt "`bfmt'"
if `"`stlabels'"'=="" local stlabels `"`stats'"'
if `"`conslbl'"'=="" local conslbl "_cons"
if `"`ststar'"'!=""&`"`ststar2'"'!="" {
di as error "ststar() and ststar may not be specified together"
exit 198
}
else if `"`ststar'"'!="" {
local ststar2: word 1 of `stats'
}
else if `"`ststar2'"'!="" {
local stats: list stats | ststar2
}
if `"`ststar2'"'!="" {
local ststarst "p df_m F chi2"
}
*Stars
if "`star2'"!=""&"`star'"!="" {
di as error "star() and star may not be specified together"
exit 198
}
if `"`starpos'"'!=""&!`:list starpos in allvalues' {
di as error `"starpos(`starpos') not allowed"'
exit 198
}
local star="`star'"!=""|`"`starsym'"'!=""|"`starpos'"!=""|"`star2'"!=""
if "`star2'"==""&(`star'|`"`ststar2'"'!="") {
local nstar: word count `starsym'
if `nstar'==0 local nstar 3
if `nstar'>=1 local star2 "`star2'0.05 "
if `nstar'>=2 local star2 "`star2'0.01 "
if `nstar'>=3 local star2 "`star2'0.001"
}
if `star'|`"`ststar2'"'!="" {
local nstar: word count `star2'
if `"`starsym'"'=="" {
if `nstar'>=1 local starsym "*"
if `nstar'>=2 local starsym "`starsym' **"
if `nstar'>=3 local starsym "`starsym' ***"
if `nstar'>3 {
di as error "please specify starsym()"
exit 198
}
}
local temp: word count `starsym'
if `temp'!=`nstar' {
di as error "star() and starsym() do not match"
exit 198
}
forv i=2/`nstar' {
if (`:word `i' of `star2''>`:word `=`i'-1' of `star2'') | ///
(`:word `i' of `star2''<0) | (`:word `=`i'-1' of `star2''>1) {
di as error "significance thresholds not in descending order or outside [0,1]"
exit 198
}
}
}
foreach v of local allvalues {
if ``v'' {
local values "`values'`v'"
if `star'&"`starpos'"=="" local starpos "`v'"
}
if "`starpos'"=="`v'" {
if !``v'' {
di as error "starpos(`v') not allowed unless `v' is secified"
exit 198
}
local values "`values'star"
}
local values "`values' "
}
local values: list retok values
if `star'&"`values'"=="" {
di as error "star not allowed in this context"
exit 198
}
*begin of line, delimiter, end of line, Modelwidth/Varwidth
if `"`style'"'=="html" {
if `"`begin'"'=="" local begin "
"
if `"`delimiter'"'=="" local delimiter " | "
if `"`end'"'=="" local end " |
"
}
else if `"`style'"'=="tex" {
if `"`delimiter'"'=="" local delimiter "&"
if `"`end'"'=="" {
local end "\\\\"
}
}
else if `"`style'"'=="tab" {
if `modelwidth'<0 local modelwidth 0
if `varwidth'<0 local varwidth 0
}
else if `"`style'"'!="" {
di as error `"style(`style') not allowed"'
exit 198
}
if `"`begin'"'!="" {
local begin `"`"`macval(begin)'"'"'
}
if `"`delimiter'"'!="" {
local delimiter `"`"`macval(delimiter)'"'"'
}
if `"`end'"'!="" {
local end `"`"`macval(end)'"'"'
}
if `modelwidth'<0 local modelwidth 12
if `varwidth'<0 local varwidth 12
if `"`style'"'=="tab" & `"`delimiter'"'=="" local delimiter _tab
if `modelwidth'>0 {
local fmt_m "%`modelwidth's"
if `star'|`"`ststar2'"'!="" {
forv i=1/`nstar' {
local istar: word `i' of `macval(starsym)'
local temp2=max(length("`temp2'"),length(`"`macval(istar)'"'))
}
local fmt_star "%-`temp2's"
local _skipstar "_skip(`temp2')"
}
}
if (`star'|`"`ststar2'"'!="")&"`detachstar'"!="" {
local _skipstar `"`macval(delimiter)' `_skipstar'"'
local detachstar `"`macval(delimiter)'"'
}
else local detachstar
if `varwidth'>0 local fmt_v "%-`varwidth's"
if `wide' {
local i 0
foreach v of local values {
if `++i'==1 continue
local wdel `"`macval(wdel)'`macval(delimiter)' _skip(`modelwidth') "'
if index("`v'","star") {
local wdel `"`macval(wdel)'`macval(_skipstar)' "'
}
}
}
*Get coefficients/variances/statistics/varlist/keep/drop
qui estimates table `anything', stats(`stats' df_r `ststarst') `equations' `keep' `drop'
local models `r(names)'
local M: word count `models'
tempname B St df_r
mat `St'=r(stats)
mat `df_r'=`St'["df_r",1...]
if `"`ststar2'"'!="" {
tempname st_p df_m F chi2 stp
mat `st_p'=`St'["p",1...]
mat `df_m'=`St'["df_m",1...]
mat `F'=`St'["F",1...]
mat `chi2'=`St'["chi2",1...]
}
mat `B'=r(coef)
local R=rowsof(`B')
local varlist: rownames `B'
local eqlist: roweq `B'
local eqs: list uniq eqlist
local eqs: word count `eqs'
local eqs=`eqs'>1
local fullvarlist: rowfullnames `B'
foreach v of local allvalues {
if "`v'"=="b" continue
if `"``v'keep'"'!="" {
if `"``v'drop'"'!="" {
di as error "`v'drop() not allowed if `v'keep() is specified"
exit 198
}
Keep `B' `"``v'keep'"'
}
else if `"``v'drop'"'!="" {
if !``v'' {
di as error "`v'drop() not allowed unless `v' is specified"
exit 198
}
Drop `B' `"``v'drop'"'
}
else local temp `"`fullvarlist'"'
local `v'drop: list fullvarlist - temp
}
*Open temporary output file
tempfile tfile
tempname file
file open `file' using `"`tfile'"', write text
*Prehead
if `"`prehead'"'!="" {
local L: word count `prehead'
forv l=1/`L' {
local temp: word `l' of `macval(prehead)'
file write `file' `"`macval(temp)'"' _n
}
}
*Head of table
if `head' {
file write `file' `macval(begin)' _skip(`varwidth')
forv m=1/`M' {
local model: word `m' of `models'
file write `file' `macval(delimiter)' `fmt_m' ("`model'")
if !`wide'|index("`: word 1 of `values''","star")|"`ststar2'"!="" {
file write `file' `macval(_skipstar)'
}
if `wide' {
file write `file' `macval(wdel)'
}
}
file write `file' `macval(end)' _n
if `wide'&"`values'"!="" {
file write `file' `macval(begin)' _skip(`varwidth')
forv m=1/`M' {
foreach v of local values {
local istar=index("`v'","star")
if `istar' local v=substr("`v'",1,`istar'-1)
file write `file' `macval(delimiter)'
file write `file' `fmt_m' ("`v'")
if `istar'|("`v'"=="`: word 1 of `values''"&"`ststar2'"!="") {
file write `file' `macval(_skipstar)'
}
}
}
file write `file' `macval(end)' _n
}
}
*Posthead
if `"`posthead'"'!="" {
local L: word count `posthead'
forv l=1/`L' {
local temp: word `l' of `macval(posthead)'
file write `file' `"`macval(temp)'"' _n
}
}
*Body of table: loop over table rows
if "`values'"!="" {
forv r=1/`R' {
*Equation names
local eqvar: word `r' of `fullvarlist'
if `eqs' {
local eqrlast `"`eqr'"'
local eqr: word `r' of `eqlist'
if `"`eqr'"'!=`"`eqrlast'"' {
file write `file' `macval(begin)' `"`eqr'"' `macval(end)' _n
}
}
*Variable names/labels
local var: word `r' of `varlist'
if "`label'"!="" {
capture local varl: var l `var'
if _rc|`"`varl'"'=="" {
local varl `var'
}
}
else local varl `var'
if "`var'"=="_cons" {
local varl `"`macval(conslbl)'"'
}
file write `file' `macval(begin)' `fmt_v' (`"`macval(varl)'"')
*Table cells
*if long, loop thru models within values: (modelloop 1) -> valueloop -> modelloop 2
*if wide, loop thru values within models: modelloop 1 -> valueloop -> (modelloop 2)
if `wide' local MM `M'
else local MM 1
forv mm=1/`MM' {
if `wide' local MMM `mm'
else local MMM `M'
local newline 0
foreach v of local values {
local istar=index("`v'","star")
if `istar' local v=substr("`v'",1,`istar'-1)
if `: list eqvar in `v'drop'&!`wide' continue
if !`wide'&`newline++' {
file write `file' `"`macval(begin)'"' _skip(`varwidth')
}
forv m=`mm'/`MMM' {
file write `file' `macval(_skipvw)' `macval(delimiter)'
if `: list eqvar in `v'drop' {
file write `file' _skip(`modelwidth')
}
else {
`v'Value `B'[`r',`=`m'*2-1'] `B'[`r',`=`m'*2'] `df_r'[1,`m'] ///
``v'fmt' ``v'par' `eform' `abs'
file write `file' `fmt_m' ("`value'")
}
if `istar' {
pValue `B'[`r',`=`m'*2-1'] `B'[`r',`=`m'*2'] `df_r'[1,`m'] %20.0g 0 0
Stars `nstar' `"`star2'"' `"`macval(starsym)'"' `value'
file write `file' `macval(detachstar)' `fmt_star' (`"`macval(value)'"')
}
else if !`wide'|("`v'"=="`: word 1 of `values''"&"`ststar2'"!="") {
file write `file' `macval(_skipstar)'
}
}
if !`wide' {
file write `file' `macval(end)' _n
}
}
}
if `wide' {
file write `file' `macval(end)' _n
}
}
}
*Prefoot
if `"`prefoot'"'!="" {
local L: word count `prefoot'
forv l=1/`L' {
local temp: word `l' of `macval(prefoot)'
file write `file' `"`macval(temp)'"' _n
}
}
*Foot of table
local S: word count `stats'
forv r=1/`S' {
local stat: word `r' of `macval(stlabels)'
if `"`stat'"'=="" local stat: word `r' of `stats'
file write `file' `macval(begin)' `fmt_v' (`"`macval(stat)'"')
local format: word `r' of `stfmt'
if "`format'"=="" local format: word 1 of `stfmt'
local stat: word `r' of `stats'
forv m=1/`M' {
stValue `St'[`r',`m'] `format'
file write `file' `macval(delimiter)' `fmt_m' ("`value'")
if "`value'"!=""&`:list stat in ststar2' {
stpValue `st_p'[1,`m'] `df_r'[1,`m'] `df_m'[1,`m'] `F'[1,`m'] `chi2'[1,`m']
Stars `nstar' `"`star2'"' `"`macval(starsym)'"' `value'
file write `file' `macval(detachstar)' `fmt_star' (`"`macval(value)'"')
}
else if !`wide'|index("`: word 1 of `values''","star")|"`ststar2'"!="" {
file write `file' `macval(_skipstar)'
}
if `wide' {
file write `file' `macval(wdel)'
}
}
file write `file' `macval(end)' _n
}
*Postfoot
if `"`postfoot'"'!="" {
local L: word count `postfoot'
forv l=1/`L' {
local temp: word `l' of `macval(postfoot)'
file write `file' `"`macval(temp)'"' _n
}
}
*Finish
file close `file'
if `"`using'"'!="" {
tempname file2
file open `file2' `using', write text `replace' `append'
file open `file' using `"`tfile'"', read text
file read `file' temp
while r(eof)==0 {
file write `file2' `"`macval(temp)'"' _n
file read `file' temp
}
file close `file'
file close `file2'
}
if "`type'"=="" type `"`tfile'"', asis `showtabs'
end
program bValue
args b var df_r fmt par eform abs
if `b'==0&`var'==0 local value "(dropped)"
else if `var'!=.z {
if `eform' local value: di `fmt' exp(`b')
else local value: di `fmt' `b'
local value: list retok value
if `par' local value "(`value')"
}
c_local value `value'
end
program seValue
args b var df_r fmt par eform abs
if !(`b'==0&`var'==0)&`var'!=.z {
if `var'==0 local value .
else if `eform' local value: di `fmt' sqrt(`var')*exp(`b')
else local value: di `fmt' sqrt(`var')
local value: list retok value
if `par' local value "(`value')"
}
c_local value `value'
end
program tValue
args b var df_r fmt par eform abs
if !(`b'==0&`var'==0)&`var'!=.z {
if `var'==0 local value .
else local value: di `fmt' `abs'(`b'/sqrt(`var'))
local value: list retok value
if `par' local value "(`value')"
}
c_local value `value'
end
program pValue
args b var df_r fmt par eform abs
if !(`b'==0&`var'==0)&`var'!=.z {
if `var'==0 local value .
else if `df_r'<. local value: di `fmt' ttail(`df_r',abs(`b'/sqrt(`var')))*2
else local value: di `fmt' (1-norm(abs(`b'/sqrt(`var'))))*2
local value: list retok value
if `par' local value "(`value')"
}
c_local value `value'
end
program stpValue
args p df_r df_m F chi2
if inrange(`p',0,1) {
local value=`p'
}
else if `df_m'<.&`df_r'<.&`F'<. {
local value=Ftail(`df_m',`df_r',`F')
}
else if `df_m'<.&`chi2'<. {
local value=chi2tail(`df_m',`chi2')
}
c_local value `value'
end
program Stars
args nstar star2 starsym P
if "`P'"!="" {
if `P'<. {
local i `nstar'
while `i'>0&`"`value'"'=="" {
local istar: word `i' of `star2'
local istarsym: word `i' of `macval(starsym)'
if `P'<`istar' {
local value "`macval(istarsym)'"
}
local i=`i'-1
}
}
}
c_local value `macval(value)'
end
program stValue
args st fmt
if `st'!=.z {
local value: di `fmt' `st'
local value: list retok value
}
c_local value `value'
end
program Keep //stolen from est_table.ado
args b spec
tempname bt
foreach sp of local spec {
local row = rownumb(`b', "`sp'")
if `row' == . {
dis as err "coefficient `sp' does not occur in any of the models"
exit 198
}
if index("`sp'",":") > 0 {
mat `bt' = nullmat(`bt') \ `b'["`sp'",1...]
}
else {
mat `bt' = nullmat(`bt') \ `b'[`row',1...]
}
}
c_local temp `"`: rowfullnames `bt''"'
end
program Drop //stolen from est_table.ado
args b spec
tempname bt
mat `bt' = `b'
foreach sp of local spec {
local isp = rownumb(`bt', "`sp'")
if `isp' == . {
dis as err "coefficient `sp' does not occur in any of the models"
exit 198
}
while `isp' != . {
local nb = rowsof(`bt')
if `isp' == 1 {
mat `bt' = `bt'[2...,1...]
}
else if `isp' == `nb' {
mat `bt' = `bt'[1..`=`nb'-1',1...]
}
else {
local im1 = `isp'-1
local ip1 = `isp'+1
mat `bt' = `bt'[1..`im1',1...] \ `bt'[`ip1'...,1...]
}
local isp = rownumb(`bt', "`sp'")
}
}
c_local temp `"`: rowfullnames `bt''"'
end