*! version 2.65, Ben Jann, 29may2007
program define estout, rclass
version 8.2
syntax [anything] [using] [ , ///
Cells(string asis) ///
Drop(string asis) ///
Keep(string asis) ///
Order(string asis) ///
Indicate(string asis) ///
TRansform(string asis) ///
EQuations(passthru) ///
NOEFORM eform EFORM2(string) ///
NOMargin Margin Margin2(string) ///
NODIscrete DIscrete(string asis) ///
MEQs(string) ///
NODROPPED dropped DROPPED2(string) ///
level(numlist max=1 int >=10 <=99) ///
Stats(string asis) ///
STARLevels(string asis) ///
NOSTARDetach STARDetach ///
VARwidth(numlist max=1 int >=0) ///
MODELwidth(numlist max=1 int >=0) ///
NOABbrev ABbrev ///
NOUNStack UNStack ///
EXTRAcols(numlist sort) ///
BEGin(string asis) ///
DELimiter(string asis) ///
end(string asis) ///
DMarker(string) ///
MSign(string) ///
NOLZ lz ///
SUBstitute(string asis) ///
TItle(string) ///
NOLEgend LEgend ///
PREHead(string asis) ///
POSTHead(string asis) ///
PREFoot(string asis) ///
POSTFoot(string asis) ///
HLinechar(string) ///
NOLabel Label ///
VARLabels(string asis) ///
REFcat(string asis) ///
MLabels(string asis) ///
NONUMbers NUMbers NUMbers2(string asis) ///
COLLabels(string asis) ///
EQLabels(string asis) ///
MGRoups(string asis) ///
NOReplace Replace ///
NOAppend Append ///
NOTYpe TYpe ///
NOSHOWTABS showtabs ///
STYle(string) ///
DEFaults(string) ///
* ///
]
MoreOptions, `options'
if "`style'"!="" local defaults "`style'"
*Parse suboptions
if `"`cells'"'!="none" {
gettoken row rest: cells, bind qed(qed)
local cells
while `"`row'"'!="" {
local newrow
gettoken opt row: row, parse(" (")
if `"`macval(row)'"'=="" & `qed'==0 {
local row0
gettoken trash: rest, match(par)
if `"`par'"'=="(" {
gettoken opt2 rest: rest, match(par)
}
else local opt2
}
else {
gettoken trash row0: row, match(par)
gettoken opt2: row, match(par)
}
while "`opt'"!="" {
local newrow: list newrow | opt
if `"`par'"'!="(" {
gettoken opt row: row, parse(" (")
}
else {
ParseValueSubopts `opt', `macval(opt2)'
gettoken opt row: row0, parse(" (")
}
gettoken trash row0: row, match(par)
gettoken opt2: row, match(par)
}
if `qed' local cells `"`cells'"`newrow'" "'
else local cells `"`cells'`newrow' "'
gettoken row rest: rest, bind qed(qed)
}
local cells: list retok cells
}
if "`eform2'"!="" {
local eform "`eform2'"
local eform2
}
if `"`transform'"'!="" {
ParseTransformSubopts `transform'
}
if "`margin2'"!="" {
local margin "`margin2'"
local margin2
}
if `"`dropped'"'!="" local dropped "(dropped)"
if `"`macval(dropped2)'"'!="" {
local dropped `"`macval(dropped2)'"'
local dropped2
}
if `"`macval(stats)'"'!="" {
ParseStatsSubopts `macval(stats)'
if `"`macval(statslabels)'"'!="" {
ParseLabelsSubopts statslabels `macval(statslabels)'
}
}
foreach opt in mgroups mlabels eqlabels collabels varlabels {
if `"`macval(`opt')'"'!="" {
ParseLabelsSubopts `opt' `macval(`opt')'
}
}
if `"`macval(numbers2)'"'!="" {
local numbers `"`macval(numbers2)'"'
local numbers2
}
if `"`macval(indicate)'"'!="" {
ParseIndicateOpts `macval(indicate)'
}
if `"`macval(refcat)'"'!="" {
ParseRefcatOpts `macval(refcat)'
}
if `"`macval(starlevels)'"'!="" {
ParseStarlevels `macval(starlevels)'
}
*Process No-Options
foreach opt in unstack eform margin dropped discrete stardetach wrap ///
legend label numbers lz abbrev replace append type showtabs smcltags asis {
if "`no`opt''"!="" local `opt'
}
*Defaults
if inlist("`defaults'", "", "smcl", "tab", "fixed", "tex", "html") {
if "`nostatslabelsfirst'"=="" local statslabelsfirst first
if "`nostatslabelslast'"=="" local statslabelslast last
if "`novarlabelsfirst'"=="" local varlabelsfirst first
if "`novarlabelslast'"=="" local varlabelslast last
if "`noeqlabelsfirst'"=="" local eqlabelsfirst first
if "`noeqlabelslast'"=="" local eqlabelslast last
if "`notype'"=="" local type type
if "`nolz'"=="" local lz lz
if `"`macval(discrete)'"'=="" & "`nodiscrete'"=="" {
local discrete `"" (d)" for discrete change of dummy variable from 0 to 1"'
}
if `"`macval(indicatelabels)'"'=="" local indicatelabels "Yes No"
if `"`macval(refcatlabel)'"'=="" local refcatlabel "ref."
if inlist("`defaults'", "", "tab") {
if `"`macval(delimiter)'"'=="" local delimiter _tab
}
else if "`defaults'"=="smcl" {
if "`varwidth'"=="" local varwidth = cond("`label'"=="", 12, 20)
if "`modelwidth'"=="" local modelwidth 12
if "`noabbrev'"=="" local abbrev abbrev
if `"`macval(delimiter)'"'=="" local delimiter `"" ""'
if "`nosmcltags'"=="" local smcltags smcltags
if `"`macval(prehead)'"'=="" local prehead `""{hline @width}""'
if `"`macval(posthead)'"'=="" local posthead `""{hline @width}""'
if `"`macval(prefoot)'"'=="" local prefoot `""{hline @width}""'
if `"`stats'"'!="" & `"`macval(postfoot)'"'=="" local postfoot `""{hline @width}""'
}
else if "`defaults'"=="fixed" {
if "`varwidth'"=="" local varwidth = cond("`label'"=="", 12, 20)
if "`modelwidth'"=="" local modelwidth 12
if "`noabbrev'"=="" local abbrev abbrev
if `"`macval(delimiter)'"'=="" local delimiter `"" ""'
}
else if "`defaults'"=="tex" {
if "`varwidth'"=="" local varwidth = cond("`label'"=="", 12, 20)
if "`modelwidth'"=="" local modelwidth 12
if `"`macval(delimiter)'"'=="" local delimiter &
if `"`macval(end)'"'=="" {
local end \\\
}
}
else if "`defaults'"=="html" {
if "`varwidth'"=="" local varwidth = cond("`label'"=="", 12, 20)
if "`modelwidth'"=="" local modelwidth 12
if `"`macval(begin)'"'=="" local begin
|
if `"`macval(delimiter)'"'=="" local delimiter |
if `"`macval(end)'"'=="" local end |
}
}
else {
capture findfile estout_`defaults'.def
if _rc {
di as error `"`defaults' style not available "' ///
`"(file estout_`defaults'.def not found)"'
exit 601
}
else {
tempname file
file open `file' using `"`r(fn)'"', read text
if c(SE) local max 244
else local max 80
while 1 {
ReadLine `max' `file'
if `"`line'"'=="" continue, break
gettoken opt line: line
if `"`macval(`opt')'"'=="" & `"`no`opt''"'=="" {
local line: list retok line
local `opt' `"`macval(line)'"'
}
}
file close `file'
}
}
if "`smcltags'"=="" & "`noasis'"=="" local asis asis
if "`asis'"!="" local asis "_asis"
*title option
if `"`macval(prehead)'`macval(posthead)'`macval(prefoot)'`macval(postfoot)'"'=="" ///
& `"`macval(title)'"'!="" {
local prehead `"`"`macval(title)'"'"'
}
*Generate/clean-up cell contents
if `"`:list clean cells'"'=="" {
local cells b
}
else if `"`:list clean cells'"'=="none" {
local cells
}
CellsCheck `"`cells'"'
*Special treatment of confidence intervalls
if "`level'"=="" local level $S_level
if `level'<10 | `level'>99 {
di as error "level(`level') invalid"
exit 198
}
if `: list posof "ci" in values' {
if `"`macval(ci_label)'"'=="" {
local ci_label "ci`level'"
}
if `"`macval(ci_par)'"'=="" {
if "`ci_separate'"=="" local ci_par `""" , """'
}
tokenize `"`macval(ci_par)'"'
local ci_l_par `""`macval(1)'" "`macval(2)'""'
local ci_u_par `""" "`macval(3)'""'
}
if `: list posof "ci_l" in values' & `"`macval(ci_l_label)'"'=="" {
local ci_l_label "min`level'"
}
if `: list posof "ci_u" in values' & `"`macval(ci_u_label)'"'=="" {
local ci_u_label "max`level'"
}
*Formats
local firstv: word 1 of `values'
if "`firstv'"=="" local firstv "b"
if "``firstv'_fmt'"=="" local `firstv'_fmt %9.0g
foreach v of local values {
if "``v'_fmt'"=="" local `v'_fmt "``firstv'_fmt'"
if `"`macval(`v'_label)'"'=="" {
local `v'_label "`v'"
}
}
*Check margin option / prepare discrete option / prepare dropped option
if "`margin'"!="" {
if !inlist("`margin'","margin","u","c","p") {
di as error "margin(`margin') invalid"
exit 198
}
if `"`macval(discrete)'"'!="" {
gettoken discrete discrete2: discrete
}
}
else local discrete
local droppedison = (`"`macval(dropped)'"'!="")
*Formats/labels/stars for statistics
if "`statsfmt'"=="" local statsfmt: word 1 of ``firstv'_fmt'
ProcessStatslayout `"`stats'"' `"`statsfmt'"' `"`statsstar'"' ///
`"`statslayout'"' `"`statspchar'"'
local stats: list uniq stats
local p: list posof "p" in stats
if "`statsstar'"!="" | `p' local p "p df_m F chi2"
else local p
*Significance stars
local tablehasstars 0
foreach v of local values {
if "``v'_star'"!="" | inlist("`v'","_star","_sigsign") {
if "``v'_pvalue'"=="" local `v'_pvalue p
local tablehasstars 1
}
}
*Check/define starlevels/make levelslegend
if `tablehasstars' | `"`statsstar'"'!="" {
if `"`macval(starlevels)'"'=="" ///
local starlevels "* 0.05 ** 0.01 *** 0.001"
CheckStarvals `"`macval(starlevels)'"' `"`macval(starlevelslabel)'"' ///
`"`macval(starlevelsdelimiter)'"'
}
*Get coefficients/variances/statistics: est_table
if `"`anything'"'=="" {
capt est_expand $eststo
if !_rc {
local anything `"$eststo"'
}
}
qui estimates table `anything', stats(df_r `p' `stats') `equations'
if `"`equations'"'=="" & "`unstack'"=="" { // specify equations("") to deactivate
TableIsAMess
if `value' {
qui estimates table `anything', stats(df_r `p' `stats') equations(main=1)
}
}
local models `r(names)'
local nmodels: word count `models'
tempname B D St
mat `St'=r(stats)
mat `B'=r(coef)
local nindicate 0
foreach indi of local indicate {
local ++nindicate
ProcessIndicateGrp `nindicate' `B' "`unstack'" ///
`"`macval(indicatelabels)'"' `"`macval(indi)'"'
}
if `"`keep'"' != "" {
ExpandEqVarlist `"`keep'"' `B'
DropOrKeep 1 `B' `"`value'"'
capt confirm matrix r(result)
if _rc {
di as err "all coefficients dropped"
exit 498
}
mat `B' = r(result)
}
if `"`drop'"' != "" {
ExpandEqVarlist `"`drop'"' `B'
DropOrKeep 0 `B' `"`value'"'
capt confirm matrix r(result)
if _rc {
di as err "all coefficients dropped"
exit 498
}
mat `B' = r(result)
}
if `"`order'"' != "" {
ExpandEqVarlist `"`order'"' `B'
local order `"`value'"'
Order `B' `"`order'"'
mat `B' = r(result)
}
local R=rowsof(`B')
local varlist: rownames `B'
local eqlist: roweq `B', q
local eqlist: list clean eqlist
UniqEqsAndDims `"`eqlist'"'
MakeQuotedFullnames `"`varlist'"' `"`eqlist'"'
local fullvarlist `"`value'"'
mat `D' = J(`R',1,0)
mat rown `D' = `fullvarlist'
*Calculate p-value
if "`p'"!="" {
forv m = 1/`nmodels' {
if `St'[2,`m']==.z {
if `St'[4,`m']<.z {
mat `St'[2,`m'] = Ftail(`St'[3,`m'],`St'[1,`m'],`St'[4,`m'])
}
else if `St'[5,`m']<.z {
mat `St'[2,`m'] = chi2tail(`St'[3,`m'],`St'[5,`m'])
}
}
}
}
*Make dictionary of matched equations
if `"`equations'"'!="" {
ParseEquations, eqs(`eqs') m(`nmodels') `equations'
}
*Prepare keep/drop
foreach v of local values {
local temp `"`fullvarlist'"'
if `"``v'_keep'"'!="" {
ExpandEqVarlist `"``v'_keep'"' `B'
DropOrKeep 1 `B' `"`value'"'
capt confirm matrix r(result)
if _rc local temp
else {
MakeQuotedFullnames `"`: rownames r(result)'"' `"`: roweq r(result), q'"'
local temp: list temp & value
}
}
if `"``v'_drop'"'!="" {
ExpandEqVarlist `"``v'_drop'"' `B'
DropOrKeep 0 `B' `"`value'"'
capt confirm matrix r(result)
if _rc local temp
else {
MakeQuotedFullnames `"`: rownames r(result)'"' `"`: roweq r(result), q'"'
local temp: list temp & value
}
}
local `v'_drop: list fullvarlist - temp
}
*Prepare unstack
if "`unstack'"!="" {
local varlist: list uniq varlist
GetVarnamesFromOrder `"`order'"'
local temp: list value & varlist
local varlist: list temp | varlist
local cons _cons
if `:list cons in value'==0 {
if `:list cons in varlist' {
local varlist: list varlist - cons
local varlist: list varlist | cons
}
}
local R: word count `varlist'
local eqswide: list uniq eqs
forv i=1/`nindicate' {
ReorderEqsInIndicate `"`nmodels'"' `"`eqswide'"' ///
`"`indicate_`nindicate'_eqs'"' `"`macval(indicate_`nindicate'_lbls)'"'
local indicate_`nindicate'_lbls `"`macval(value)'"'
}
}
else local eqswide "_"
*RestoreEstimates: mlabelsdepvars, marginals, cell stats, overall stats
local values: subinstr local values "ci" "ci_l ci_u", word
if `tablehasstars' {
local temp
foreach v of local values {
local temp: list temp | `v'_pvalue
}
local values: list values | temp
}
if `"`transform'"'=="" { // i.e., transform() overwrites eform()
if "`eform'"!="" {
local transform "exp(@) exp(@)"
if "`eform'"!="eform" {
local transformpattern "`eform'"
}
}
}
foreach m of local transformpattern {
if !( "`m'"=="1" | "`m'"=="0" ) {
di as error "invalid pattern in transform(,pattern()) or eform()"
exit 198
}
}
local transformf
local transformdf
if `"`transform'"'!="" {
MakeTransformList `B' `"`transform'"' // returns: valuef, valuedf
if "`transformpattern'"!="" {
foreach m of local transformpattern {
if "`m'"=="1" {
local transformf `"`transformf'`"`valuef'"' "'
local transformdf `"`transformdf'`"`valuedf'"' "'
}
else {
local transformf `"`transformf'"" "'
local transformdf `"`transformdf'"" "'
}
}
}
else {
forv i = 1/`nmodels' {
local transformf `"`transformf'`"`valuef'"' "'
local transformdf `"`transformdf'`"`valuedf'"' "'
}
}
}
foreach v of local values {
tempname _`v'
mat `_`v''=J(rowsof(`B'),`nmodels',.z)
mat rown `_`v'' = `fullvarlist'
mat coln `_`v'' = `models'
if !inlist("`v'","b","se","t","p","ci_l","ci_u","_star","_sign","_sigsign") {
local xvalues: list xvalues | v
local x_v: list x_v | _`v'
}
}
if "`unstack'"!="" {
if "`p'"!="" local p p
local p: list stats | p
local aicbicrank "aic bic rank"
local p: list p - aicbicrank
}
else local p
if "`p'"!="" {
local value
foreach eq of local eqswide {
foreach v of local p {
local value `"`value'`"`eq':`v'"' "'
}
}
tempname mestats
mat `mestats' = J(`:list sizeof value',`nmodels',.z)
mat rown `mestats' = `value'
mat coln `mestats' = `models'
}
if "`mlabelsdepvars'`margin'`xvalues'`p'`label'"!="" {
RestoreEstimates `B' `D' "`models'" "`eqnames'" `"`eqspec'"' ///
"`mlabelsdepvars'" `"`macval(mlabels)'"' "`label'" "`margin'" ///
`"`meqs'"' "`xvalues'" "`x_v'" "`St'" "`p'" "`mestats'"
}
foreach v of local values {
if "`v'"=="b" {
_estout_b `B' `_b' `"`transformf'"' //"`eform'"
}
else if "`v'"=="se" {
_estout_se `B' `_se' `"`transformdf'"' //"`eform'"
}
else if "`v'"=="t" {
_estout_t `B' `_t' `t_abs'
}
else if "`v'"=="p" {
_estout_p `B' `_p' `St'
}
else if "`v'"=="ci_l" {
_estout_ci_l `B' `_ci_l' `St' `level' `"`transformf'"' //"`eform'"
}
else if "`v'"=="ci_u" {
_estout_ci_u `B' `_ci_u' `St' `level' `"`transformf'"' //"`eform'"
}
if inlist("`v'","_star","_sign","_sigsign") {
_estout_b `B' `_`v'' // `"`transformf'"' (do not transform)
}
}
*Model labels
if `"`macval(mlabels)'"'=="" {
local mlabels "`models'"
}
else {
local temp: list sizeof mlabels
if `temp'<`nmodels' {
forv i = `=`temp'+1'/`nmodels' {
local model: word `i' of `models'
local mlabels `"`macval(mlabels)' `model'"'
}
}
}
if "`mlabelsnumbers'"!="" {
NumberMlabels `nmodels' `"`macval(mlabels)'"'
}
*Equations labels
local numeqs: list sizeof eqs
if `"`macval(eqlabels)'"'=="" {
if "`label'"!="" {
foreach eq of local eqs {
local value
capture confirm variable `eq'
if !_rc {
local value: var l `eq'
}
if `"`value'"'=="" local value "`eq'"
local eqlabels `"`eqlabels'`"`value'"' "'
}
}
else local eqlabels `"`eqs'"'
}
else {
local temp: list sizeof eqlabels
if `temp'<`numeqs' {
forv i = `=`temp'+1'/`numeqs' {
local eq: word `i' of `eqs'
local value
if "`label'"!="" {
capture confirm variable `eq'
if !_rc {
local value: var l `eq'
}
}
if `"`value'"'=="" local value "`eq'"
local eqlabels `"`macval(eqlabels)' `"`value'"'"'
}
}
}
if "`eqlabelsnone'"!="" & `numeqs'>1 & "`unstack'"=="" {
EqReplaceCons `"`varlist'"' `"`eqlist'"' `"`eqlabels'"'
if `"`macval(value)'"'!="" {
local varlabels `"`macval(value)' `macval(varlabels)'"'
}
}
*Column labels
if `"`macval(collabels)'"'=="" {
forv j = 1/`ncols' {
local temp
forv i = 1/`nrows' {
local v: word `i' of `cells'
local v: word `j' of `v'
if "`v'"!="" { // required because n. of elements in row may be < ncols
if `"`macval(temp)'"'!="" {
local temp `"`macval(temp)'/"'
}
local temp `"`macval(temp)'`macval(`v'_label)'"'
}
}
local collabels `"`macval(collabels)'`"`macval(temp)'"' "'
}
}
*Prepare refcat()
if `"`macval(refcat)'"'!="" {
PrepareRefcat `"`macval(refcat)'"'
}
*Determine table layout
local m 1
local starcol 0
foreach model of local models {
local e 0
foreach eq of local eqswide {
local stc 0
local ++e
if "`unstack'"!="" {
ModelEqCheck `B' "`eq'" `m'
if !`value' continue
}
local eqsrow "`eqsrow'`e' "
local modelsrow "`modelsrow'`m' "
local k 0
local something 0
forv j = 1/`ncols' {
local col
forv i = 1/`nrows' {
local row: word `i' of `cells'
local v: word `j' of `row'
if `"``v'_star'"'!="" local starcol 1
if "`v'"=="" local v "." // required because n. of elements in row may be < ncols
else {
if "`:word `m' of ``v'_pattern''"=="0" local v ".`v'"
}
local col "`col'`v' "
}
local nocol 1
foreach v of local col {
if index("`v'",".")!=1 {
local nocol 0
continue, break
}
}
if !`nocol' {
local colsrow "`colsrow'`j' "
if `++k'>1 {
local modelsrow "`modelsrow'`m' "
local eqsrow "`eqsrow'`e' "
}
if `"`: word `++stc' of `statscolstar''"'=="1" local starcol 1
local starsrow "`starsrow'`starcol' "
local starcol 0
Add2Vblock `"`vblock'"' "`col'"
local something 1
}
}
if !`something' {
local col
forv i = 1/`nrows' {
local col "`col'. "
}
Add2Vblock `"`vblock'"' "`col'"
local colsrow "`colsrow'1 "
if `"`: word `++stc' of `statscolstar''"'=="1" local starcol 1
local starsrow "`starsrow'`starcol' "
local starcol 0
}
}
local ++m
}
VblockCheck `"`vblock'"'
CountNofEqs "`modelsrow'" "`eqsrow'"
local neqs `value'
if `"`extracols'"'!="" {
foreach row in model eq col star {
InsertAtCols `"`extracols'"' `"``row'srow'"'
local `row'srow `"`value'"'
}
foreach row of local vblock {
InsertAtCols `"`extracols'"' `"`row'"'
local nvblock `"`nvblock' `"`value'"'"'
}
local vblock: list clean nvblock
}
local ncols = `: word count `starsrow'' + 1
*Modelwidth/varwidth/starwidth
if "`modelwidth'"=="" local modelwidth 0
if "`varwidth'"=="" local varwidth 0
local starwidth 0
if `modelwidth'>0 {
if `tablehasstars' | `"`statsstar'"'!="" {
Starwidth `"`macval(starlevels)'"'
local starwidth `value'
}
}
if `varwidth'<2 local wrap
* totcharwidth / hline
local totcharwidth `varwidth'
capture {
local delwidth = length(`macval(delimiter)')
}
if _rc {
local delwidth = length(`"`macval(delimiter)'"')
}
foreach i of local starsrow {
local totcharwidth = `totcharwidth' + `delwidth' + `modelwidth'
if `i' {
if "`stardetach'"!="" {
local ++ncols
local totcharwidth = `totcharwidth' + `delwidth'
}
local totcharwidth = `totcharwidth' + `starwidth'
}
}
IsInString "@hline" `"`0'"'
if `value' {
local hline `totcharwidth'
if `hline'>400 local hline 400 // _dup(400) is limit
if `"`macval(hlinechar)'"'=="" local hlinechar "-"
local hline: di _dup(`hline') `"`macval(hlinechar)'"'
}
else local hline
* check begin, delimiter, end
tempfile tfile
tempname file
file open `file' using `"`tfile'"', write text
foreach opt in begin delimiter end {
capture file write `file' `macval(`opt')'
if _rc {
local `opt' `"`"`macval(`opt')'"'"'
}
}
file close `file'
* RTF support: set macros rtfrowdef, rtfrowdefbrdrt, rtfrowdefbrdrb, rtfemptyrow
local hasrtfbrdr 0
local rtfbrdron 0
IsInString "@rtfrowdef" `"`begin'"'
local hasrtf `value'
if `hasrtf' {
MakeRtfRowdefs `"`macval(begin)'"' `"`starsrow'"' "`stardetach'" ///
`varwidth' `modelwidth'
local varwidth 0
local wrap
local modelwidth 0
local starwidth 0
IsInString "@rtfrowdefbrdr" `"`begin'"'
if `value' {
local hasrtfbrdr 1
local rtfbeginbak `"`macval(begin)'"'
local begin: subinstr local rtfbeginbak "@rtfrowdefbrdr" `"`rtfrowdefbrdrt'"'
local rtfbrdron 1
}
else {
local begin: subinstr local begin "@rtfrowdef" `"`rtfrowdef'"'
}
}
* set widths
if `modelwidth'>0 local fmt_m "%`modelwidth's"
if `starwidth'>0 local fmt_star "%-`starwidth's"
if `varwidth'>0 local fmt_v "%-`varwidth's"
if "`mgroupsspan'`mlabelsspan'`eqlabelsspan'`collabelsspan'"!="" {
if `modelwidth'>0 {
file open `file' using `"`tfile'"', write text replace
file write `file' `macval(delimiter)'
file close `file'
file open `file' using `"`tfile'"', read text
file read `file' delwidth
file close `file'
local delwidth = length(`"`macval(delwidth)'"')
}
else local delwidth 0
}
if "`stardetach'"!="" {
local stardetach `"`macval(delimiter)'"'
}
*Prepare @-Variables
local atvars2 `""`nmodels'" "`neqs'" "`totcharwidth'" `"`macval(hline)'"' `hasrtf' `"`rtfrowdefbrdrt'"' `"`rtfrowdefbrdrb'"' `"`rtfemptyrow'"'"'
local atvars3 `"`"`macval(title)'"' `"`macval(discrete)'`macval(discrete2)'"' `"`macval(starlegend)'"'"'
*Open output file
file open `file' using `"`tfile'"', write text replace
*Write prehead
foreach line of local prehead {
if "`smcltags'"!="" file write `file' "{txt}"
InsertAtVariables `"`macval(line)'"' 0 "`ncols'" `macval(atvars2)' `macval(atvars3)'
file write `file' `"`macval(value)'"' _n
}
*Write head: Models groups
if "`mgroupsnone'"=="" & `"`macval(mgroups)'"'!="" {
if "`smcltags'"!="" file write `file' "{txt}"
InsertAtVariables `"`macval(mgroupsbegin)'"' 2 "`ncols'" `macval(atvars2)'
local mgroupsbegin `"`macval(value)'"'
InsertAtVariables `"`macval(mgroupsend)'"' 2 "`ncols'" `macval(atvars2)'
local mgroupsend `"`macval(value)'"'
local tmpbegin `"`macval(begin)'"'
local tmpend `"`macval(end)'"'
if "`mgroupsreplace'"!="" {
if `"`macval(mgroupsbegin)'"'!="" local tmpbegin
if `"`macval(mgroupsend)'"'!="" local tmpend
}
MgroupsPattern "`modelsrow'" "`mgroupspattern'"
Abbrev `varwidth' `"`macval(mgroupslhs)'"' "`abbrev'"
WriteBegin `"`file'"' `"`macval(mgroupsbegin)'"' `"`macval(tmpbegin)'"' ///
`"`fmt_v' (`"`macval(value)'"')"'
WriteCaption `"`file'"' `"`macval(delimiter)'"' ///
`"`macval(stardetach)'"' "`mgroupspattern'" "`mgroupspattern'" ///
`"`macval(mgroups)'"' "`starsrow'" "`mgroupsspan'" "`abbrev'" ///
"`modelwidth'" "`fmt_m'" "`delwidth'" "`starwidth'" ///
`"`macval(mgroupserepeat)'"' `"`macval(mgroupsprefix)'"' ///
`"`macval(mgroupssuffix)'"'
WriteEnd `"`file'"' `"`macval(tmpend)'"' `"`macval(mgroupsend)'"' ///
`"`macval(value)'"'
if `hasrtfbrdr' & `rtfbrdron' {
local begin: subinstr local rtfbeginbak "@rtfrowdefbrdr" `"`rtfrowdef'"'
local rtfbrdron 0
}
}
*Write head: Models numbers
if `"`macval(numbers)'"'!="" {
if "`smcltags'"!="" file write `file' "{txt}"
if `"`macval(numbers)'"'=="numbers" local numbers "( )"
file write `file' `macval(begin)' `fmt_v' (`""')
tokenize `"`macval(numbers)'"'
numlist `"1/`nmodels'"'
WriteCaption `"`file'"' `"`macval(delimiter)'"' ///
`"`macval(stardetach)'"' "`modelsrow'" "`modelsrow'" ///
"`r(numlist)'" "`starsrow'" "`mlabelsspan'" "`abbrev'" ///
"`modelwidth'" "`fmt_m'" "`delwidth'" "`starwidth'" ///
`""' `"`macval(1)'"' `"`macval(2)'"'
file write `file' `macval(end)' _n
if `hasrtfbrdr' & `rtfbrdron' {
local begin: subinstr local rtfbeginbak "@rtfrowdefbrdr" `"`rtfrowdef'"'
local rtfbrdron 0
}
}
*Write head: Models captions
if "`mlabelsnone'"=="" {
if "`smcltags'"!="" file write `file' "{txt}"
InsertAtVariables `"`macval(mlabelsbegin)'"' 2 "`ncols'" `macval(atvars2)'
local mlabelsbegin `"`macval(value)'"'
InsertAtVariables `"`macval(mlabelsend)'"' 2 "`ncols'" `macval(atvars2)''
local mlabelsend `"`macval(value)'"'
local tmpbegin `"`macval(begin)'"'
local tmpend `"`macval(end)'"'
if "`mlabelsreplace'"!="" {
if `"`macval(mlabelsbegin)'"'!="" local tmpbegin
if `"`macval(mlabelsend)'"'!="" local tmpend
}
Abbrev `varwidth' `"`macval(mlabelslhs)'"' "`abbrev'"
WriteBegin `"`file'"' `"`macval(mlabelsbegin)'"' `"`macval(tmpbegin)'"' ///
`"`fmt_v' (`"`macval(value)'"')"'
WriteCaption `"`file'"' `"`macval(delimiter)'"' ///
`"`macval(stardetach)'"' "`modelsrow'" "`modelsrow'" ///
`"`macval(mlabels)'"' "`starsrow'" "`mlabelsspan'" "`abbrev'" ///
"`modelwidth'" "`fmt_m'" "`delwidth'" "`starwidth'" ///
`"`macval(mlabelserepeat)'"' `"`macval(mlabelsprefix)'"' ///
`"`macval(mlabelssuffix)'"'
WriteEnd `"`file'"' `"`macval(tmpend)'"' `"`macval(mlabelsend)'"' ///
`"`macval(value)'"'
if `hasrtfbrdr' & `rtfbrdron' {
local begin: subinstr local rtfbeginbak "@rtfrowdefbrdr" `"`rtfrowdef'"'
local rtfbrdron 0
}
}
*Write head: Equations captions
if "`eqlabelsnone'"=="" {
InsertAtVariables `"`macval(eqlabelsbegin)'"' 2 "`ncols'" `macval(atvars2)'
local eqlabelsbegin `"`macval(value)'"'
InsertAtVariables `"`macval(eqlabelsend)'"' 2 "`ncols'" `macval(atvars2)'
local eqlabelsend `"`macval(value)'"'
}
if `"`eqswide'"'!="_" & "`eqlabelsnone'"=="" {
local tmpbegin `"`macval(begin)'"'
local tmpend `"`macval(end)'"'
if "`eqlabelsreplace'"!="" {
if `"`macval(eqlabelsbegin)'"'!="" local tmpbegin
if `"`macval(eqlabelsend)'"'!="" local tmpend
}
if "`smcltags'"!="" file write `file' "{txt}"
Abbrev `varwidth' `"`macval(eqlabelslhs)'"' "`abbrev'"
WriteBegin `"`file'"' `"`macval(eqlabelsbegin)'"' `"`macval(tmpbegin)'"' ///
`"`fmt_v' (`"`macval(value)'"')"'
WriteCaption `"`file'"' `"`macval(delimiter)'"' ///
`"`macval(stardetach)'"' "`eqsrow'" "`modelsrow'" ///
`"`macval(eqlabels)'"' "`starsrow'" "`eqlabelsspan'" "`abbrev'" ///
"`modelwidth'" "`fmt_m'" "`delwidth'" "`starwidth'" ///
`"`macval(eqlabelserepeat)'"' `"`macval(eqlabelsprefix)'"' ///
`"`macval(eqlabelssuffix)'"'
WriteEnd `"`file'"' `"`macval(tmpend)'"' `"`macval(eqlabelsend)'"' ///
`"`macval(value)'"'
if `hasrtfbrdr' & `rtfbrdron' {
local begin: subinstr local rtfbeginbak "@rtfrowdefbrdr" `"`rtfrowdef'"'
local rtfbrdron 0
}
}
*Write head: Columns captions
if `"`macval(collabels)'"'!="" & "`collabelsnone'"=="" {
if "`smcltags'"!="" file write `file' "{txt}"
InsertAtVariables `"`macval(collabelsbegin)'"' 2 "`ncols'" `macval(atvars2)'
local collabelsbegin `"`macval(value)'"'
InsertAtVariables `"`macval(collabelsend)'"' 2 "`ncols'" `macval(atvars2)'
local collabelsend `"`macval(value)'"'
local tmpbegin `"`macval(begin)'"'
local tmpend `"`macval(end)'"'
if "`collabelsreplace'"!="" {
if `"`macval(collabelsbegin)'"'!="" local tmpbegin
if `"`macval(collabelsend)'"'!="" local tmpend
}
Abbrev `varwidth' `"`macval(collabelslhs)'"' "`abbrev'"
WriteBegin `"`file'"' `"`macval(collabelsbegin)'"' `"`macval(tmpbegin)'"' ///
`"`fmt_v' (`"`macval(value)'"')"'
WriteCaption `"`file'"' `"`macval(delimiter)'"' ///
`"`macval(stardetach)'"' "`colsrow'" "" `"`macval(collabels)'"' ///
"`starsrow'" "`collabelsspan'" "`abbrev'" "`modelwidth'" "`fmt_m'" ///
"`delwidth'" "`starwidth'" `"`macval(collabelserepeat)'"' ///
`"`macval(collabelsprefix)'"' `"`macval(collabelssuffix)'"'
WriteEnd `"`file'"' `"`macval(tmpend)'"' `"`macval(collabelsend)'"' ///
`"`macval(value)'"'
if `hasrtfbrdr' & `rtfbrdron' {
local begin: subinstr local rtfbeginbak "@rtfrowdefbrdr" `"`rtfrowdef'"'
local rtfbrdron 0
}
}
*Write posthead
foreach line of local posthead {
if "`smcltags'"!="" file write `file' "{txt}"
InsertAtVariables `"`macval(line)'"' 0 "`ncols'" `macval(atvars2)' `macval(atvars3)'
file write `file' `"`macval(value)'"' _n
}
*Write body of table
*Loop over table rows
InsertAtVariables `"`macval(varlabelsbegin)'"' 2 "`ncols'" `macval(atvars2)'
local varlabelsbegin `"`macval(value)'"'
InsertAtVariables `"`macval(varlabelsend)'"' 2 "`ncols'" `macval(atvars2)'
local varlabelsend `"`macval(value)'"'
tempname first
if `"`vblock'"'!="" {
local RI = `R' + `nindicate'
local e 0
local eqdim = `R' + `nindicate'
local weqcnt 0
if `hasrtfbrdr' {
local begin: subinstr local rtfbeginbak "@rtfrowdefbrdr" `"`rtfrowdefbrdrt'"'
local rtfbrdron 1
}
local varlabelsbegin0 `"`macval(varlabelsbegin)'"'
local eqlabelsbegin0 `"`macval(eqlabelsbegin)'"'
if "`eqlabelsfirst'"=="" local eqlabelsbegin0
forv r = 1/`R' {
local varlabelsend0 `"`macval(varlabelsend)'"'
local var: word `r' of `varlist'
*Write equation name/label
if "`unstack'"=="" {
local eqvar: word `r' of `fullvarlist'
if `"`eqs'"'!="_" {
local eqrlast `"`eqr'"'
local eqr: word `r' of `eqlist'
if `"`eqr'"'!=`"`eqrlast'"' & "`eqlabelsnone'"=="" {
local value: word `++e' of `macval(eqlabels)'
local eqdim: word `e' of `macval(eqsdims)'
local weqcnt 0
if `e'==`numeqs' {
if "`eqlabelslast'"=="" local eqlabelsend
local eqdim = `eqdim' + `nindicate'
}
local tmpbegin `"`macval(begin)'"'
local tmpend `"`macval(end)'"'
if "`eqlabelsreplace'"!="" {
if `"`macval(eqlabelsbegin0)'"'!="" local tmpbegin
if `"`macval(eqlabelsend)'"'!="" local tmpend
}
WriteBegin `"`file'"' `"`macval(eqlabelsbegin0)'"' `"`macval(tmpbegin)'"'
if "`smcltags'"!="" file write `file' "{res}"
WriteEqrow `"`file'"' `"`macval(delimiter)'"' ///
`"`macval(stardetach)'"' `"`macval(value)'"' "`starsrow'" ///
"`eqlabelsspan'" "`varwidth'" "`fmt_v'" "`abbrev'" ///
"`modelwidth'" "`fmt_m'" "`delwidth'" "`starwidth'" ///
`"`macval(eqlabelsprefix)'"' `"`macval(eqlabelssuffix)'"'
if "`smcltags'"!="" file write `file' "{txt}"
WriteEnd `"`file'"' `"`macval(tmpend)'"' `"`macval(eqlabelsend)'"'
if `hasrtfbrdr' & `rtfbrdron' {
local begin: subinstr local rtfbeginbak "@rtfrowdefbrdr" `"`rtfrowdef'"'
local rtfbrdron 0
}
local eqlabelsbegin0 `"`macval(eqlabelsbegin)'"'
}
}
}
local ++weqcnt
if `weqcnt'==1 {
if "`varlabelsfirst'"=="" local varlabelsbegin0
}
*Determine rows to be written
local rvblock
foreach row of local vblock {
local c 0
local skiprow 1
foreach v of local row {
local ++c
if index("`v'",".")==1 continue
if "`unstack'"!="" {
local eqr: word `:word `c' of `eqsrow'' of `eqs'
if `"`eqr'"'!="" local eqvar `"`eqr':`var'"'
else local eqvar "`var'"
}
if rownumb(`B',`"`eqvar'"')<. {
if `: list eqvar in `v'_drop' continue
local skiprow 0
continue, break
}
}
if `skiprow' continue
local rvblock `"`rvblock'"`row'" "'
}
local nrvblock: list sizeof rvblock
*Insert refcat() (unless refcatbelow)
if `"`macval(refcat)'"'!="" {
local isref: list posof "`var'" in refcatcoefs
if `isref' {
if "`unstack'"=="" {
local temp `"`eqr'"'
if `"`temp'"'=="" local temp "_"
}
else local temp `"`eqswide'"'
GenerateRefcatRow `B' "`var'" `"`temp'"' `"`macval(refcatlabel)'"'
local refcatrow `"`macval(value)'"'
}
}
else local isref 0
if `isref' & `"`refcatbelow'"'=="" {
if "`smcltags'"!="" file write `file' "{txt}"
local tmpbegin `"`macval(begin)'"'
local tmpend `"`macval(end)'"'
if "`varlabelsreplace'"!="" {
if `"`macval(varlabelsbegin0)'"'!="" local tmpbegin
if `"`macval(varlabelsend0)'"'!="" local tmpend
}
if "`varlabelsnone'"=="" {
local value: word `isref' of `macval(refcatnames)'
Abbrev `varwidth' `"`macval(value)'"' "`abbrev'"
}
else local value
WriteBegin `"`file'"' `"`macval(varlabelsbegin0)'"' `"`macval(tmpbegin)'"' ///
`"`fmt_v' (`"`macval(varlabelsprefix)'`macval(value)'`macval(varlabelssuffix)'"')"'
if "`smcltags'"!="" file write `file' "{res}"
WriteStrRow `"`file'"' "`modelsrow'" `"`eqsrow'"' `"`: list sizeof eqswide'"' ///
`"`macval(refcatrow)'"' `"`macval(delimiter)'"' ///
`"`macval(stardetach)'"' "`starsrow'" "`abbrev'" ///
"`modelwidth'" "`fmt_m'" "`delwidth'" "`starwidth'"
if "`smcltags'"!="" file write `file' "{txt}"
WriteEnd `"`file'"' `"`macval(tmpend)'"' `"`macval(varlabelsend0)'"'
if `hasrtfbrdr' & `rtfbrdron' {
local begin: subinstr local rtfbeginbak "@rtfrowdefbrdr" `"`rtfrowdef'"'
local rtfbrdron 0
}
local varlabelsbegin0 `"`macval(varlabelsbegin)'"'
}
*Write variable name/label
if "`smcltags'"!="" file write `file' "{txt}"
local tmpbegin `"`macval(begin)'"'
if "`varlabelsnone'"=="" {
VarInList "`var'" "`unstack'" `"`eqvar'"' ///
`"`eqr'"' `"`macval(varlabelsblist)'"'
if `"`macval(value)'"'!="" {
InsertAtVariables `"`macval(value)'"' 2 "`ncols'" `macval(atvars2)'
file write `file' `"`macval(value)'"'
if "`varlabelsreplace'"!="" {
local tmpbegin
local varlabelsbegin0
}
}
if "`label'"!="" {
local temp = index("`var'",".")
capture local varl: var l `=substr("`var'",`temp'+1,.)'
if _rc | `"`varl'"'=="" {
local varl `=substr("`var'",`temp'+1,.)'
}
local varl `"`=substr("`var'",1,`temp')'`macval(varl)'"'
}
else local varl `var'
VarInList "`var'" "`unstack'" `"`eqvar'"' ///
`"`eqr'"' `"`macval(varlabels)'"'
if `"`macval(value)'"'!="" {
local varl `"`macval(value)'"'
}
if `"`macval(discrete)'"'!="" {
local temp 0
if "`unstack'"=="" {
if `D'[`r',1]==1 local temp 1
}
else {
foreach eqr of local eqswide {
if `D'[rownumb(`D',`"`eqr':`var'"'),1]==1 local temp 1
}
}
if `temp'==1 & `temp'<. {
local varl `"`macval(varl)'`macval(discrete)'"'
}
}
}
else local varl
if `hasrtfbrdr' & `r'==`RI' & !(`isref' & `"`refcatbelow'"'!="") {
if `:list sizeof rvblock'==1 {
local begin: subinstr local rtfbeginbak "@rtfrowdefbrdr" `"`rtfrowdefbrdrb'"'
local rtfbrdron 1
}
}
if "`varlabelsreplace'"!="" {
if `"`macval(varlabelsbegin0)'"'!="" local tmpbegin
}
if "`wrap'"!="" & `nrvblock'>1 {
local wrap_i 1
local value: piece `wrap_i' `varwidth' of `"`macval(varl)'"', nobreak
Abbrev `varwidth' `"`macval(value)'"' "`abbrev'"
}
else {
Abbrev `varwidth' `"`macval(varl)'"' "`abbrev'"
}
WriteBegin `"`file'"' `"`macval(varlabelsbegin0)'"' `"`macval(tmpbegin)'"' ///
`"`fmt_v' (`"`macval(varlabelsprefix)'`macval(value)'`macval(varlabelssuffix)'"')"'
if `hasrtfbrdr' & `rtfbrdron' {
local begin: subinstr local rtfbeginbak "@rtfrowdefbrdr" `"`rtfrowdef'"'
local rtfbrdron 0
}
local varlabelsbegin0 `"`macval(varlabelsbegin)'"'
*Write table cells
if "`smcltags'"!="" file write `file' "{res}"
local newrow 0
mat `first'=J(1,`nmodels',1)
foreach row of local rvblock {
if `hasrtfbrdr' & `r'==`RI' & !(`isref' & `"`refcatbelow'"'!="") {
if `"`ferest()'"'=="" {
local begin: subinstr local rtfbeginbak "@rtfrowdefbrdr" `"`rtfrowdefbrdrb'"'
local rtfbrdron 1
}
}
local c 0
foreach v of local row {
local m: word `++c' of `modelsrow'
if "`unstack'"!="" {
capt local eqr: word `:word `c' of `eqsrow'' of `eqs'
local rr=rownumb(`B',`"`eqr':`var'"')
if `"`eqr'"'!="" local eqvar `"`eqr':`var'"'
else local eqvar "`var'"
if `rr'>=. local v ".`v'"
}
else local rr `r'
if index("`v'",".")!=1 {
local temp = substr("`v'",index("`v'",".")+1,.)
if `: list eqvar in `temp'_drop' local v ".`temp'"
}
if `newrow' & `c'==1 {
if "`smcltags'"!="" file write `file' "{txt}"
if "`wrap'"!="" & `nrvblock'>1 {
local value
local space
while (1) {
local temp: piece `++wrap_i' `varwidth' of `"`macval(varl)'"', nobreak
if `"`macval(temp)'"'=="" continue, break
local value `"`macval(value)'`space'`macval(temp)'"'
if `wrap_i'<`nrvblock' continue, break
local space " "
}
Abbrev `varwidth' `"`macval(value)'"' "`abbrev'"
local value `"`fmt_v' (`"`macval(varlabelsprefix)'`macval(value)'`macval(varlabelssuffix)'"')"'
}
else local value "_skip(`varwidth')"
file write `file' `macval(end)' _n `macval(begin)' `value'
if "`smcltags'"!="" file write `file' "{res}"
}
if index("`v'",".")==1 local value
else if `B'[`rr',`m'*2-1]==0 & `B'[`rr',`m'*2]==0 & `droppedison' {
if `first'[1,`m'] {
local value `"`macval(dropped)'"'
mat `first'[1,`m']=0
}
else local value
}
else if "`v'"=="ci" {
if `_ci_l'[`rr',`m']==.z local value `"``v'_vacant'"'
else if `B'[`rr',`m'*2-1]<. & `_ci_l'[`rr',`m']>=. local value .
else if `_ci_l'[`rr',`m']<. {
local format: word `r' of `ci_fmt'
if "`format'"=="" local format: word `:word count `ci_fmt'' of `ci_fmt'
local value = `_ci_l'[`rr',`m']
vFormat `value' `format' "`lz'" `"`macval(dmarker)'"' ///
`"`macval(msign)'"' `"`macval(ci_l_par)'"'
local temp "`macval(value)'"
local value = `_ci_u'[`rr',`m']
vFormat `value' `format' "`lz'" `"`macval(dmarker)'"' ///
`"`macval(msign)'"' `"`macval(ci_u_par)'"'
local value `"`macval(temp)'`macval(value)'"'
}
}
else if `_`v''[`rr',`m']==.z local value `"``v'_vacant'"'
else if `_`v''[`rr',`m']>=. {
local value .
}
else if "`v'"=="_star" {
CellStars `"`macval(starlevels)'"' `_``v'_pvalue''[`rr',`m'] `"`macval(`v'_par)'"'
}
else if "`v'"=="_sign" {
MakeSign `_`v''[`rr',`m'] `"`macval(msign)'"' `"`macval(`v'_par)'"'
}
else if "`v'"=="_sigsign" {
MakeSign `_`v''[`rr',`m'] `"`macval(msign)'"' `"`macval(`v'_par)'"' ///
`"`macval(starlevels)'"' `_``v'_pvalue''[`rr',`m']
}
else {
local format: word `r' of ``v'_fmt'
if "`format'"=="" local format: word `:word count ``v'_fmt'' of ``v'_fmt'
local value = `_`v''[`rr',`m']
vFormat `value' `format' "`lz'" `"`macval(dmarker)'"' ///
`"`macval(msign)'"' `"`macval(`v'_par)'"'
}
file write `file' `macval(delimiter)' `fmt_m' (`"`macval(value)'"')
if index("`v'",".")!=1 & `"``v'_star'"'!="" {
Stars `"`macval(starlevels)'"' `_``v'_pvalue''[`rr',`m']
file write `file' `macval(stardetach)' `fmt_star' (`"`macval(value)'"')
}
else if `:word `c' of `starsrow''==1 {
file write `file' `macval(stardetach)' _skip(`starwidth')
}
}
local newrow 1
}
*End of table row
if "`smcltags'"!="" file write `file' "{txt}"
if `weqcnt'==`eqdim' & "`varlabelslast'"=="" ///
& !(`isref' & `"`refcatbelow'"'!="") local varlabelsend0
local tmpend `"`macval(end)'"'
if "`varlabelsreplace'"!="" {
if `"`macval(varlabelsend0)'"'!="" local tmpend
}
VarInList "`var'" "`unstack'" `"`eqvar'"' `"`eqr'"' ///
`"`macval(varlabelselist)'"'
InsertAtVariables `"`macval(value)'"' 2 "`ncols'" `macval(atvars2)'
if "`varlabelsreplace'"!="" {
if `"`macval(value)'"'!="" local varlabelsend0
}
WriteEnd `"`file'"' `"`macval(tmpend)'"' `"`macval(varlabelsend0)'"' ///
`"`macval(value)'"'
* insert refcat() (if refcatbelow)
if `isref' & `"`refcatbelow'"'!="" {
if "`smcltags'"!="" file write `file' "{txt}"
if `hasrtfbrdr' & `r'==`RI' {
local begin: subinstr local rtfbeginbak "@rtfrowdefbrdr" `"`rtfrowdefbrdrb'"'
local rtfbrdron 1
}
if `weqcnt'==`eqdim' & "`varlabelslast'"=="" local varlabelsend0
local tmpbegin `"`macval(begin)'"'
local tmpend `"`macval(end)'"'
if "`varlabelsreplace'"!="" {
if `"`macval(varlabelsbegin0)'"'!="" local tmpbegin
if `"`macval(varlabelsend0)'"'!="" local tmpend
}
if "`varlabelsnone'"=="" {
local value: word `isref' of `macval(refcatnames)'
Abbrev `varwidth' `"`macval(value)'"' "`abbrev'"
}
else local value
WriteBegin `"`file'"' `"`macval(varlabelsbegin0)'"' `"`macval(tmpbegin)'"' ///
`"`fmt_v' (`"`macval(varlabelsprefix)'`macval(value)'`macval(varlabelssuffix)'"')"'
if "`smcltags'"!="" file write `file' "{res}"
WriteStrRow `"`file'"' "`modelsrow'" `"`eqsrow'"' `"`: list sizeof eqswide'"' ///
`"`macval(refcatrow)'"' `"`macval(delimiter)'"' ///
`"`macval(stardetach)'"' "`starsrow'" "`abbrev'" ///
"`modelwidth'" "`fmt_m'" "`delwidth'" "`starwidth'"
if "`smcltags'"!="" file write `file' "{txt}"
WriteEnd `"`file'"' `"`macval(tmpend)'"' `"`macval(varlabelsend0)'"'
}
* end insert refcat()
}
}
*Write indicator sets
forv i=1/`nindicate' {
if `hasrtfbrdr' & `i'==`nindicate' {
local begin: subinstr local rtfbeginbak "@rtfrowdefbrdr" `"`rtfrowdefbrdrb'"'
local rtfbrdron 1
}
if `i'==`nindicate' & "`varlabelslast'"=="" local varlabelsend
local tmpbegin `"`macval(begin)'"'
local tmpend `"`macval(end)'"'
if "`varlabelsreplace'"!="" {
if `"`macval(varlabelsbegin0)'"'!="" local tmpbegin
if `"`macval(varlabelsend)'"'!="" local tmpend
}
if "`varlabelsnone'"=="" {
Abbrev `varwidth' `"`macval(indicate_`i'_name)'"' "`abbrev'"
}
else local value
if "`smcltags'"!="" file write `file' "{txt}"
WriteBegin `"`file'"' `"`macval(varlabelsbegin0)'"' `"`macval(tmpbegin)'"' ///
`"`fmt_v' (`"`macval(varlabelsprefix)'`macval(value)'`macval(varlabelssuffix)'"')"'
if "`smcltags'"!="" file write `file' "{res}"
WriteStrRow `"`file'"' "`modelsrow'" `"`eqsrow'"' `"`: list sizeof eqswide'"' ///
`"`macval(indicate_`i'_lbls)'"' `"`macval(delimiter)'"' ///
`"`macval(stardetach)'"' "`starsrow'" "`abbrev'" ///
"`modelwidth'" "`fmt_m'" "`delwidth'" "`starwidth'"
if "`smcltags'"!="" file write `file' "{txt}"
WriteEnd `"`file'"' `"`macval(tmpend)'"' `"`macval(varlabelsend)'"'
}
*Write prefoot
foreach line of local prefoot {
if "`smcltags'"!="" file write `file' "{txt}"
InsertAtVariables `"`macval(line)'"' 0 "`ncols'" `macval(atvars2)' `macval(atvars3)'
file write `file' `"`macval(value)'"' _n
}
*Write foot of table (statistics)
InsertAtVariables `"`macval(statslabelsbegin)'"' 2 "`ncols'" `macval(atvars2)'
local statslabelsbegin `"`macval(value)'"'
InsertAtVariables `"`macval(statslabelsend)'"' 2 "`ncols'" `macval(atvars2)'
local statslabelsend `"`macval(value)'"'
local statslabelsbegin0 `"`macval(statslabelsbegin)'"'
local S: list sizeof statsarray
cap confirm matrix `mestats'
local hasmestats = (_rc==0)
local eqr "_"
if `hasrtfbrdr' {
local begin: subinstr local rtfbeginbak "@rtfrowdefbrdr" `"`rtfrowdefbrdrt'"'
local rtfbrdron 1
}
forv r = 1/`S' {
if `r'==`S' & `hasrtfbrdr' {
local begin: subinstr local rtfbeginbak "@rtfrowdefbrdr" `"`rtfrowdefbrdrb'"'
local rtfbrdron 1
}
local stat: word `r' of `macval(statslabels)'
if `"`stat'"'=="" local stat: word `r' of `statsrowlbls'
if "`statslabelsnone'"!="" local stat
if "`smcltags'"!="" file write `file' "{txt}"
if `r'==1 & "`statslabelsfirst'"=="" local statslabelsbegin0
local tmpbegin `"`macval(begin)'"'
if "`statslabelsreplace'"!="" {
if `"`macval(statslabelsbegin0)'"'!="" local tmpbegin
}
Abbrev `varwidth' `"`macval(stat)'"' "`abbrev'"
WriteBegin `"`file'"' `"`macval(statslabelsbegin0)'"' `"`macval(tmpbegin)'"' ///
`"`fmt_v' (`"`macval(statslabelsprefix)'`macval(value)'`macval(statslabelssuffix)'"')"'
if `r'==1 & "`statslabelsfirst'"=="" {
local statslabelsbegin0 `"`macval(statslabelsbegin)'"'
}
if "`smcltags'"!="" file write `file' "{res}"
local strow: word `r' of `statsarray'
local strowlay: word `r' of `macval(statslayout)'
local strowfmt: word `r' of `statsrowfmt'
local strowstar: word `r' of `statsrowstar'
local lastm
local lasteq
local c 0
foreach m of local modelsrow {
local ++c
if "`m'"=="." {
file write `file' `macval(delimiter)' `fmt_m' (`""')
continue
}
local value
local eq: word `:word `c' of `eqsrow'' of `eqs'
if "`m'"!="`lastm'" local stc 0
if "`m'"!="`lastm'" | `"`eq'"'!="`lasteq'" local stc_eq 0
local usemestats 0
local ++stc_eq
local stcell: word `++stc' of `strow'
local stcelllay: word `stc' of `macval(strowlay)'
local stcellfmt: word `stc' of `strowfmt'
local stcellstar: word `stc' of `strowstar'
local cellhasstat 0
foreach stat of local stcell {
gettoken format stcellfmt: stcellfmt
local rr = rownumb(`St',`"`stat'"')
local value = `St'[`rr',`m']
if `value'!=.z {
local cellhasstat 1
vFormat `value' "`format'" "`lz'" `"`macval(dmarker)'"' ///
`"`macval(msign)'"'
local stcelllay: subinstr local stcelllay `"`statspchar'"' `"`macval(value)'"'
}
}
if `cellhasstat'==0 & `hasmestats' {
local stcell: word `stc_eq' of `strow'
local stcelllay: word `stc_eq' of `macval(strowlay)'
local stcellfmt: word `stc_eq' of `strowfmt'
local stcellstar: word `stc_eq' of `strowstar'
local cellhasstat 0
foreach stat of local stcell {
gettoken format stcellfmt: stcellfmt
local rr = rownumb(`mestats',`"`eq':`stat'"')
local value = `mestats'[`rr',`m']
if `value'!=.z {
local cellhasstat 1
vFormat `value' "`format'" "`lz'" `"`macval(dmarker)'"' ///
`"`macval(msign)'"'
local stcelllay: subinstr local stcelllay `"`statspchar'"' `"`macval(value)'"'
}
}
if `cellhasstat' local usemestats 1
}
if `cellhasstat'==0 local stcelllay
file write `file' `macval(delimiter)' `fmt_m' (`"`macval(stcelllay)'"')
if `:word `c' of `starsrow''==1 {
if "`stcellstar'"=="1" & `cellhasstat' {
if `usemestats' {
local rr=rownumb(`mestats',`"`eq':p"')
Stars `"`macval(starlevels)'"' `mestats'[`rr',`m']
}
else {
Stars `"`macval(starlevels)'"' `St'[2,`m']
}
file write `file' `macval(stardetach)' `fmt_star' (`"`macval(value)'"')
}
else {
file write `file' `macval(stardetach)' _skip(`starwidth')
}
}
local lastm "`m'"
local lasteq `"`eq'"'
}
if `r'==`S' & "`statslabelslast'"=="" local statslabelsend
local tmpend `"`macval(end)'"'
if "`statslabelsreplace'"!="" {
if `"`macval(statslabelsend)'"'!="" local tmpend
}
if "`smcltags'"!="" file write `file' "{txt}"
WriteEnd `"`file'"' `"`macval(tmpend)'"' `"`macval(statslabelsend)'"'
if `hasrtfbrdr' & `rtfbrdron' {
local begin: subinstr local rtfbeginbak "@rtfrowdefbrdr" `"`rtfrowdef'"'
local rtfbrdron 0
}
}
*Write postfoot
local discrete: list retok discrete
foreach line of local postfoot {
if "`smcltags'"!="" file write `file' "{txt}"
InsertAtVariables `"`macval(line)'"' 0 "`ncols'" `macval(atvars2)' `macval(atvars3)'
file write `file' `"`macval(value)'"' _n
}
*Write legend (starlevels, marginals)
if "`legend'"!="" {
if `"`macval(discrete2)'"'!="" {
mat `D' = `D''*`D'
if `D'[1,1]!=0 {
if "`smcltags'"!="" file write `file' "{txt}"
file write `file' `"`macval(discrete)'`macval(discrete2)'"' _n
}
}
if `"`macval(starlegend)'"'!="" {
if "`smcltags'"!="" file write `file' "{txt}"
file write `file' `"`macval(starlegend)'"' _n
}
}
*Finish: copy tempfile to user file / type to screen
file close `file'
local S: word count `macval(substitute)'
if `"`using'"'!="" {
tempname file2
file open `file2' `using', write text `replace' `append'
}
file open `file' using `"`tfile'"', read text
file read `file' temp
if "`type'"!="" di as res ""
while r(eof)==0 {
forv s = 1(2)`S' {
local from: word `s' of `macval(substitute)'
local to: word `=`s'+1' of `macval(substitute)'
local temp: subinstr local temp `"`macval(from)'"' `"`macval(to)'"', all
}
if `"`using'"'!="" {
file write `file2' `"`macval(temp)'"' _n
}
if "`type'"!="" {
if "`showtabs'"!="" {
local temp: subinstr local temp "`=char(9)'" "", all
}
di `asis' `"`macval(temp)'"'
}
file read `file' temp
}
file close `file'
if `"`using'"'!="" {
file close `file2'
}
end
program MoreOptions // estout has more options than -syntax- can handle
local theoptions /// MoreOptions is intended for options without arguments only
NOASIS asis ///
NOWRAP wrap ///
NOSMCLTAGS smcltags
syntax [, `theoptions' ]
foreach opt of local theoptions {
local opt = lower("`opt'")
c_local `opt' "``opt''"
}
c_local options
end
program ParseValueSubopts
syntax anything [ , NOStar Star PVALue(string) fmt(string) Label(string) Vacant(string) ///
NOPAR par PAR2(string asis) Keep(string) Drop(string) PATtern(string) NOABS abs ]
CheckPattern `"`pattern'"' "`anything'"
if `"`macval(par2)'"'!="" {
local par `"`macval(par2)'"'
}
else if "`par'"!="" {
if "`anything'"=="ci" local par "[ , ]"
else if "`anything'"=="ci_l" local par `"[ """'
else if "`anything'"=="ci_u" local par `""" ]"'
else local par "( )"
}
foreach opt in star par abs {
if "`no`opt''"!="" c_local no`anything'_`opt' 1
else c_local `anything'_`opt' `"`macval(`opt')'"'
}
foreach opt in pvalue fmt label vacant keep drop pattern {
c_local `anything'_`opt' `"`macval(`opt')'"'
}
end
program CheckPattern
args pattern option
foreach p of local pattern {
if !( "`p'"=="1" | "`p'"=="0" ) {
di as error `""`pattern'" invalid in `option'(... pattern())"'
exit 198
}
}
end
program ParseStatsSubopts
syntax [anything] [ , fmt(string) Labels(string asis) ///
NOStar Star Star2(string) LAYout(string asis) PChar(string) ]
foreach opt in fmt labels layout pchar {
c_local stats`opt' `"`macval(`opt')'"'
}
if "`nostar'"!="" c_local nostatsstar 1
else if "`star2'"!="" {
local anything: list anything | star2
c_local statsstar "`star2'"
}
else if "`star'"!="" {
local star2: word 1 of `anything'
c_local statsstar "`star2'"
}
c_local stats "`anything'"
c_local stats2
end
prog ProcessStatslayout // returns statsarray, -rowlbls, -rowfmt, -rowstar, -colstar, -layout
args stats statsfmt statsstar statslayout statspchar
local format "%9.0g"
if `"`statspchar'"'=="" {
local statspchar "@"
c_local statspchar "@"
}
local statsarray
local statsrowlbls
local statsrowfmt
local statsrowstar
local space1
local i 0
local wmax 0
foreach row of local statslayout {
local statsrow
local statsrowlbl
local statsrfmt
local statsrstar
local space2
local w = 0
foreach cell of local row {
local ++w
local statscell
local statsclbl `"`cell'"'
local statscfmt
local statscstar 0
local space3
local trash: subinstr local cell `"`statspchar'"' "", all count(local cnt)
forv j=1/`cnt' {
local stat: word `++i' of `stats'
local statscell `"`statscell'`space3'`stat'"'
local statsclbl: subinstr local statsclbl `"`statspchar'"' "`stat'"
local tmp: word `i' of `statsfmt'
if `"`tmp'"'!="" local format `"`tmp'"'
local statscfmt `"`statscfmt'`space3'`format'"'
if `:list stat in statsstar' {
local statscstar 1
local statscol_`w' 1
}
local space3 " "
}
local statsrow `"`statsrow'`space2'"`statscell'""'
local statsrowlbl `"`statsrowlbl'`space2'`statsclbl'"'
local statsrfmt `"`statsrfmt'`space2'"`statscfmt'""'
local statsrstar "`statsrstar'`space2'`statscstar'"
local space2 " "
}
local statsarray `"`statsarray'`space1'`"`statsrow'"'"'
local statsrowlbls `"`statsrowlbls'`space1'`"`statsrowlbl'"'"'
local statsrowfmt `"`statsrowfmt'`space1'`"`statsrfmt'"'"'
local statsrowstar `"`statsrowstar'`space1'`"`statsrstar'"'"'
local space1 " "
local wmax = max(`w',`wmax')
}
while (1) {
local stat: word `++i' of `stats'
if `"`stat'"'=="" continue, break
local tmp: word `i' of `statsfmt'
if `"`tmp'"'!="" local format `"`tmp'"'
local statscstar: list stat in statsstar
local statsarray `"`statsarray'`space1'`"`stat'"'"'
local statsrowlbls `"`statsrowlbls'`space1'`"`stat'"'"'
local statsrowfmt `"`statsrowfmt'`space1'`"`format'"'"'
local statsrowstar `"`statsrowstar'`space1'`"`statscstar'"'"'
local statslayout `"`statslayout'`space1'`statspchar'"'
local space1 " "
local wmax = max(1,`wmax')
}
local statscolstar
local space
forv w = 1/`wmax' {
if "`statscol_`w''"=="" local statscol_`w' 0
local statscolstar "`statscolstar'`space'`statscol_`w''"
local space " "
}
c_local statsarray `"`statsarray'"'
c_local statsrowlbls `"`statsrowlbls'"'
c_local statsrowfmt `"`statsrowfmt'"'
c_local statsrowstar `"`statsrowstar'"'
c_local statscolstar `"`statscolstar'"'
c_local statslayout `"`statslayout'"'
end
program ParseLabelsSubopts
gettoken type 0: 0
syntax [anything] [ , NONUMbers NUMbers NODEPvars DEPvars NONONE NONE ///
NOSPAN span Prefix(string) Suffix(string) Begin(string asis) ///
End(string asis) NOReplace Replace BList(string asis) EList(string asis) ///
ERepeat(string) NOFirst First NOLast Last lhs(string) PATtern(string) ]
CheckPattern `"`pattern'"' "`type'"
foreach opt in prefix suffix begin end blist elist erepeat lhs pattern {
c_local `type'`opt' `"`macval(`opt')'"'
}
foreach opt in numbers depvars span replace none first last {
if "`no`opt''"!="" c_local no`type'`opt' 1
else c_local `type'`opt' "``opt''"
}
c_local `type' `"`macval(anything)'"'
end
program ReadLine
args max file
local end 0
file read `file' temp1
while r(eof)==0 {
local j 1
local temp2
local temp3: piece `j++' `max' of `"`macval(temp1)'"'
if `"`temp3'"'=="" | index(`"`temp3'"',"*")==1 ///
| index(`"`temp3'"',"//")==1 {
file read `file' temp1
continue
}
while `"`temp3'"'!="" {
local comment=index(`"`macval(temp3)'"'," ///")
if `comment' {
local temp3=substr(`"`macval(temp3)'"',1,`comment')
local temp2 `"`macval(temp2)'`macval(temp3)'"'
local end 0
continue, break
}
local comment=index(`"`macval(temp3)'"'," //")
if `comment' {
local temp3=substr(`"`macval(temp3)'"',1,`comment')
local temp2 `"`macval(temp2)'`macval(temp3)'"'
local end 1
continue, break
}
local temp2 `"`macval(temp2)'`macval(temp3)'"'
local temp3: piece `j++' `max' of `"`macval(temp1)'"'
local end 1
}
if `end' {
local line `"`macval(line)'`macval(temp2)'"'
continue, break
}
else {
local line `"`macval(line)'`macval(temp2)'"'
file read `file' temp1
}
}
c_local line `"`macval(line)'"'
end
program CellsCheck
args cells
local ncols 0
local nrows 0
foreach row of local cells {
local newrow
foreach col of local row {
if !`:list col in values' {
local newrow: list newrow | col
local values: list values | col
}
}
if "`newrow'"!="" {
local ncols = max(`ncols',`:list sizeof newrow')
local newcells `"`newcells'"`newrow'" "'
local ++nrows
}
}
local newcells: list retok newcells
c_local cells `"`newcells'"'
c_local ncols `ncols'
c_local nrows `nrows'
c_local values `values'
end
program Star2Cells
args cells star
local newcells
foreach row of local cells {
local newrow
foreach col of local row {
if "`col'"=="`star'" {
local col "`col'star"
}
local newrow: list newrow | col
}
local newcells `"`newcells'"`newrow'" "'
}
local newcells: list retok newcells
c_local cells `"`newcells'"'
end
prog ParseStarlevels
syntax [anything(equalok)] [ , Label(str) Delimiter(str) ]
c_local starlevels `"`macval(anything)'"'
c_local starlevelslabel `"`macval(label)'"'
c_local starlevelsdelimiter `"`macval(delimiter)'"'
end
program CheckStarvals
args starlevels label del
if `"`macval(label)'"'=="" local label " p<"
if `"`macval(del)'"'=="" local del ", "
local nstar: word count `macval(starlevels)'
local nstar = `nstar'/2
capture confirm integer number `nstar'
if _rc {
di as error "unmatched list of significance symbols and levels"
exit 198
}
local istar 1
forv i = 1/`nstar' {
local iistar: word `=`i'*2' of `macval(starlevels)'
confirm number `iistar'
if `iistar'>`istar' | `iistar'<=0 {
di as error "significance levels out of order or out of range (0,1]"
exit 198
}
local istar `iistar'
local isym: word `=`i'*2-1' of `macval(starlevels)'
if `"`macval(legend)'"'!="" {
local legend `"`macval(legend)'`macval(del)'"'
}
local ilabel: subinstr local label "@" "`istar'", count(local hasat)
if `hasat'==0 {
local ilabel `"`macval(label)'`istar'"'
}
local legend `"`macval(legend)'`macval(isym)'`macval(ilabel)'"'
}
c_local starlegend `"`macval(legend)'"'
end
program Starwidth
args starlevels
local nstar: word count `macval(starlevels)'
forv i = 2(2)`nstar' {
local istar: word `=`i'-1' of `macval(starlevels)'
local width = max(length("`width'"),length(`"`macval(istar)'"'))
}
c_local value `width'
end
program ParseEquations
syntax, eqs(string asis) m(numlist int max=1 >0) EQuations(string asis)
local eqspec : subinstr local equations ":" " ", all
local eqspec0 : subinstr local eqspec "#" "" , all
local iterm 0
gettoken term eqspec : eqspec0 , parse(",")
local eqspec0
while "`term'" != "" {
local ++iterm
gettoken eqname oprest: term, parse("=")
gettoken op rest : oprest, parse("=")
if trim(`"`op'"') != "=" {
local op "="
local rest "`eqname'"
local eqname #`iterm'
}
if `:list eqname in eqs' {
if `:list sizeof rest'==1 {
local temp `rest'
forv i = 2/`m' {
local rest `rest' `temp'
}
}
local eqnames `eqnames' `eqname'
local eqspec0 `"`eqspec0'"`rest'" "'
}
if "`eqspec'" == "" {
continue, break
}
gettoken term eqspec: eqspec , parse(",")
assert "`term'" == ","
gettoken term eqspec: eqspec , parse(",")
}
local eqspec0: list retok eqspec0
c_local eqspec `"`eqspec0'"'
c_local eqnames `eqnames'
end
program RestoreEstimates
args B D models eqnames eqspec mldepv labels label margin meqs ///
xv x_v St stats mestats
local elab = "`mldepv'"=="" & "`label'"!=""
local nlabels: list sizeof labels
tempname hcurrent
_est hold `hcurrent', restore nullok estsystem
nobreak {
if "`mldepv'"!="" local labels
local j 1
foreach m of local models {
if "`m'"=="." _est unhold `hcurrent'
else {
capt confirm new var _est_`m' // fix e(sample) if obs
if _rc qui replace _est_`m' = 0 if _est_`m' >=. // have been added
_est unhold `m'
// capt confirm new var _est_`m'
// if _rc drop _est_`m'
}
MatchEqlist "`B'" `j' "`eqnames'" `"`eqspec'"'
if "`mldepv'"!="" {
local var: word 1 of `e(depvar)'
if "`label'"!="" {
local temp = index("`var'",".")
capture local lab: var l `=substr("`var'",`temp'+1,.)'
if _rc | `"`lab'"'=="" {
local lab `=substr("`var'",`temp'+1,.)'
}
local lab `"`=substr("`var'",1,`temp')'`macval(lab)'"'
}
else local lab "`var'"
local labels `"`labels'`"`lab'"' "'
}
if `elab' & `j'>`nlabels' {
local lab `"`e(_estimates_title)'"'
if `"`lab'"'=="" local lab "`m'"
local labels `"`labels' `"`lab'"'"'
}
if "`margin'"!="" GetMarginals `B' `D' `j' "`margin'" `"`meqs'"'
if "`xv'"!="" {
local x 0
foreach v of local xv {
local ++x
local _v: word `x' of `x_v'
local options: word `x' of `macval(xoptions)'
GetValues `v' `j' `B' `_v' `"`eqmatch'"'
}
}
if ( e(cmd)=="reg3" | e(cmd)=="sureg" | e(cmd)=="mvreg" ) ///
& "`stats'"!="" {
GetStats `j' `mestats' `"`eqmatch'"' "`stats'"
}
if "`m'"=="." _est hold `hcurrent', restore estsystem
else _est hold `m', estimates varname(_est_`m')
local ++j
}
_est unhold `hcurrent'
}
c_local mlabels `"`macval(labels)'"'
end
program MatchEqlist
args B j eqnames eqspec
local eqs1: coleq e(b), q
local eqs1: list uniq eqs1
local eqs1: list clean eqs1
local rest `"`eqs1'"'
local eqs2: roweq `B', q
local eqs2: list uniq eqs2
local eqs2: list clean eqs2
local i 0
foreach eq of local eqs2 {
if `:list eq in eqnames' {
local ieq: word `++i' of `eqspec'
local ieq: word `j' of `ieq'
if `ieq'<. {
local ieq: word `ieq' of `eqs1'
if `:list ieq in rest' {
local eqmatch `"`eqmatch'`"`ieq' `eq'"' "'
local rest: list rest - ieq
}
}
}
else if `:list eq in rest' {
local eqmatch `"`eqmatch'`"`eq' `eq'"' "'
local rest: list rest - eq
}
}
local eqmatch: list clean eqmatch
c_local eqmatch `"`eqmatch'"'
end
program GetMarginals
args B D j margin meqs
tempname dfdx
local type `e(Xmfx_type)'
if "`type'"!="" {
mat `dfdx' = e(Xmfx_`type')
capture confirm matrix e(Xmfx_se_`type')
if _rc==0 {
mat `dfdx' = `dfdx' \ e(Xmfx_se_`type')
}
if "`e(Xmfx_discrete)'"=="discrete" local dummy `e(Xmfx_dummy)'
}
else if "`e(cmd)'"=="dprobit" {
mat `dfdx' = e(dfdx) \ e(se_dfdx)
local dummy `e(dummy)'
}
else if "`e(cmd)'"=="tobit" & inlist("`margin'","u","c","p") {
capture confirm matrix e(dfdx_`margin')
if _rc==0 {
mat `dfdx' = e(dfdx_`margin') \ e(se_`margin')
}
local dummy `e(dummy)'
}
else if "`e(cmd)'"=="truncreg" {
capture confirm matrix e(dfdx)
if _rc==0 {
tempname V se
mat `V' = e(V_dfdx)
forv k= 1/`=rowsof(`V')' {
mat `se' = nullmat(`se') , sqrt(`V'[`k',`k'])
}
mat `dfdx' = e(dfdx) \ `se'
}
}
capture confirm matrix `dfdx'
if _rc==0 {
local rnames: rownames `B'
if `"`meqs'"'!="" local reqs: roweq `B', q
local i 1
foreach row of loc rnames {
if `"`meqs'"'!="" {
local eq: word `i' of `reqs'
}
local col = colnumb(`dfdx',"`row'")
if `col'>=. | !`:list eq in meqs' {
mat `B'[`i',`j'*2-1] = .z
mat `B'[`i',`j'*2] = .z
}
else {
mat `B'[`i',`j'*2-1] =`dfdx'[1,`col']
mat `B'[`i',`j'*2] = (`dfdx'[2,`col'])^2
if "`:word `col' of `dummy''"=="1" mat `D'[`i',1] = 1
}
local ++i
}
}
end
program GetValues
args v j B _v eqmatch
capture confirm matrix e(`v')
if !_rc {
tempname V
matrix `V' = e(`v')
local eqs: coleq `V', q
local eqs: list clean eqs
local eqs: list uniq eqs
if `"`eqs'"'=="_" {
local useeqs 0
}
else {
local useeqs 1
local eqs: roweq `_v', q
foreach eqm of local eqmatch {
local eq1: word 1 of `eqm'
local eq2: word 2 of `eqm'
local eqs: subinstr local eqs `"`eq2'"' `"`eq1'"', word all
}
}
local vars: rownames `_v'
local i 0
foreach var of local vars {
local ++i
if `useeqs' local eq: word `i' of `eqs'
else local eq "_"
local c=colnumb(`V',`"`eq':`var'"')
if `c'<. & `B'[`i',`j'*2-1]<.z {
mat `_v'[`i',`j'] = `V'[1,`c']
}
}
}
end
program GetStats
args j mestats eqmatch stats
local eqs: coleq e(b), q
local eqs: list clean eqs
local eqs: list uniq eqs
foreach eqm of local eqmatch {
local eq1: word 1 of `eqm'
local eq2: word 2 of `eqm'
local eqs: subinstr local eqs `"`eq1'"' `"`eq2'"', word
}
local e 0
foreach eq of local eqs {
local ++e
foreach stat of local stats {
local r = rownumb(`mestats',`"`eq':`stat'"')
if `r'==. continue, break
if e(cmd)=="mvreg" {
if "`stat'"=="p" local value: word `e' of `e(p_F)'
else local value: word `e' of `e(`stat')'
}
else if "`stat'"=="df_m" {
local value "`e(`stat'`e')'"
}
else {
local value "`e(`stat'_`e')'"
}
capture confirm number `value'
if !_rc mat `mestats'[`r',`j'] = `value'
}
}
end
program _estout_b
args B _v transform
local C = colsof(`_v')
local R = rowsof(`_v')
local transform: subinstr local transform "@" "\`b'", all
forv c = 1/`C' {
gettoken trans transform : transform
forv r = 1/`R' {
gettoken tr trans : trans
local b `B'[`r',`c'*2-1]
if `"`tr'"'!="" & `b'<. mat `_v'[`r',`c'] = `tr'
else mat `_v'[`r',`c'] = `b'
}
}
end
program _estout_se
args B _v transform // transform should contain first derivatives
local C = colsof(`_v')
local R = rowsof(`_v')
local transform: subinstr local transform "@" "\`b'", all
forv c = 1/`C' {
gettoken trans transform : transform
forv r = 1/`R' {
gettoken tr trans : trans
local b `B'[`r',`c'*2-1]
local var `B'[`r',`c'*2]
if `b'>0 & `var'==0 mat `_v'[`r',`c'] = .
else if `var'>=. mat `_v'[`r',`c'] = `var'
else if `"`tr'"'!="" mat `_v'[`r',`c'] = sqrt(`var') * `tr'
else mat `_v'[`r',`c'] = sqrt(`var')
}
}
end
program _estout_t
args B _v abs
local C = colsof(`_v')
local R = rowsof(`_v')
forv c = 1/`C' {
forv r = 1/`R' {
local b `B'[`r',`c'*2-1]
local var `B'[`r',`c'*2]
if `var'==0 mat `_v'[`r',`c'] = .
else if `var'>=. mat `_v'[`r',`c'] = `var'
else mat `_v'[`r',`c'] = `abs'(`b'/sqrt(`var'))
}
}
end
program _estout_p
args B _v df_r
local C = colsof(`_v')
local R = rowsof(`_v')
forv c = 1/`C' {
forv r = 1/`R' {
local b `B'[`r',`c'*2-1]
local var `B'[`r',`c'*2]
if `var'==0 mat `_v'[`r',`c'] = .
else if `var'>=. mat `_v'[`r',`c'] = `var'
else if `df_r'[1,`c']<. ///
mat `_v'[`r',`c'] = ttail(`df_r'[1,`c'],abs(`b'/sqrt(`var'))) * 2
else mat `_v'[`r',`c'] = (1-norm(abs(`b'/sqrt(`var')))) * 2
}
}
end
program _estout_ci
args sign B _v df_r level transform
local C = colsof(`_v')
local R = rowsof(`_v')
local transform: subinstr local transform "@" "\`_v'[\`r',\`c']", all
forv c = 1/`C' {
gettoken trans transform : transform
forv r = 1/`R' {
gettoken tr trans : trans
local b `B'[`r',`c'*2-1]
local var `B'[`r',`c'*2]
if `var'==0 mat `_v'[`r',`c'] = .
else if `var'>=. mat `_v'[`r',`c'] = `var'
else if `df_r'[1,`c']<. mat `_v'[`r',`c'] = `b' `sign' ///
invttail(`df_r'[1,`c'],(100-`level')/200) * sqrt(`var')
else mat `_v'[`r',`c'] = `b' `sign' ///
invnorm(1-(100-`level')/200) * sqrt(`var')
if `"`tr'"'!="" & `_v'[`r',`c']<. mat `_v'[`r',`c'] = `tr'
}
}
end
program _estout_ci_l
_estout_ci - `0'
end
program _estout_ci_u
_estout_ci + `0'
end
program NumberMlabels
args M mlabels
forv m = 1/`M' {
local num "(`m')"
local lab: word `m' of `macval(mlabels)'
if `"`macval(lab)'"'!="" {
local lab `"`num' `macval(lab)'"'
}
else local lab `num'
local labels `"`macval(labels)'`"`macval(lab)'"' "'
}
c_local mlabels `"`macval(labels)'"'
end
program ModelEqCheck
args B eq m
tempname Bsub
mat `Bsub' = `B'["`eq':",`m'*2-1]
local R = rowsof(`Bsub')
local value 0
forv r = 1/`R' {
if `Bsub'[`r',1]<. {
local value 1
continue, break
}
}
c_local value `value'
end
program Add2Vblock
args block col
foreach v of local col {
gettoken row block: block
local row "`row' `v'"
local row: list retok row
local vblock `"`vblock'"`row'" "'
}
c_local vblock `"`vblock'"'
end
program VblockCheck
args block
foreach row of local block {
local norow 1
foreach v of local row {
if index("`v'",".")!=1 {
local norow 0
continue, break
}
}
if !`norow' {
local vblock `"`vblock'"`row'" "'
}
}
local vblock: list retok vblock
c_local vblock `"`vblock'"'
end
program CountNofEqs
args ms es
local m0 0
local e0 0
local i 0
local eqs 0
foreach m of local ms {
local ++i
local e: word `i' of `es'
if `m'!=`m0' | `e'!=`e0' {
local ++eqs
}
local m0 `m'
local e0 `e'
}
c_local value `eqs'
end
program InsertAtVariables
args value type span M E width hline rtf rtfrowdefbrdrt rtfrowdefbrdrb rtfemptyrow title discrete starlegend
if `type'==1 local atvars span
else {
local atvars span M E width hline
if `rtf' local atvars `atvars' rtfrowdefbrdrt rtfrowdefbrdrb rtfemptyrow
if `type'!=2 local atvars `atvars' title discrete starlegend
}
foreach atvar of local atvars {
capt local value: subinstr local value "@`atvar'" `"`macval(`atvar')'"', all
// note: returns error if length of is more than 502 characters
}
c_local value `"`macval(value)'"'
end
program Abbrev
args width value abbrev
if "`abbrev'"!="" {
if `width'>32 {
local value = substr(`"`macval(value)'"',1,`width')
}
else if `width'>0 {
local value = abbrev(`"`macval(value)'"',`width')
}
}
c_local value `"`macval(value)'"'
end
program MgroupsPattern
args mrow pattern
local i 0
local m0 0
local j 0
foreach m of local mrow {
if `m'!=`m0' {
local p: word `++i' of `pattern'
if `i'==1 local p 1
if "`p'"=="1" local j = `j' + 1
}
local newpattern `newpattern' `j'
local m0 `m'
}
c_local mgroupspattern `newpattern'
end
program WriteCaption
args file delimiter stardetach row rowtwo labels starsrow span ///
abbrev colwidth colfmt delwidth starwidth repeat prefix suffix
local c 0
local nspan 0
local c0 2
local spanwidth -`delwidth'
local spanfmt
foreach r of local row {
local rtwo: word `++c' of `rowtwo'
if "`r'"=="." {
local ++c0
file write `file' `macval(delimiter)' `colfmt' (`""')
}
else if `"`span'"'=="" {
if ( "`r'"!="`lastr'" | "`rtwo'"!="`lastrtwo'" | `"`rowtwo'"'=="" ) {
local value: word `r' of `macval(labels)'
Abbrev `colwidth' `"`macval(value)'"' "`abbrev'"
local value `"`macval(prefix)'`macval(value)'`macval(suffix)'"'
InsertAtVariables `"`macval(value)'"' 1 "1"
}
else local value
file write `file' `macval(delimiter)' `colfmt' (`"`macval(value)'"')
if `:word `c' of `starsrow''==1 {
file write `file' `macval(stardetach)' _skip(`starwidth')
}
local lastr "`r'"
local lastrtwo "`rtwo'"
}
else {
local ++nspan
local spanwidth=`spanwidth'+`colwidth'+`delwidth'
if `:word `c' of `starsrow''==1 {
local spanwidth = `spanwidth' + `starwidth'
if `"`macval(stardetach)'"'!="" {
local ++nspan
local spanwidth = `spanwidth' + `delwidth'
}
}
local nextrtwo: word `=`c'+1' of `rowtwo'
local nextr: word `=`c'+1' of `row'
if "`r'"!="." & ///
("`r'"!="`nextr'" | "`rtwo'"!="`nextrtwo'" | `"`rowtwo'"'=="") {
local value: word `r' of `macval(labels)'
Abbrev `spanwidth' `"`macval(value)'"' "`abbrev'"
local value `"`macval(prefix)'`macval(value)'`macval(suffix)'"'
InsertAtVariables `"`macval(value)'"' 1 "`nspan'"
if `spanwidth'>0 local spanfmt "%-`spanwidth's"
file write `file' `macval(delimiter)' `spanfmt' (`"`macval(value)'"')
InsertAtVariables `"`macval(repeat)'"' 1 "`c0'-`=`c0'+`nspan'-1'"
local repeatlist `"`macval(repeatlist)'`macval(value)'"'
local c0 = `c0' + `nspan'
local nspan 0
local spanwidth -`delwidth'
}
}
}
c_local value `"`macval(repeatlist)'"'
end
program WriteBegin
args file pre begin post
foreach line of local pre {
file write `file' `newline' `"`macval(line)'"'
local newline _n
}
file write `file' `macval(begin)' `macval(post)'
end
program WriteEnd
args file end post post2
file write `file' `macval(end)'
foreach line of local post {
file write `file' `newline' `"`macval(line)'"'
local newline _n
}
file write `file' `"`macval(post2)'"' _n
end
program WriteEqrow
args file delimiter stardetach value row span vwidth fmt_v ///
abbrev mwidth fmt_m delwidth starwidth prefix suffix
local nspan 1
local spanwidth `vwidth'
local spanfmt
if `"`span'"'=="" {
Abbrev `vwidth' `"`macval(value)'"' "`abbrev'"
local value `"`macval(prefix)'`macval(value)'`macval(suffix)'"'
InsertAtVariables `"`macval(value)'"' 1 "1"
file write `file' `fmt_v' (`"`macval(value)'"')
foreach r of local row {
file write `file' `macval(delimiter)' `fmt_m' ("")
if `r'==1 {
file write `file' `macval(stardetach)' _skip(`starwidth')
}
}
}
else {
foreach r of local row {
local ++nspan
local spanwidth = `spanwidth' + `mwidth' + `delwidth'
if `r'==1 {
local spanwidth = `spanwidth' + `starwidth'
if `"`macval(stardetach)'"'!="" {
local ++nspan
local spanwidth = `spanwidth' + `delwidth'
}
}
}
Abbrev `spanwidth' `"`macval(value)'"' "`abbrev'"
local value `"`macval(prefix)'`macval(value)'`macval(suffix)'"'
InsertAtVariables `"`macval(value)'"' 1 "`nspan'"
if `spanwidth'>0 local spanfmt "%-`spanwidth's"
file write `file' `spanfmt' (`"`macval(value)'"')
}
end
prog WriteStrRow
args file mrow eqrow neq labels delimiter stardetach starsrow ///
abbrev colwidth colfmt delwidth starwidth
local c 0
foreach mnum of local mrow {
local eqnum: word `++c' of `eqrow'
if "`mnum'"=="." {
file write `file' `macval(delimiter)' `colfmt' (`""')
continue
}
if ( "`mnum'"!="`lastmnum'" | "`eqnum'"!="`lasteqnum'" ) {
local value: word `=(`mnum'-1)*`neq'+`eqnum'' of `macval(labels)'
Abbrev `colwidth' `"`macval(value)'"' "`abbrev'"
}
else local value
file write `file' `macval(delimiter)' `colfmt' (`"`macval(value)'"')
if `:word `c' of `starsrow''==1 {
file write `file' `macval(stardetach)' _skip(`starwidth')
}
local lastmnum "`mnum'"
local lasteqnum "`eqnum'"
}
end
program VarInList
args var unstack eqvar eq list
local value
local L: word count `macval(list)'
forv l = 1(2)`L' {
local lvar: word `l' of `macval(list)'
local lab: word `=`l'+1' of `macval(list)'
if "`unstack'"!="" {
if "`var'"==`"`lvar'"' {
local value `"`macval(lab)'"'
continue, break
}
}
else {
if inlist(`"`lvar'"',"`var'",`"`eqvar'"',`"`eq':"') {
local value `"`macval(lab)'"'
continue, break
}
}
}
c_local value `"`macval(value)'"'
end
program vFormat
args value fmt lz dmarker msign par
if substr(`"`fmt'"',1,1)=="a" {
SignificantDigits `fmt' `value'
}
else {
capt confirm integer number `fmt'
if !_rc {
local fmt %`=`fmt'+9'.`fmt'f
}
}
local value: di `fmt' `value'
local value: list retok value
if "`lz'"=="" {
if index("`value'","0.")==1 | index("`value'","-0.") {
local value: subinstr local value "0." "."
}
}
if `"`macval(dmarker)'"'!="" {
if "`: set dp'"=="comma" local dp ,
else local dp .
local val: subinstr local value "`dp'" `"`macval(dmarker)'"'
}
else local val `"`value'"'
if `"`msign'"'!="" {
if index("`value'","-")==1 {
local val: subinstr local val "-" `"`macval(msign)'"'
}
}
if `"`par'"'!="" {
tokenize `"`macval(par)'"'
local val `"`macval(1)'`macval(val)'`macval(2)'"'
}
c_local value `"`macval(val)'"'
end
program SignificantDigits // idea stolen from outreg2.ado
args fmt value
local d = substr("`fmt'", 2, .)
capt confirm integer number `d'
if _rc {
di as err `"`fmt' not allowed"'
exit 198
}
// missing: format does not matter
if `value'>=. local fmt "%9.0g"
// integer: print no decimal places
else if (`value'-int(`value'))==0 {
local fmt "%12.0f"
}
// value in (-1,1): display up to 9 decimal places with d significant
// digits, then switch to e-format with d-1 decimal places
else if abs(`value')<1 {
local right = -int(log10(abs(`value'-int(`value')))) // zeros after dp
local dec = max(1,`d' + `right')
if `dec'<=9 {
local fmt "%12.`dec'f"
}
else {
local fmt "%12.`=min(9,`d'-1)'e"
}
}
// |values|>=1: display d+1 significant digits or more with at least one
// decimal place and up to nine digits before the decimal point, then
// switch to e-format
else {
local left = int(log10(abs(`value'))+1) // digits before dp
if `left'<=9 {
local fmt "%12.`=max(1,`d' - `left' + 1)'f"
}
else {
local fmt "%12.0e" // alternatively: "%12.`=min(9,`d'-1)'e"
}
}
c_local fmt "`fmt'"
end
program Stars
args starlevels P
if inrange(`P',0,1) {
local nstar: word count `macval(starlevels)'
forv i=1(2)`nstar' {
local istarsym: word `i' of `macval(starlevels)'
local istar: word `=`i'+1' of `macval(starlevels)'
if `istar'<=`P' continue, break
local value "`macval(istarsym)'"
}
}
c_local value `"`macval(value)'"'
end
program CellStars
args starlevels P par
Stars `"`macval(starlevels)'"' `P'
if `"`par'"'!="" {
tokenize `"`macval(par)'"'
local value `"`macval(1)'`macval(value)'`macval(2)'"'
}
c_local value `"`macval(value)'"'
end
prog MakeSign
args value msign par starlevels P
if "`P'"!="" {
local factor = 0
while 1 {
gettoken istar starlevels : starlevels
gettoken istar starlevels : starlevels
if `"`istar'"'=="" continue, break
if `P'<`istar' local factor = `factor' + 1
else if `istar'==1 local factor = 1
}
}
else local factor 1
if `"`macval(msign)'"'=="" local msign "-"
if `value'<0 {
local val: di _dup(`factor') `"`macval(msign)'"'
}
else if `value'==0 local val: di _dup(`factor') "0"
else if `value'>0 & `value'<. local val: di _dup(`factor') "+"
else local val `value'
if `"`par'"'!="" {
tokenize `"`macval(par)'"'
local val `"`macval(1)'`macval(val)'`macval(2)'"'
}
c_local value `"`macval(val)'"'
end
program DropOrKeep, rclass
args type b spec // type=0: drop; type=1: keep
tempname res bt
local R = rowsof(`b')
forv i=1/`R' {
local hit 0
mat `bt' = `b'[`i',1...]
foreach sp of local spec {
if rownumb(`bt', `"`sp'"')==1 {
local hit 1
continue, break
}
}
if `hit'==`type' mat `res' = nullmat(`res') \ `bt'
}
capt ret mat result `res'
end
program Order, rclass
args b spec
tempname bt res
local eqlist: roweq `b', q
local eqlist: list uniq eqlist
mat `bt' = `b'
gettoken spi rest : spec
while `"`spi'"'!="" {
gettoken spinext rest : rest
if !index(`"`spi'"',":") {
local vars `"`vars'`"`spi'"' "'
if `"`spinext'"'!="" & !index(`"`spinext'"',":") {
local spi `"`spinext'"'
continue
}
foreach eq of local eqlist {
foreach var of local vars {
local splist `"`splist'`"`eq':`var'"' "'
}
local splist `"`splist'`"`eq':"' "' // rest
}
local vars
}
else local splist `"`spi'"'
gettoken sp splist : splist
while `"`sp'"'!="" {
local isp = rownumb(`bt', "`sp'")
if `isp' >= . {
gettoken sp splist : splist
continue
}
while `isp' < . {
mat `res' = nullmat(`res') \ `bt'[`isp',1...]
local nb = rowsof(`bt')
if `nb' == 1 { // no rows left in `bt'
capt ret mat result `res'
exit
}
if `isp' == 1 {
mat `bt' = `bt'[2...,1...]
}
else if `isp' == `nb' {
mat `bt' = `bt'[1..`=`nb'-1',1...]
}
else {
mat `bt' = `bt'[1..`=`isp'-1',1...] \ `bt'[`=`isp'+1'...,1...]
}
local isp = rownumb(`bt', "`sp'")
}
gettoken sp splist : splist
}
local spi `"`spinext'"'
}
capt mat `res' = nullmat(`res') \ `bt'
capt ret mat result `res'
end
prog MakeQuotedFullnames
args names eqs
foreach name of local names {
gettoken eq eqs : eqs
local value `"`value'`"`eq':`name'"' "'
}
c_local value: list clean value
end
prog EqReplaceCons
args names eqlist eqlabels
local deqs: list dups eqlist
local deqs: list uniq deqs
local i 0
foreach eq of local eqlist {
local ++i
if `"`eq'"'!=`"`last'"' {
gettoken eqlab eqlabels : eqlabels
}
local last `"`eq'"'
if `:list eq in deqs' continue
local name: word `i' of `names'
if `"`name'"'=="_cons" & `"`eq'"'!="_" {
local value `"`value'`space'`"`eq':`name'"' `"`eqlab'"'"'
local space " "
}
}
c_local value `"`value'"'
end
prog UniqEqsAndDims
local n 0
foreach el of local 1 {
if `"`macval(el)'"'!=`"`macval(last)'"' {
if `n'>0 local eqsdims "`eqsdims' `n'"
local eqs `"`macval(eqs)' `"`macval(el)'"'"'
local n 0
}
local ++n
local last `"`macval(el)'"'
}
local eqsdims "`eqsdims' `n'"
c_local eqsdims: list clean eqsdims
c_local eqs: list clean eqs
end
prog InsertAtCols
args colnums row symb
if `"`symb'"'=="" local symb .
gettoken c rest : colnums
local i 0
foreach r of local row {
local ++i
while `"`c'"'!="" {
if `c'<=`i' {
local value `"`value' `symb'"'
gettoken c rest : rest
}
else continue, break
}
local value `"`value' `"`r'"'"'
}
while `"`c'"'!="" {
local value `"`value' `symb'"'
gettoken c rest : rest
}
c_local value: list clean value
end
prog GetVarnamesFromOrder
foreach sp of local 1 {
if index(`"`sp'"', ":") {
gettoken trash sp: sp, parse(:)
if `"`trash'"'!=":" {
gettoken trash sp: sp, parse(:)
}
}
local value `"`value'`space'`sp'"'
local space " "
}
c_local value `"`value'"'
end
prog ParseIndicateOpts
syntax [anything(equalok)] [, Labels(str asis) ]
gettoken tok rest : anything, parse(" =")
while `"`macval(tok)'"'!="" {
if `"`macval(tok)'"'=="=" {
local anything `"`"`macval(anything)'"'"'
continue, break
}
gettoken tok rest : rest, parse(" =")
}
c_local indicate `"`macval(anything)'"'
c_local indicatelabels `"`macval(labels)'"'
end
prog ProcessIndicateGrp
args i B unstack yesno indicate
tokenize `"`macval(yesno)'"'
local yes `"`macval(1)'"'
local no `"`macval(2)'"'
gettoken tok rest : indicate, parse(=)
while `"`macval(tok)'"'!="" {
if `"`macval(rest)'"'=="" {
local vars `"`indicate'"'
continue, break
}
if `"`macval(tok)'"'=="=" {
local vars `"`rest'"'
continue, break
}
local name `"`macval(name)'`space'`macval(tok)'"'
local space " "
gettoken tok rest : rest, parse(=)
}
if `"`macval(name)'"'=="" {
local name: word 1 of `"`vars'"'
}
ExpandEqVarlist `"`vars'"' `B'
local evars `"`value'"'
IsInModels `B' "`unstack'" `"`macval(yes)'"' `"`macval(no)'"' `"`evars'"'
local lbls `"`macval(value)'"'
DropOrKeep 0 `B' `"`evars'"'
capt confirm matrix r(result)
if _rc {
di as err "all coefficients dropped"
exit 498
}
mat `B' = r(result)
c_local indicate_`i'_name `"`macval(name)'"'
c_local indicate_`i'_lbls `"`macval(lbls)'"'
c_local indicate_`i'_eqs `"`eqs'"'
end
prog IsInModels
args B unstack yes no vars
local models: coleq `B', q
local models: list uniq models
local eqs: roweq `B', q
local eqs: list uniq eqs
tempname Bt Btt Bttt
foreach model of local models {
local stop 0
mat `Bt' = `B'[1...,"`model':"]
foreach eq of local eqs {
mat `Btt' = `Bt'[`"`eq':"',1]
if `"`unstack'"'!="" local stop 0
foreach var of local vars {
if !index(`"`var'"',":") {
local var `"`eq':`var'"'
}
capt mat `Bttt' = `Btt'["`var'",1]
if _rc continue
forv i = 1/`= rowsof(`Bttt')' {
if `Bttt'[`i',1]<.z {
local lbls `"`macval(lbls)' `"`macval(yes)'"'"'
local stop 1
continue, break
}
}
if `stop' continue, break
}
if `"`unstack'"'!="" {
if `stop'==0 {
local lbls `"`macval(lbls)' `"`macval(no)'"'"'
}
}
else if `stop' continue, break
}
if `"`unstack'"'=="" & `stop'==0 {
local lbls `"`macval(lbls)' `"`macval(no)'"'"'
}
}
c_local value `"`macval(lbls)'"'
if `"`unstack'"'!="" {
c_local eqs `"`eqs'"'
}
end
prog ReorderEqsInIndicate
args nmodels eqs ieqs lbls
local neq: list sizeof ieqs
foreach eq of local eqs {
local i: list posof `"`eq'"' in ieqs
if `i' {
local pos `pos' `i'
}
}
forv m=1/`nmodels' {
foreach i of local pos {
local mi = (`m'-1)*`neq' + `i'
local lbl: word `mi' of `macval(lbls)'
local value `"`macval(value)'`"`macval(lbl)'"' "'
}
}
c_local value `"`macval(value)'"'
end
prog ParseRefcatOpts
syntax [anything(equalok)] [, Label(str) Below ]
c_local refcatbelow "`below'"
c_local refcatlabel `"`macval(label)'"'
c_local refcat `"`macval(anything)'"'
end
prog PrepareRefcat
gettoken coef rest : 1
gettoken name rest : rest
while `"`macval(coef)'"'!="" {
local coefs `"`coefs'`coef' "'
local names `"`macval(names)'`"`macval(name)'"' "'
gettoken coef rest : rest
gettoken name rest : rest
}
c_local refcatcoefs `"`coefs'"'
c_local refcatnames `"`macval(names)'"'
end
prog GenerateRefcatRow
args B var eqs label
local models: coleq `B', q
local models: list uniq models
local col -1
foreach model of local models {
local col = `col'+2
foreach eq of local eqs {
local eqvar `"`eq':`var'"'
local row = rownumb(`B',"`eqvar'")
if `B'[`row', `col']<. {
local value `"`macval(value)'`"`macval(label)'"' "'
}
else {
local value `"`macval(value)'`""' "'
}
}
}
c_local value `"`macval(value)'"'
end
prog ParseTransformSubopts
syntax anything(equalok) [, Pattern(string) ]
c_local transform `"`anything'"'
c_local transformpattern "`pattern'"
end
prog MakeTransformList
args B transform
local R = rowsof(`B')
if `:list sizeof transform'<=2 {
gettoken f rest : transform
gettoken df : rest
forv i = 1/`R' {
local valuef `"`valuef'`f' "'
local valuedf `"`valuedf'`df' "'
}
c_local valuef: list retok valuef
c_local valuedf: list retok valuedf
exit
}
gettoken coef rest : transform
gettoken f rest : rest
gettoken df rest : rest
while (`"`coef'"'!="") {
if (`"`df'`rest'"'!="") { // last element of list may be without coef
ExpandEqVarlist `"`coef'"' `B'
local coef `"`value'"'
}
local coefs `"`coefs'`"`coef'"' "'
local fs `"`fs'`"`f'"' "'
local dfs `"`dfs'`"`df'"' "'
gettoken coef rest : rest
gettoken f rest : rest
gettoken df rest : rest
}
tempname b
local value
forv i = 1/`R' {
mat `b' = `B'[`i',1...]
local i 0
local hit 0
foreach coef of local coefs {
local f: word `++i' of `fs'
local df: word `i' of `dfs'
if (`"`df'`rest'"'=="") {
local valuef `"`valuef'`"`coef'"' "' // sic! (see above)
local valuedf `"`valuedf'`"`f'"' "'
local hit 1
continue, break
}
foreach c of local coef {
if rownumb(`b', `"`c'"')==1 {
local valuef `"`valuef'`"`f'"' "'
local valuedf `"`valuedf'`"`df'"' "'
local hit 1
continue, break
}
}
if `hit' continue, break
}
if `hit'==0 {
local valuef `"`valuef'"" "'
local valuedf `"`valuedf'"" "'
}
}
c_local valuef: list retok valuef
c_local valuedf: list retok valuedf
end
prog TableIsAMess
local eq: roweq r(coef), q
local eq: list uniq eq
if `: list sizeof eq'<=1 {
c_local value 0
exit
}
tempname b bt
mat `b' = r(coef)
gettoken eq : eq
mat `b' = `b'[`"`eq':"', 1...]
local R = rowsof(`b')
local models: coleq `b', q
local models: list uniq models
local value 0
local i -1
foreach model of local models {
local i = `i'+2
if `i'==1 continue // skip first model
mat `bt' = `b'[1...,`i']
local allz 1
forv r = 1/`R' {
if `bt'[`r',1]<.z {
local allz 0
continue, break
}
}
if `allz' {
local value 1
continue, break
}
}
c_local value `value'
end
prog ExpandEqVarlist
args list B
ParseEqVarlistRelax `list'
local coefs: rownames `B'
local ucoefs: list uniq coefs
local eqs: roweq `B', q
local ueqs: list uniq eqs
while `"`list'"'!="" {
// get next element
gettoken eqx list : list
// separate eq and x
gettoken eq x : eqx, parse(:)
local eq: list clean eq
if `"`eq'"'==":" { // case 1: ":[varname]"
local eq
}
else if `"`x'"'=="" { // case 2: "varname"
local x `"`eq'"'
local eq
}
else { // case 3. "eqname:[varname]"
gettoken colon x : x, parse(:)
local x: list clean x
}
// match equations
local eqmatch
if `:list eq in ueqs' { // (note: evaluates to 1 if eq empty)
local eqmatch `"`eq'"'
}
else {
foreach e of local ueqs {
if match(`"`e'"', `"`eq'"') {
local eqmatch `"`eqmatch' `"`e'"'"'
}
}
if `"`eqmatch'"'=="" & "`relax'"=="" {
di as err `"equation `eq' not found"'
exit 111
}
local eqmatch: list clean eqmatch
}
if `"`x'"'=="" {
foreach e of local eqmatch {
local value `"`value' `"`e':"'"'
}
continue
}
// match coefficients
local vlist
// - without equation
if `"`eq'"'=="" {
if `:list x in ucoefs' {
local value `"`value' `"`x'"'"'
continue
}
foreach coef of local ucoefs {
if match(`"`coef'"', `"`x'"') {
local vlist `"`vlist' `"`coef'"'"'
}
}
if `"`vlist'"'=="" {
if "`relax'"=="" {
di as err `"coefficient `x' not found"'
exit 111
}
}
else {
local value `"`value' `vlist'"'
}
continue
}
// - within equations
local rest `"`eqs'"'
foreach coef of local coefs {
gettoken e rest : rest
if !`:list e in eqmatch' {
continue
}
if match(`"`coef'"', `"`x'"') {
local vlist `"`vlist' `"`e':`coef'"'"'
}
}
if `"`vlist'"'=="" {
if "`relax'"=="" {
di as err `"coefficient `eq':`x' not found"'
exit 111
}
}
else {
local value `"`value' `vlist'"'
}
}
c_local value: list clean value
end
program ParseEqVarlistRelax
syntax [anything] [, Relax ]
c_local list `"`anything'"'
c_local relax `relax'
end
program IsInString
args needle haystack
local trash: subinstr local haystack `"`needle'"' "", count(local count)
c_local value `count'
end
program MakeRtfRowdefs
args str srow sdetach vwidth mwidth
local factor 120
ParseRtfcmdNum `"`str'"' "trgaph" 0
ParseRtfcmdNum `"`str'"' "trleft" 0
if `vwidth'<=0 local vwidth 12
if `mwidth'<=0 local mwidth 12
if real(`"`trgaph'"')>=. local trgaph 0
if real(`"`trleft'"')>=. local trleft 0
local swidth = 3
local vtwips = `vwidth'*`factor'
local mtwips = `mwidth'*`factor'
local stwips = `swidth'*`factor'
local ipos = `vtwips' + 2*`trgaph' + (`trleft')
local brdrt "\clbrdrt\brdrw10\brdrs"
local brdrb "\clbrdrb\brdrw10\brdrs"
local emptycell "\cell" //"\pard\intbl\cell"
local rtfdef "\cellx`ipos'"
local rtfdefbrdrt "`brdrt'\cellx`ipos'"
local rtfdefbrdrb "`brdrb'\cellx`ipos'"
local rtfrow "`emptycell'"
foreach i of local srow {
local ipos = `ipos' + `mtwips' + 2*`trgaph'
if `i' & "`sdetach'"=="" local ipos = `ipos' + `stwips'
local rtfdef "`rtfdef'\cellx`ipos'"
local rtfdefbrdrt "`rtfdefbrdrt'`brdrt'\cellx`ipos'"
local rtfdefbrdrb "`rtfdefbrdrb'`brdrb'\cellx`ipos'"
local rtfrow "`rtfrow'`emptycell'"
if `i' & "`sdetach'"!="" {
local ipos = `ipos' + `stwips' + 2*`trgaph'
local rtfdef "`rtfdef'\cellx`ipos'"
local rtfdefbrdrt "`rtfdefbrdrt'`brdrt'\cellx`ipos'"
local rtfdefbrdrb "`rtfdefbrdrb'`brdrb'\cellx`ipos'"
local rtfrow "`rtfrow'`emptycell'"
}
}
c_local rtfrowdef "`rtfdef'"
c_local rtfrowdefbrdrt "`rtfdefbrdrt'"
c_local rtfrowdefbrdrb "`rtfdefbrdrb'"
c_local rtfemptyrow "`rtfdef'`rtfrow'"
end
prog ParseRtfcmdNum
args str cmd default
local pos = index(`"`str'"', `"\\`cmd'"')
if `pos' {
local pos = `pos' + strlen(`"`cmd'"') + 1
local digit = substr(`"`str'"',`pos',1)
if `"`digit'"'=="-" {
local value "`digit'"
local digit = substr(`"`str'"',`++pos',1)
}
while real(`"`digit'"')<. {
local value "`value'`digit'"
local digit = substr(`"`str'"',`++pos',1)
}
}
local value = real(`"`value'"')
if `value'>=. local value = `default'
c_local `cmd' `"`value'"'
end