*! version 3.13 06aug2009 Ben Jann program define estout, rclass version 8.2 return local cmdline estout `macval(0)' syntax [anything] [using] [ , /// Cells(string asis) /// Drop(string asis) /// Keep(string asis) /// Order(string asis) /// REName(passthru) /// 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 /// STARKeep(string asis) /// STARDrop(string asis) /// VARwidth(numlist max=1 int >=0) /// MODELwidth(numlist int >=0) /// NOABbrev ABbrev /// NOUNStack UNStack /// EXTRAcols(numlist sort) /// BEGin(string asis) /// DELimiter(string asis) /// INCELLdelimiter(string asis) /// end(string asis) /// DMarker(string) /// MSign(string) /// NOLZ lz /// SUBstitute(string asis) /// TItle(string) /// note(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) /// LABCOL2(string asis) /// TOPfile(string) /// BOTtomfile(string) /// STYle(string) /// DEFaults(string) /// * /// ] MoreOptions, `options' if "`style'"!="" local defaults "`style'" *Matrix mode MatrixMode, `anything' `rename' // resets the cells argument // and returns r(coefs) etc. and local 'matrixmode' *Parse suboptions local elnum 0 if `"`cells'"'!="none" { gettoken row rest: cells, bind match(par) qed(qed) if `"`par'"'=="(" local qed 1 local cells while `"`row'"'!="" { local newrow gettoken opt row: row, parse(" ([&") if `"`macval(row)'"'=="" & `qed'==0 { local row0 gettoken trash: rest, parse("[") if `"`trash'"'=="[" { gettoken trash rest: rest, parse("[") gettoken mrow rest: rest, parse("]") q gettoken trash rest: rest, parse("]") if `"`trash'"'!="]" { error 198 } } gettoken trash: rest, match(par) if `"`par'"'=="(" { gettoken opt2 rest: rest, match(par) } else local opt2 } else { gettoken trash: row, parse("[") if `"`trash'"'=="[" { gettoken trash row: row, parse("[") gettoken mrow row: row, parse("]") q gettoken trash row: row, parse("]") if `"`trash'"'!="]" { error 198 } } gettoken trash row0: row, match(par) gettoken opt2: row, match(par) } while "`opt'"!="" { if "`opt'"!="&" & "`opt'"!="." { local `opt'_tname "el`++elnum'" local ``opt'_tname'_ "`opt'" local newrow `"`newrow' ``opt'_tname'"' if `"`par'"'!="(" local opt2 ParseValueSubopts ``opt'_tname' `opt', mrow(`mrow') `macval(opt2)' local mrow } else { if `"`par'"'=="(" | `"`mrow'"'!="" error 198 local newrow `"`newrow' `opt'"' } if `"`par'"'!="(" { gettoken opt row: row, parse(" ([&") } else { gettoken opt row: row0, parse(" ([&") } gettoken trash: row, parse("[") if `"`trash'"'=="[" { gettoken trash row: row, parse("[") gettoken mrow row: row, parse("]") q gettoken trash row: row, parse("]") if `"`trash'"'!="]" { error 198 } } gettoken trash row0: row, match(par) gettoken opt2: row, match(par) } local newrow: list retok newrow if `qed' local cells `"`cells'"`newrow'" "' else local cells `"`cells'`newrow' "' gettoken row rest: rest, bind match(par) qed(qed) if `"`par'"'=="(" local qed 1 } 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)'"'!="" { if trim(`"`statslabels'"')=="none" { local statslabelsnone none local statslabels } else { ParseLabelsSubopts statslabels `macval(statslabels)' } } } foreach opt in mgroups mlabels eqlabels collabels varlabels { if `"`macval(`opt')'"'!="" { if trim(`"``opt''"')=="none" { local `opt'none none local `opt' } else { 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)' } if `"`macval(labcol2)'"'!="" { ParseLabCol2 `macval(labcol2)' } *Process No-Options foreach opt in unstack eform margin dropped discrete stardetach wrap /// legend label refcatlabel numbers lz abbrev replace append type showtabs /// smcltags smclrules smclmidrules smcleqrules asis outfilenoteoff { if "`no`opt''"!="" local `opt' } *Defaults if "`defaults'"=="esttab" local defaults "tab" if "`defaults'"=="" & `"`using'"'=="" local defaults "smcl" if inlist("`defaults'", "", "smcl", "tab", "fixed", "tex", "html","mmd") { local varwidthfactor = (1 + ("`eqlabelsmerge'"!="" & "`unstack'"=="")*.5) if inlist("`defaults'", "", "tab") { if `"`macval(delimiter)'"'=="" local delimiter _tab } else if "`defaults'"=="smcl" { if "`varwidth'"=="" local varwidth = cond("`label'"=="", 12, 20) * `varwidthfactor' if "`modelwidth'"=="" local modelwidth 12 if "`noabbrev'"=="" local abbrev abbrev if `"`macval(delimiter)'"'=="" local delimiter `"" ""' if "`nosmcltags'"=="" local smcltags smcltags if "`nosmclrules'"=="" local smclrules smclrules if "`asis'"=="" local noasis noasis } else if "`defaults'"=="fixed" { if "`varwidth'"=="" local varwidth = cond("`label'"=="", 12, 20) * `varwidthfactor' 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) * `varwidthfactor' 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) * `varwidthfactor' if "`modelwidth'"=="" local modelwidth 12 if `"`macval(begin)'"'=="" local begin if `"`macval(delimiter)'"'=="" local delimiter if `"`macval(end)'"'=="" local end } else if "`defaults'"=="mmd" { if "`varwidth'"=="" local varwidth = cond("`label'"=="", 12, 20) * `varwidthfactor' if "`modelwidth'"=="" local modelwidth 12 if `"`macval(begin)'"'=="" local begin "| " if `"`macval(delimiter)'"'=="" local delimiter " | " if `"`macval(end)'"'=="" local end " |" } 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 "`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)'"'=="" & "`norefcatlabel'"=="" local refcatlabel "ref." if `"`macval(incelldelimiter)'"'=="" local incelldelimiter " " } 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 else if index(`"`opt'"',"_") { gettoken opt0 opt1: opt, parse("_") if `"``opt0'_tname'"'!="" { local opt `"``opt0'_tname'`opt1'"' } } if `"`macval(`opt')'"'=="" & `"`no`opt''"'=="" { if `"`opt'"'=="cells" { local newline gettoken row rest: line, match(par) qed(qed) if `"`par'"'=="(" local qed 1 while `"`row'"'!="" { local newrow gettoken el row: row, parse(" &") while `"`el'"'!="" { if `"`el'"'!="." & `"`el'"'!="&" { local `el'_tname "el`++elnum'" local ``el'_tname'_ "`el'" local newrow "`newrow' ``el'_tname'" } else { local newrow "`newrow' `el'" } gettoken el row: row, parse(" &") } local newrow: list retok newrow if `qed' local newline `"`newline'"`newrow'" "' else local newline `"`newline'`newrow' "' gettoken row rest: rest, match(par) qed(qed) if `"`par'"'=="(" local qed 1 } local line `"`newline'"' } local line: list retok line local `opt' `"`macval(line)'"' } } file close `file' } } if "`notype'"=="" & `"`using'"'=="" local type type if "`smcltags'"=="" & "`noasis'"=="" local asis asis if "`asis'"!="" local asis "_asis" if "`smclrules'"!="" & "`nosmclmidrules'"=="" local smclmidrules smclmidrules if "`smclmidrules'"!="" & "`nosmcleqrules'"=="" local smcleqrules smcleqrules local haslabcol2 = (`"`macval(labcol2)'"'!="") *title/notes option if `"`macval(prehead)'`macval(posthead)'`macval(prefoot)'`macval(postfoot)'"'=="" { if `"`macval(title)'"'!="" { local prehead `"`"`macval(title)'"'"' } if `"`macval(note)'"'!="" { local postfoot `"`"`macval(note)'"'"' } } *Generate/clean-up cell contents if `"`:list clean cells'"'=="" { local cells b local b_tname "b" local b_ "b" } else if `"`:list clean cells'"'=="none" { local cells } CellsCheck `"`cells'"' if `:list sizeof incelldelimiter'==1 gettoken incelldelimiter: incelldelimiter *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 "`ci_tname'"!="" { if `"`macval(`ci_tname'_label)'"'=="" { local `ci_tname'_label "ci`level'" } if `"`macval(`ci_tname'_par)'"'=="" { local `ci_tname'_par `""" , """' } gettoken 1 2 : `ci_tname'_par gettoken 2 3 : 2 gettoken 3 : 3 local `ci_tname'_l_par `""`macval(1)'" "`macval(2)'""' local `ci_tname'_u_par `""" "`macval(3)'""' } if "`ci_l_tname'"!="" { if `"`macval(`ci_l_tname'_label)'"'=="" { local `ci_l_tname'_label "min`level'" } } if "`ci_u_tname'"!="" { if `"`macval(`ci_u_tname'_label)'"'=="" { local `ci_u_tname'_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 if "`statsstar'"!="" local p " p" else local p *Significance stars local tablehasstars 0 foreach v of local values { local el "``v'_'" if "``v'_star'"!="" | inlist("`el'","_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: _estout_getres * - prepare transform/eform if `"`transform'"'=="" { // 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 } } * - handle pvalue() suboption if `tablehasstars' { local temp foreach v of local values { local temp: list temp | `v'_pvalue } foreach v of local temp { if `"``v'_tname'"'=="" { local `v'_tname "el`++elnum'" local ``v'_tname'_ "`v'" local values: list values | `v'_tname } } } * - prepare list of results to get from e()-matrices if "`ci_tname'"!="" { local values: subinstr local values "`ci_tname'" "`ci_tname'_l `ci_tname'_u", word local `ci_tname'_l_ "ci_l" local ci_l_tname "`ci_tname'_l" local `ci_tname'_u_ ci_u local ci_u_tname "`ci_tname'_u" } foreach v of local values { local temp = ("``v'_transpose'"!="") local values1mrow `"`values1mrow' `"``v'_' `temp' ``v'_mrow'"'"' } tempname B D St if `matrixmode'==0 { * - expand model names if `"`anything'"'=="" { capt est_expand $eststo if !_rc { local anything `"$eststo"' } } if `"`anything'"'=="" local anything "." capt est_expand `"`anything'"' if _rc { if _rc==301 { // add e(cmd)="." to current estimates if undefined if `:list posof "." in anything' & `"`e(cmd)'"'=="" { if `"`: e(scalars)'`: e(macros)'`: e(matrices)'`: e(functions)'"'!="" { qui estadd local cmd "." } } } est_expand `"`anything'"' } local models `r(names)' // could not happen, ... if "`models'" == "" { exit } * - get results local temp names(`models') coefs(`values1mrow') stats(`stats'`p') /// `rename' margin(`margin') meqs(`meqs') dropped(`droppedison') level(`level') /// transform(`transform') transformpattern(`transformpattern') _estout_getres, `equations' `temp' local ccols = r(ccols) if `"`equations'"'=="" & "`unstack'"=="" & `ccols'>0 { // specify equations("") to deactivate TableIsAMess if `value' { _estout_getres, equations(main=1) `temp' } } mat `St' = r(stats) } else { // matrix mode local models `r(names)' // define `St' so that code does not break if `"`stats'"'!="" { mat `St' = J(`:list sizeof stats',1,.z) mat coln `St' = `models' mat rown `St' = `stats' } } local nmodels = r(nmodels) local ccols = r(ccols) if `ccols'>0 { mat `B' = r(coefs) } return add * - process order() option if `"`order'"' != "" { ExpandEqVarlist `"`order'"' `B' append local order `"`value'"' Order `B' `"`order'"' } * - process indicate() option local nindicate 0 foreach indi of local indicate { local ++nindicate ProcessIndicateGrp `nindicate' `B' `nmodels' "`unstack'" /// `"`macval(indicatelabels)'"' `"`macval(indi)'"' } * - process keep() option if `"`keep'"' != "" { ExpandEqVarlist `"`keep'"' `B' DropOrKeep 1 `B' `"`value'"' } * - process drop() option if `"`drop'"' != "" { ExpandEqVarlist `"`drop'"' `B' DropOrKeep 0 `B' `"`value'"' } * - names and equations of final set capt confirm matrix `B' if _rc { return local coefs "" // erase r(coefs) return local ccols "" local R 0 local varlist "" local eqlist "" local eqs "_" local fullvarlist "" } else { return matrix coefs = `B', copy // replace r(coefs) local R = rowsof(`B') local C = colsof(`B') QuotedRowNames `B' local varlist `"`value'"' local eqlist: roweq `B', q local eqlist: list clean eqlist UniqEqsAndDims `"`eqlist'"' MakeQuotedFullnames `"`varlist'"' `"`eqlist'"' local fullvarlist `"`value'"' * - dropped coefs local droppedpos = `ccols' if "`margin'"!="" { local droppedpos `droppedpos' - 1 } * - 0/1-variable indicators (for marginals) mat `D' = `B'[1...,1], J(`R',1,0) // so that row names are copied from `B' mat `D' = `D'[1...,2] if "`margin'"!="" { forv i = 1/`R' { // last colum for each model contains _dummy info forv j = `ccols'(`ccols')`C' { if `B'[`i',`j']==1 { mat `D'[`i',1] = 1 } } } } } *Prepare element specific keep/drop local dash tempname tmpmat foreach v in star `values' { local temp `"`fullvarlist'"' if "`unstack'"!="" { local temp2: list uniq eqs local `v'`dash'eqdrop: list uniq eqs } if `"``v'`dash'keep'"'!="" { capt mat `tmpmat' = `B' ExpandEqVarlist `"``v'`dash'keep'"' `tmpmat' DropOrKeep 1 `tmpmat' `"`value'"' capt confirm matrix `tmpmat' if _rc local temp else { QuotedRowNames `tmpmat' MakeQuotedFullnames `"`value'"' `"`: roweq `tmpmat', q'"' local temp: list temp & value if "`unstack'"!="" { local value: roweq `tmpmat', q local value: list uniq value local temp2: list temp2 & value } } } if `"``v'`dash'drop'"'!="" { capt mat `tmpmat' = `B' ExpandEqVarlist `"``v'`dash'drop'"' `tmpmat' DropOrKeep 0 `tmpmat' `"`value'"' capt confirm matrix `tmpmat' if _rc local temp else { QuotedRowNames `tmpmat' MakeQuotedFullnames `"`value'"' `"`: roweq `tmpmat', q'"' local temp: list temp & value if "`unstack'"!="" { local value: roweq `tmpmat', q local value: list uniq value local temp2: list temp2 & value } } } local `v'`dash'drop: list fullvarlist - temp if "`unstack'"!="" { local `v'`dash'eqdrop: list `v'`dash'eqdrop - temp2 } local dash "_" } capt mat drop `tmpmat' *Prepare unstack if "`unstack'"!="" & `R'>0 { 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`i'eqs'"' `"`macval(indicate`i'lbls)'"' local indicate`i'lbls `"`macval(value)'"' } } else local eqswide "_" *Prepare coefs for tabulation if `R'>0 { local i 0 foreach v of local values { local ++i tempname _`v' forv j = 1/`nmodels' { mat `_`v'' = nullmat(`_`v''), `B'[1..., (`j'-1)*`ccols'+`i'] } mat coln `_`v'' = `models' mat coleq `_`v'' = `models' if inlist("``v'_'", "t", "z") { if `"``v'_abs'"'!="" { // absolute t-values forv r = 1/`R' { forv j = 1/`nmodels' { if `_`v''[`r',`j']>=. continue mat `_`v''[`r',`j'] = abs(`_`v''[`r',`j']) } } } } } } *Model labels if "`nomlabelstitles'"=="" & "`label'"!="" local mlabelstitles titles local tmp: list sizeof mlabels local i 0 foreach model of local models { local ++i if `i'<=`tmp' continue local lab if "`mlabelsdepvars'"!="" { local var `"`return(m`i'_depname)'"' if "`label'"!="" { local temp = index(`"`var'"',".") local temp2 = substr(`"`var'"',`temp'+1,.) capture local lab: var l `temp2' if _rc | `"`lab'"'=="" { local lab `"`temp2'"' } local temp2 = substr(`"`var'"',1,`temp') local lab `"`temp2'`macval(lab)'"' } else local lab `"`var'"' } else if "`mlabelstitles'"!="" { local lab `"`return(m`i'_estimates_title)'"' if `"`lab'"'=="" local lab "`model'" } else { local lab "`model'" } local mlabels `"`macval(mlabels)' `"`macval(lab)'"'"' } if "`mlabelsnumbers'"!="" { NumberMlabels `nmodels' `"`macval(mlabels)'"' } *Equations labels local eqconssubok = (`"`macval(eqlabels)'"'!=`""""') local numeqs: list sizeof eqs 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 `eqconssubok' { if "`eqlabelsnone'"!="" & `numeqs'>1 & "`unstack'"=="" { EqReplaceCons `"`varlist'"' `"`eqlist'"' `"`eqlabels'"' `"`macval(varlabels)'"' 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' local v: subinstr local v "&" " ", all local v: subinstr local v "." "", all local v: list retok v foreach vi of local v { if `"`macval(temp)'"'!="" { local temp `"`macval(temp)'/"' } local temp `"`macval(temp)'`macval(`vi'_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'"!="" & `R'>0 { ModelEqCheck `B' `"`eq'"' `m' `ccols' if !`value' continue } local eqsrow "`eqsrow'`e' " local modelsrow "`modelsrow'`m' " local k 0 local something 0 forv j = 1/`ncols' { local col local nocol 1 local colhasstats 0 forv i = 1/`nrows' { local row: word `i' of `cells' local v: word `j' of `row' local v: subinstr local v "&" " ", all foreach vi in `v' { if "`vi'"=="." continue local colhasstats 1 if "`unstack'"!="" { if `:list eq in `vi'_eqdrop' continue } if "`:word `m' of ``vi'_pattern''"=="0" { local v: subinstr local v "`vi'" ".`vi'", word } else { local nocol 0 if `"``vi'_star'"'!="" local starcol 1 } } local v: subinstr local v " " "&", all if "`v'"=="" local v "." local col "`col'`v' " } if `colhasstats'==0 local nocol 0 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 } 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 + `haslabcol2' *Modelwidth/varwidth/starwidth if "`modelwidth'"=="" local modelwidth 0 if "`varwidth'"=="" local varwidth 0 local nmodelwidth: list sizeof modelwidth local modelwidthzero: list uniq modelwidth local modelwidthzero = ("`modelwidth'"=="0") if "`labcol2width'"=="" local labcol2width `: word 1 of `modelwidth'' local starwidth 0 if `modelwidthzero'==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)'"') } if `haslabcol2' { local totcharwidth = `totcharwidth' + `delwidth' + `labcol2width' } local j 0 foreach i of local starsrow { local modelwidthj: word `=1 + mod(`j++',`nmodelwidth')' of `modelwidth' local totcharwidth = `totcharwidth' + `delwidth' + `modelwidthj' if `i' { if "`stardetach'"!="" { local ++ncols local totcharwidth = `totcharwidth' + `delwidth' } local totcharwidth = `totcharwidth' + `starwidth' } } IsInString "@hline" `"`0'"' // sets local strcount if `strcount' { 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'"' // sets local strcount local hasrtf = `strcount' if `hasrtf' { MakeRtfRowdefs `"`macval(begin)'"' `"`starsrow'"' "`stardetach'" /// `varwidth' "`modelwidth'" `haslabcol2' `labcol2width' local varwidth 0 local wrap local modelwidth 0 local nmodelwidth 1 local modelwidthzero 1 local starwidth 0 local labcol2width 0 IsInString "@rtfrowdefbrdr" `"`begin'"' // sets local strcount if `strcount' { 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 `starwidth'>0 local fmt_stw "%-`starwidth's" if `varwidth'>0 local fmt_v "%-`varwidth's" if `labcol2width'>0 local fmt_l2 "%~`labcol2width's" if "`mgroupsspan'`mlabelsspan'`eqlabelsspan'`collabelsspan'"!="" { if `modelwidthzero'==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 } local stardetachon = ("`stardetach'"!="") if `stardetachon' { local stardetach `"`macval(delimiter)'"' } *Prepare @-Variables local atvars2 `""`nmodels'" "`neqs'" "`totcharwidth'" `"`macval(hline)'"' `hasrtf' `"`rtfrowdefbrdrt'"' `"`rtfrowdefbrdrb'"' `"`rtfrowdef'"' `"`rtfemptyrow'"'"' local atvars3 `"`"`macval(title)'"' `"`macval(note)'"' `"`macval(discrete)'`macval(discrete2)'"' `"`macval(starlegend)'"'"' *Open output file file open `file' using `"`tfile'"', write text replace *Write prehead if `"`macval(prehead)'"'!="" { if index(`"`macval(prehead)'"',`"""')==0 { local prehead `"`"`macval(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 } local hasheader 0 if "`smcltags'"!="" local thesmclrule "{txt}{hline `totcharwidth'}" else local thesmclrule "{hline `totcharwidth'}" if "`smclrules'"!="" { file write `file' `"`thesmclrule'"' _n } *Labcol2 - title if `haslabcol2' { IsInString `"""' `"`macval(labcol2title)'"' // sets local strcount if `strcount'==0 { local labcol2chunk `"`macval(labcol2title)'"' local labcol2rest "" } else { gettoken labcol2chunk labcol2rest : labcol2title } } *Write head: Models groups if "`mgroupsnone'"=="" & `"`macval(mgroups)'"'!="" { local hasheader 1 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)'"')"' if `haslabcol2' { Abbrev `labcol2width' `"`macval(labcol2chunk)'"' "`abbrev'" file write `file' `macval(delimiter)' `fmt_l2' (`"`macval(value)'"') } WriteCaption `"`file'"' `"`macval(delimiter)'"' /// `"`macval(stardetach)'"' "`mgroupspattern'" "`mgroupspattern'" /// `"`macval(mgroups)'"' "`starsrow'" "`mgroupsspan'" "`abbrev'" /// "`modelwidth'" "`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 } gettoken labcol2chunk labcol2rest : labcol2rest } *Write head: Models numbers if `"`macval(numbers)'"'!="" { local hasheader 1 if "`smcltags'"!="" file write `file' "{txt}" if `"`macval(numbers)'"'=="numbers" local numbers "( )" file write `file' `macval(begin)' `fmt_v' (`""') if `haslabcol2' { Abbrev `labcol2width' `"`macval(labcol2chunk)'"' "`abbrev'" file write `file' `macval(delimiter)' `fmt_l2' (`"`macval(value)'"') } tokenize `"`macval(numbers)'"' numlist `"1/`nmodels'"' WriteCaption `"`file'"' `"`macval(delimiter)'"' /// `"`macval(stardetach)'"' "`modelsrow'" "`modelsrow'" /// "`r(numlist)'" "`starsrow'" "`mlabelsspan'" "`abbrev'" /// "`modelwidth'" "`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 } gettoken labcol2chunk labcol2rest : labcol2rest } *Write head: Models captions if "`nomlabelsnone'"=="" & "`models'"=="." & `"`macval(mlabels)'"'=="." local mlabelsnone "none" if "`mlabelsnone'"=="" { local hasheader 1 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)'"')"' if `haslabcol2' { Abbrev `labcol2width' `"`macval(labcol2chunk)'"' "`abbrev'" file write `file' `macval(delimiter)' `fmt_l2' (`"`macval(value)'"') } WriteCaption `"`file'"' `"`macval(delimiter)'"' /// `"`macval(stardetach)'"' "`modelsrow'" "`modelsrow'" /// `"`macval(mlabels)'"' "`starsrow'" "`mlabelsspan'" "`abbrev'" /// "`modelwidth'" "`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 } gettoken labcol2chunk labcol2rest : labcol2rest } *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 hasheader 1 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)'"')"' if `haslabcol2' { Abbrev `labcol2width' `"`macval(labcol2chunk)'"' "`abbrev'" file write `file' `macval(delimiter)' `fmt_l2' (`"`macval(value)'"') } WriteCaption `"`file'"' `"`macval(delimiter)'"' /// `"`macval(stardetach)'"' "`eqsrow'" "`modelsrow'" /// `"`macval(eqlabels)'"' "`starsrow'" "`eqlabelsspan'" "`abbrev'" /// "`modelwidth'" "`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 } gettoken labcol2chunk labcol2rest : labcol2rest } *Write head: Columns captions if `"`macval(collabels)'"'!="" & "`collabelsnone'"=="" { local hasheader 1 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)'"')"' if `haslabcol2' { Abbrev `labcol2width' `"`macval(labcol2chunk)'"' "`abbrev'" file write `file' `macval(delimiter)' `fmt_l2' (`"`macval(value)'"') } WriteCaption `"`file'"' `"`macval(delimiter)'"' /// `"`macval(stardetach)'"' "`colsrow'" "" `"`macval(collabels)'"' /// "`starsrow'" "`collabelsspan'" "`abbrev'" "`modelwidth'" /// "`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 } gettoken labcol2chunk labcol2rest : labcol2rest } *Write posthead if `hasheader' & "`smclmidrules'"!="" { file write `file' `"`thesmclrule'"' _n } if `"`macval(posthead)'"'!="" { if index(`"`macval(posthead)'"',`"""')==0 { local posthead `"`"`macval(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 } * Create mmd alignment/divider line if `"`defaults'"'=="mmd" { MakeMMDdef "`varwidth'" "`haslabcol2'" "`labcol2width'" /// "`modelwidth'" "`starsrow'" "`stardetachon'" "`starwidth'" 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 local theeqlabel 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' } if "`eqlabelsmerge'"!="" { local theeqlabel `"`macval(eqlabelsprefix)'`macval(value)'`macval(eqlabelssuffix)'"' } else { local tmpbegin `"`macval(begin)'"' local tmpend `"`macval(end)'"' if "`eqlabelsreplace'"!="" { if `"`macval(eqlabelsbegin0)'"'!="" local tmpbegin if `"`macval(eqlabelsend)'"'!="" local tmpend } if `e'>1 & "`smcleqrules'"!="" { file write `file' `"`thesmclrule'"' _n } 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'" "`delwidth'" "`starwidth'" /// `"`macval(eqlabelsprefix)'"' `"`macval(eqlabelssuffix)'"' /// "`haslabcol2'" "`labcol2width'" "`fmt_l2'" 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 local rowhasstats 0 foreach v of local row { local ++c if "`unstack'"!="" { local eqr: word `:word `c' of `eqsrow'' of `eqs' if `"`eqr'"'!="" local eqvar `"`eqr':`var'"' else local eqvar "`var'" } local v: subinstr local v "&" " ", all foreach vi of local v { if "`vi'"=="." continue if rownumb(`B',`"`eqvar'"')<. { local rowhasstats 1 if index("`vi'",".")==1 continue if `: list eqvar in `vi'_drop' continue local skiprow 0 continue, break } } if `skiprow'==0 continue, break } if `rowhasstats'==0 local skiprow 0 if `"`ferest()'"'=="" & `"`rvblock'"'=="" local skiprow 0 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' `ccols' "`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 `haslabcol2' { gettoken labcol2chunk labcol2 : labcol2 Abbrev `labcol2width' `"`macval(labcol2chunk)'"' "`abbrev'" file write `file' `macval(delimiter)' `fmt_l2' (`"`macval(value)'"') } if "`smcltags'"!="" file write `file' "{res}" WriteStrRow `"`file'"' "`modelsrow'" `"`eqsrow'"' `"`: list sizeof eqswide'"' /// `"`macval(refcatrow)'"' `"`macval(delimiter)'"' /// `"`macval(stardetach)'"' "`starsrow'" "`abbrev'" /// "`modelwidth'" "`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)'"'!="" { IsInString `"""' `"`value'"' // sets local strcount if `strcount'==0 { local value `"`"`macval(value)'"'"' } InsertAtVariables `"`macval(value)'"' 2 "`ncols'" `macval(atvars2)' WriteStrLines `"`file'"' `"`macval(value)'"' if "`varlabelsreplace'"!="" { local tmpbegin local varlabelsbegin0 } } if "`label'"!="" { local temp = index("`var'",".") local temp2 = substr(`"`var'"',`temp'+1,.) capture local varl: var l `temp2' if _rc | `"`varl'"'=="" { local varl `"`temp2'"' } local temp2 = substr(`"`var'"',1,`temp') local varl `"`temp2'`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 `nrvblock'==1 { local tmpbegin: 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(theeqlabel)'`macval(varl)'"', nobreak Abbrev `varwidth' `"`macval(value)'"' "`abbrev'" } else { Abbrev `varwidth' `"`macval(theeqlabel)'`macval(varl)'"' "`abbrev'" } WriteBegin `"`file'"' `"`macval(varlabelsbegin0)'"' `"`macval(tmpbegin)'"' /// `"`fmt_v' (`"`macval(varlabelsprefix)'`macval(value)'`macval(varlabelssuffix)'"')"' if `haslabcol2' { gettoken labcol2chunk labcol2 : labcol2 Abbrev `labcol2width' `"`macval(labcol2chunk)'"' "`abbrev'" file write `file' `macval(delimiter)' `fmt_l2' (`"`macval(value)'"') } 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' local unstackskipcoef 0 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 unstackskipcoef 1 // local v "." } else local rr `r' 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 `haslabcol2' { file write `file' `macval(delimiter)' `fmt_l2' ("") } if "`smcltags'"!="" file write `file' "{res}" } local v: subinstr local v "&" " ", all local modelwidthj: word `=1+mod(`c'-1,`nmodelwidth')' of `modelwidth' if `modelwidthj'>0 local fmt_m "%`modelwidthj's" else local fmt_m local thevalue foreach vi of local v { if index("`vi'",".")!=1 { if `: list eqvar in `vi'_drop' local vi "..`vi'" else { local vipar: subinstr local `vi'_par "@modelwidth" "`modelwidthj'", all } } if index("`vi'",".")==1 { local value } else if `unstackskipcoef' { local value `"``vi'_vacant'"' } else if `B'[`rr',`m'*`droppedpos']==1 & `droppedison' { if `first'[1,`m'] { local value `"`macval(dropped)'"' mat `first'[1,`m']=0 } else local value } else if "``vi'_'"=="ci" { if `_`vi'_l'[`rr',`m']>=.y local value `"``vi'_vacant'"' else { local format: word `r' of `ci_fmt' if "`format'"=="" { local format: word `:word count ``vi'_fmt'' of ``vi'_fmt' } local value = `_`vi'_l'[`rr',`m'] local vipar: subinstr local `vi'_l_par "@modelwidth" "`modelwidthj'", all vFormat `value' `format' "`lz'" `"`macval(dmarker)'"' /// `"`macval(msign)'"' `"`macval(vipar)'"' local temp "`macval(value)'" local value = `_`vi'_u'[`rr',`m'] local vipar: subinstr local `vi'_u_par "@modelwidth" "`modelwidthj'", all vFormat `value' `format' "`lz'" `"`macval(dmarker)'"' /// `"`macval(msign)'"' `"`macval(vipar)'"' local value `"`macval(temp)'`macval(value)'"' } } else if `_`vi''[`rr',`m']>=.y local value `"``vi'_vacant'"' //else if `_`vi''[`rr',`m']>=. local value . else if "``vi'_'"=="_star" { CellStars `"`macval(starlevels)'"' `_```vi'_pvalue'_tname''[`rr',`m'] `"`macval(vipar)'"' } else if "``vi'_'"=="_sign" { MakeSign `_`vi''[`rr',`m'] `"`macval(msign)'"' `"`macval(vipar)'"' } else if "``vi'_'"=="_sigsign" { MakeSign `_`vi''[`rr',`m'] `"`macval(msign)'"' `"`macval(vipar)'"' /// `"`macval(starlevels)'"' `_```vi'_pvalue'_tname''[`rr',`m'] } else { local format: word `r' of ``vi'_fmt' if "`format'"=="" { local format: word `:word count ``vi'_fmt'' of ``vi'_fmt' } local value = `_`vi''[`rr',`m'] vFormat `value' `format' "`lz'" `"`macval(dmarker)'"' /// `"`macval(msign)'"' `"`macval(vipar)'"' } local thevalue `"`macval(thevalue)'`macval(value)'"' if !`stardetachon' & `:word `c' of `starsrow''==1 { if `modelwidthj'>0 | `starwidth'>0 local fmt_m "%`=`modelwidthj'+`starwidth''s" local value if index("`vi'",".")!=1 & `"``vi'_star'"'!="" { if !`: list eqvar in stardrop' { Stars `"`macval(starlevels)'"' `_```vi'_pvalue'_tname''[`rr',`m'] } } if "`ferest()'"=="" { local value: di `fmt_stw' `"`macval(value)'"' } local thevalue `"`macval(thevalue)'`macval(value)'"' } if "`ferest()'"!="" & index("`vi'","..")!=1 { local thevalue `"`macval(thevalue)'`macval(incelldelimiter)'"' } } file write `file' `macval(delimiter)' `fmt_m' (`"`macval(thevalue)'"') if `stardetachon' & `:word `c' of `starsrow''==1 { local thevalue foreach vi of local v { if index("`vi'",".")!=1 { if `: list eqvar in `vi'_drop' local vi "..`vi'" } if index("`vi'",".")!=1 & `"``vi'_star'"'!="" { if `: list eqvar in stardrop' local value else { Stars `"`macval(starlevels)'"' `_```vi'_pvalue'_tname''[`rr',`m'] } local thevalue `"`macval(thevalue)'`macval(value)'"' } if "`ferest()'"!="" & index("`vi'","..")!=1 { local thevalue `"`macval(thevalue)'`macval(incelldelimiter)'"' } } file write `file' `macval(stardetach)' `fmt_stw' (`"`macval(thevalue)'"') } } 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)'"' if `"`macval(value)'"'!="" { IsInString `"""' `"`value'"' // sets local strcount if `strcount'==0 { local value `"`"`macval(value)'"'"' } InsertAtVariables `"`macval(value)'"' 2 "`ncols'" `macval(atvars2)' if "`varlabelsreplace'"!="" 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 `haslabcol2' { gettoken labcol2chunk labcol2 : labcol2 Abbrev `labcol2width' `"`macval(labcol2chunk)'"' "`abbrev'" file write `file' `macval(delimiter)' `fmt_l2' (`"`macval(value)'"') } if "`smcltags'"!="" file write `file' "{res}" WriteStrRow `"`file'"' "`modelsrow'" `"`eqsrow'"' `"`: list sizeof eqswide'"' /// `"`macval(refcatrow)'"' `"`macval(delimiter)'"' /// `"`macval(stardetach)'"' "`starsrow'" "`abbrev'" /// "`modelwidth'" "`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 `haslabcol2' { gettoken labcol2chunk labcol2 : labcol2 Abbrev `labcol2width' `"`macval(labcol2chunk)'"' "`abbrev'" file write `file' `macval(delimiter)' `fmt_l2' (`"`macval(value)'"') } if "`smcltags'"!="" file write `file' "{res}" WriteStrRow `"`file'"' "`modelsrow'" `"`eqsrow'"' `"`: list sizeof eqswide'"' /// `"`macval(indicate`i'lbls)'"' `"`macval(delimiter)'"' /// `"`macval(stardetach)'"' "`starsrow'" "`abbrev'" /// "`modelwidth'" "`delwidth'" "`starwidth'" if "`smcltags'"!="" file write `file' "{txt}" WriteEnd `"`file'"' `"`macval(tmpend)'"' `"`macval(varlabelsend)'"' } *Write prefoot if `"`macval(prefoot)'"'!="" { if index(`"`macval(prefoot)'"',`"""')==0 { local prefoot `"`"`macval(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 } if ((`"`vblock'"'!="" & `R'>0) | `nindicate'>0) & "`smclmidrules'"!="" { if `"`macval(statsarray)'"'!="" { file write `file' `"`thesmclrule'"' _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 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 `haslabcol2' { gettoken labcol2chunk labcol2 : labcol2 Abbrev `labcol2width' `"`macval(labcol2chunk)'"' "`abbrev'" file write `file' `macval(delimiter)' `fmt_l2' (`"`macval(value)'"') } 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 local mpos 0 foreach m of local modelsrow { local ++c local modelwidthj: word `=1+mod(`c'-1,`nmodelwidth')' of `modelwidth' if `modelwidthj'>0 local fmt_m "%`modelwidthj's" else local fmt_m 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 local hasmestats 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'==.y { local value `"`return(m`m'_`stat')'"' if `"`value'"'!="" { local cellhasstat 1 local stcelllay: subinstr local stcelllay `"`statspchar'"' /// `"`value'"' } } else if `value'==.x { local hasmestats 1 } else if `value'<.x { 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(`St',`"`eq':`stat'"') if `rr'>=. local value .z else 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' 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(`St',`"`eq':p"') } else { local rr=rownumb(`St',"p") } Stars `"`macval(starlevels)'"' `St'[`rr',`m'] file write `file' `macval(stardetach)' `fmt_stw' (`"`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 if "`smclrules'"!="" { file write `file' `"`thesmclrule'"' _n } local discrete: list retok discrete if `"`macval(postfoot)'"'!="" { if index(`"`macval(postfoot)'"',`"""')==0 { local postfoot `"`"`macval(postfoot)'"'"' } } 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 `"`topfile'"'!="" { confirm file `"`topfile'"' } if `"`bottomfile'"'!="" { confirm file `"`bottomfile'"' } if `"`using'"'!="" { tempname file2 file open `file2' `using', write text `replace' `append' } if "`type'"!="" di as res "" if `"`topfile'"'!="" { file open `file' using `"`topfile'"', read text file read `file' temp while r(eof)==0 { 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' } file open `file' using `"`tfile'"', read text file read `file' temp while r(eof)==0 { forv s = 1(2)`S' { local from: word `s' of `macval(substitute)' local to: word `=`s'+1' of `macval(substitute)' if `"`macval(from)'`macval(to)'"'!="" { 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 `"`bottomfile'"'!="" { file open `file' using `"`bottomfile'"', read text file read `file' temp while r(eof)==0 { 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' gettoken junk using0 : using return local fn `using0' if "`outfilenoteoff'"=="" { di as txt `"(output written to {browse `using0'})"' } } end program MoreOptions // estout has more options than -syntax- can handle; a subroutine is used // here (rather than a second syntax call) to preserve the 'using' macro // from the first syntax call // MoreOptions is intended for options without arguments only local theoptions /// NOReplace Replace /// NOAppend Append /// NOTYpe TYpe /// NOSHOWTABS showtabs /// NOASIS asis /// NOWRAP wrap /// NOSMCLTags SMCLTags /// NOSMCLRules SMCLRules /// NOSMCLMIDRules SMCLMIDRules /// NOSMCLEQRules SMCLEQRules /// NOOUTFILENOTEOFF outfilenoteoff syntax [, `theoptions' ] foreach opt of local theoptions { local opt = lower("`opt'") c_local `opt' "``opt''" } c_local options end program ParseValueSubopts syntax anything [ , mrow(string asis) NOTranspose Transpose /// NOStar Star PVALue(string) Fmt(string) Label(string) Vacant(string) /// NOPAR par PAR2(string asis) Keep(string asis) Drop(string asis) /// PATtern(string) NOABS abs ] local el: word 1 of `anything' local elname: word 2 of `anything' CheckPattern `"`pattern'"' "`elname'" if `"`macval(par2)'"'!="" { local par `"`macval(par2)'"' } else if "`par'"!="" { if "`elname'"=="ci" local par "[ , ]" else if "`elname'"=="ci_l" local par `"[ """' else if "`elname'"=="ci_u" local par `""" ]"' else local par "( )" } if `"`mrow'"'!="" { capt confirm integer number `mrow' if _rc==0 { if `mrow'>=1 { if `"`macval(label)'"'=="" { local label "`elname'[`mrow']" } } else { local mrow `""`mrow'""' if `"`macval(label)'"'=="" { local label `mrow' } } } else { gettoken trash : mrow, qed(qed) if `qed'==0 { local mrow `"`"`mrow'"'"' } if `"`macval(label)'"'=="" { local label `mrow' } } } foreach opt in transpose star par abs { if "`no`opt''"!="" c_local no`el'_`opt' 1 else c_local `el'_`opt' "``opt''" } foreach opt in mrow pvalue fmt label vacant keep drop pattern { c_local `el'_`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 if `statscstar' local statscol_1 1 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 local lblsubopts syntax [anything] [ , NONUMbers NUMbers NOTItles TItles 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) /// NOMerge Merge ] CheckPattern `"`pattern'"' "`type'" if "`merge'"!="" & "`nomerge'`macval(suffix)'"=="" local suffix ":" foreach opt in begin end { if `"`macval(`opt')'"'!="" { if index(`"`macval(`opt')'"', `"""')==0 { local `opt' `"`"`macval(`opt')'"'"' } } } foreach opt in prefix suffix begin end blist elist erepeat lhs pattern { c_local `type'`opt' `"`macval(`opt')'"' } foreach opt in numbers titles depvars span replace none first last merge { 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 local temp1: subinstr local temp1 "`=char(9)'" " ", all 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 local temp1: subinstr local temp1 "`=char(9)'" " ", all 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 local temp1: subinstr local temp1 "`=char(9)'" " ", all } } c_local line `"`macval(line)'"' end program CellsCheck args cells local ncols 0 local nrows 0 local cells: subinstr local cells "& " "&", all local cells: subinstr local cells " &" "&", all local cells: subinstr local cells `"&""' `"& ""', all local cells: subinstr local cells `""&"' `"" &"', all foreach row of local cells { local newrow foreach col of local row { local vals: subinstr local col "&" " ", all //local vals: list vals - values local values: list values | vals local vals: list retok vals local vals: subinstr local vals " " "&", all //local newrow: list newrow | vals local newrow `"`newrow'`vals' "' } local newrow: list retok newrow 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' local dot "." c_local values: list values - dot 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 // Loosely based on Mkemat from est_table.ado, but with heavy modifications program _estout_getres, rclass syntax, names(str) [ coefs(str asis) stats(str asis) equations(str) /// rename(str asis) margin(str asis) meqs(str asis) /// dropped(int 0) level(int 95) /// transform(str asis) transformpattern(str asis) ] // coefs: coef "coef O/1 #" `"coef O/1 "rowname""' etc... tempname bc bbc bs bbs st local nnames : word count `names' local rename : subinstr local rename "," "", all if `"`stats'"' != "" { local stats : subinstr local stats "," "", all confirm names `stats' local stats : list uniq stats local nstat : list sizeof stats mat `bbs' = J(`nstat', `nnames', .z) mat colnames `bbs' = `: subinstr local names "." "active", all word' mat rownames `bbs' = `stats' } if "`equations'" != "" { MatchNames "`equations'" local eqspec `r(eqspec)' local eqnames `r(eqnames)' } local ncoefs 0 foreach coefn of local coefs { local ++ncoefs gettoken coef : coefn local coefnms `"`coefnms' `coef'"' // use more informative label? (coefn => error in Stata 8 and 10) } local bVs "b se var t z p ci_l ci_u _star _sign _sigsign" local hasbVs = `"`: list coefnms & bVs'"'!="" local hastransform = (`"`transform'"'!="") & `hasbVs' local getbV = cond(`hasbVs' | `dropped', "b var ", "") tempname hcurrent esample local estcycle = ("`names'"!=".") if `estcycle' { _est hold `hcurrent', restore nullok estsystem } local ni 0 local hasbbc 0 local ccols = `ncoefs' + ("`margin'"!="") + `dropped' foreach name of local names { local ++ni local hasbc 0 local hasmargin 0 nobreak { if "`name'" != "." { local eqname `name' *est_unhold `name' `esample' // (why preserve missings in esample?) capt confirm new var _est_`name' // fix e(sample) if obs have been added if _rc qui replace _est_`name' = 0 if _est_`name' >=. _est unhold `name' } else { local eqname active if `estcycle' { _est unhold `hcurrent' } } // get coefficients capture noisily break { CheckEqs `"`getbV'`coefs'"' // sets local seqmerge GetCoefs `bc' `seqmerge' `"`getbV'`coefs'"' // sets local hasbc if `hasbc' { mat coln `bc' = `getbV'`coefnms' } } local rc = _rc // set equation names and get marginal effects if `hasbc' & `rc'==0 { capture noisily break { if `dropped' { DroppedCoefs `bc' } if "`equations'"!="" { AdjustRowEq `bc' `ni' `nnames' "`eqspec'" "`eqnames'" } if "`margin'"!="" & `hasbVs' { GetMarginals `bc' "`margin'" `"`meqs'"' // resets local hasmargin } if `hasbVs' { ComputeCoefs `bc' `hasmargin' `"`coefnms'"' `level' } if `hastransform' & `hasbVs' { if `"`transformpattern'"'!="" { local transformthis: word `ni' of `transformpattern' } else local transformthis 1 if `"`transformthis'"'=="1" { TransformCoefs `bc' `"`coefnms'"' `"`transform'"' } } if "`getbV'"!="" { mat `bc' = `bc'[1...,3...] // remove b and var } } local rc = _rc } // get stats if `rc'==0 { capture noisily break { if "`stats'" != "" { GetStats "`stats'" `bbs' `ni' if `hasbc'>0 & inlist(`"`e(cmd)'"', "reg3", "sureg", "mvreg") { GetEQStats "`stats'" `bbs' `ni' `bc' } return add } } local rc = _rc } local depname: word 1 of `e(depvar)' return local m`ni'_depname "`depname'" local title `"`e(estimates_title)'"' if `"`title'"'=="" local title `"`e(_estimates_title)'"' // prior to Stata 10 return local m`ni'_estimates_title `"`title'"' if "`name'" != "." { *est_hold `name' `esample' _est hold `name', estimates varname(_est_`name') } else { if `estcycle' { _est hold `hcurrent', restore nullok estsystem } } } if `rc' { exit `rc' } if `hasbc'>0 { mat coleq `bc' = `eqname' if `"`rename'"'!="" { RenameCoefs `bc' `"`rename'"' } if `hasbbc' { mat_capp `bbc' : `bbc' `bc', miss(.z) cons ts } else { mat `bbc' = `bc' if `ni'>1 { // add previous empty models mat `bc' = (1, `bc'[1,1...]) \ ( `bc'[1...,1], J(rowsof(`bc'), colsof(`bc'), .z)) mat `bc' = `bc'[2...,2...] forv nj = 1/`ni' { if `nj'==`ni' continue local eqname: word `nj' of `names' if `"`eqname'"'=="." { local eqname active } mat coleq `bc' = `eqname' mat `bbc' = `bc', `bbc' } } } local hasbbc 1 } else { if `hasbbc' { // add empty model if bbc exists mat `bc' = `bbc'[1...,1..`ccols'] mat `bc' = (1, `bc'[1,1...]) \ ( `bc'[1...,1], J(rowsof(`bc'), colsof(`bc'), .z)) mat `bc' = `bc'[2...,2...] mat coleq `bc' = `eqname' mat `bbc' = `bbc', `bc' } } } if `hasbbc' { return matrix coefs = `bbc' return scalar ccols = `ccols' } else { return scalar ccols = 0 // indicates that r(coefs) is missing } if "`stats'" != "" { return matrix stats = `bbs' } return local names `names' return scalar nmodels = `ni' end program DroppedCoefs // identify dropped coeffficients args bc tempname tmp mat `tmp' = `bc'[1..., 1] * 0 mat coln `tmp' = "_dropped" local r = rowsof(`bc') forv i = 1/`r' { if `bc'[`i',1]==0 & `bc'[`i',2]==0 { // b=0 and var=0 mat `tmp'[`i',1] = 1 } } mat `bc' = `bc', `tmp' end program RenameCoefs args bc rename local Stata11 = cond(c(stata_version)>=11, "version 11:", "") tempname tmp local eqs: roweq `bc', q local eqs: list clean eqs local eqs: list uniq eqs local newnames foreach eq of local eqs { mat `tmp' = `bc'[`"`eq':"',1] QuotedRowNames `tmp' local vars `"`value'"' gettoken from rest : rename gettoken to rest : rest while (`"`from'`to'"'!="") { if index(`"`to'"',":") | `"`to'"'=="" { di as err "invalid rename()" exit 198 } local hasfrom = rownumb(`tmp', `"`from'"') if `hasfrom'<. { local hasto = rownumb(`tmp', `"`to'"') if `hasto'<. { di as err `"`to' already exists in equation; cannot rename"' exit 110 } local colonpos = index(`"`from'"',":") if index(`"`from'"',":") { // remove equation gettoken chunk from : from, parse(":") // eq gettoken chunk from : from, parse(":") // : gettoken from : from if `"`from'"'=="" { di as err "invalid rename()" exit 190 } } local vars: subinstr local vars `"`from'"' `"`"`to'"'"', word `Stata11' mat rown `tmp' = `vars' } gettoken from rest : rest gettoken to rest : rest } local newnames `"`newnames'`vars' "' } `Stata11' mat rown `bc' = `newnames' end // Source: est_table.ado version 1.1.4 09oct2008 (unmodified) program MatchNames, rclass args eqspec local eqspec : subinstr local eqspec ":" " ", all local eqspec0 : subinstr local eqspec "#" "" , all local iterm 0 gettoken term eqspec : eqspec0 , parse(",") while "`term'" != "" { local ++iterm // term = [name =] { # | #-list } gettoken eqname oprest: term, parse("=") gettoken op rest : oprest, parse("=") if trim(`"`op'"') == "=" { confirm name `eqname' local term `rest' } else { local eqname #`iterm' } local eqnames `eqnames' `eqname' if "`eqspec'" == "" { continue, break } gettoken term eqspec: eqspec , parse(",") assert "`term'" == "," gettoken term eqspec: eqspec , parse(",") } if `"`:list dups eqnames'"' != "" { dis as err "duplicate matched equation names" exit 198 } return local eqspec `eqspec0' return local eqnames `eqnames' end // Source: est_table.ado version 1.1.4 09oct2008 (unmodified) program AdjustRowEq args b ni nmodel eqspec eqnames local beqn : roweq `b', quote local beqn : list clean beqn local beq : list uniq beqn if `"`:list beq & eqnames'"' != "" { dis as err "option equations() invalid" dis as err "specified equation name already occurs in model `ni'" exit 198 } local iterm 0 gettoken term eqspec : eqspec , parse(",") while "`term'" != "" { // dis as txt "term:|`term'|" local ++iterm // term = [name =] { # | #-list } gettoken eqname oprest: term, parse("=") gettoken op rest : oprest, parse("=") if trim(`"`op'"') == "=" { local term `rest' } else { local eqname #`iterm' } local nword : list sizeof term if !inlist(`nword', 1, `nmodel') { dis as err "option equations() invalid" dis as err "a term should consist of either 1 or `nmodel' equation numbers" exit 198 } if `nword' > 1 { local term : word `ni' of `term' } if trim("`term'") != "." { capt confirm integer number `term' if _rc { dis as err "option equations() invalid" dis as err "`term' was found, while an integer equation number was expected" exit 198 } if !inrange(`term',1,`:list sizeof beq') { dis as err "option equations() invalid" dis as err "equation number `term' for model `ni' out of range" exit 198 } if `:list posof "`eqname'" in beq' != 0 { dis as err "impossible to name equation `eqname'" dis as err "you should provide (another) equation name" exit 198 } local beqn : subinstr local beqn /// `"`:word `term' of `beq''"' /// "`eqname'" , word all } if "`eqspec'" == "" { continue, break } gettoken term eqspec: eqspec , parse(",") assert "`term'" == "," gettoken term eqspec: eqspec , parse(",") } matrix roweq `b' = `beqn' end // Source: est_table.ado version 1.1.4 09oct2008 (modified) // Modification: returns string scalars in r(m`ni'_name) (and sets `bbs' = .y) program GetStats, rclass args stats bbs ni tempname rank st V local escalars : e(scalars) local emacros : e(macros) local is 0 foreach stat of local stats { local ++is if inlist("`stat'", "aic", "bic", "rank") { if "`hasrank'" == "" { capt mat `V' = syminv(e(V)) local rc = _rc if `rc' == 0 { scalar `rank' = colsof(`V') - diag0cnt(`V') } else if `rc' == 111 { scalar `rank' = 0 } else { // rc<>0; show error message mat `V' = syminv(e(V)) } local hasrank 1 } if "`stat'" == "aic" { scalar `st' = -2*e(ll) + 2*`rank' } else if "`stat'" == "bic" { scalar `st' = -2*e(ll) + log(e(N)) * `rank' } else if "`stat'" == "rank" { scalar `st' = `rank' } } else { if `:list stat in escalars' > 0 { scalar `st' = e(`stat') } else if "`stat'"=="p" { if e(F)<. { scalar `st' = Ftail(e(df_m), e(df_r), e(F)) } else if e(chi2)<. { scalar `st' = chi2tail(e(df_m), e(chi2)) } } else if `:list stat in emacros' > 0 { scalar `st' = .y capt return local m`ni'_`stat' `"`e(`stat')'"' // name might be too long } else { scalar `st' = .z } } mat `bbs'[`is',`ni'] = `st' } end program GetEQStats, rclass // eq-specific stats for reg3, sureg, and mvreg (sets `bbs' = .x) args stats bbs ni bc return add tempname addrow local ic "aic bic rank" local eqs: roweq `bc', q local eqs: list clean eqs local eqs: list uniq eqs local s 0 foreach stat of local stats { local ++s if inlist(`"`stat'"', "aic", "bic", "rank") continue if `bbs'[`s',`ni']<.y continue local e 0 local found 0 foreach eq of local eqs { local ++e 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==0 { local found 1 local r = rownumb(`bbs', `"`eq':`stat'"') if `r'>=. { mat `addrow' = J(1, colsof(`bbs'), .z) mat rown `addrow' = `"`eq':`stat'"' mat `bbs' = `bbs' \ `addrow' local r = rownumb(`bbs', `"`eq':`stat'"') } mat `bbs'[`r',`ni'] = `value' } } if `found' { if `bbs'[`s',`ni']==.y { capt return local m`ni'_`stat' "" } mat `bbs'[`s',`ni'] = .x } } end program CheckEqs args coefs tempname tmp local j 0 local bVs "b _star _sign _sigsign" local seqmerge 0 local hasseqs 0 foreach coefn in `coefs' { local ++j gettoken coef row : coefn gettoken transpose row : row gettoken row : row, q if `"`coef'"'=="b" & `j'==1 { capt confirm mat e(`coef') if _rc continue mat `tmp' = e(`coef') local eqs: coleq `tmp', q if `:list posof "_" in eqs'==0 { local seqmerge 1 } else continue, break } if `:list coef in bVs' continue capt confirm mat e(`coef') if _rc continue mat `tmp' = e(`coef') if `transpose' { mat `tmp' = `tmp'' } if `"`row'"'=="" local row 1 capt confirm number `row' if _rc { local row = rownumb(`tmp',`row') } if `row'>rowsof(`tmp') continue local eqs: coleq `tmp', q if `:list posof "_" in eqs' { local eqs: list uniq eqs local eqs: list clean eqs if `"`eqs'"'!="_" { // => contains "_" but also others local local seqmerge 0 continue, break } else local hasseqs 1 } else { local seqmerge 1 } } if `hasseqs'==0 local seqmerge 0 c_local seqmerge `seqmerge' end program GetCoefs args bc seqmerge coefs tempname tmp local hasbc 0 local j 0 local bVs "b _star _sign _sigsign" foreach coefn of local coefs { local ++j gettoken coef row : coefn gettoken transpose row : row gettoken row : row, q local isinbVs: list coef in bVs if `isinbVs' & `j'>2 { if `hasbc'==0 continue mat `bc' = `bc', J(rowsof(`bc'),1, .y) continue } if `j'==2 & `"`coef'"'=="var" { local isinbVs 1 capt mat `tmp' = vecdiag(e(V)) if _rc { capt confirm mat e(se) if _rc==0 { mat `tmp' = e(se) forv i = 1/`=colsof(`tmp')' { mat `tmp'[1, `i'] = `tmp'[1, `i']^2 } } } } else { capt confirm mat e(`coef') if _rc==0 { mat `tmp' = e(`coef') } } if _rc { if `hasbc'==0 continue mat `bc' = `bc', J(rowsof(`bc'),1, .y) continue } if `isinbVs'==0 { // => not b or var if `transpose' { mat `tmp' = `tmp'' } if `"`row'"'=="" local row 1 capt confirm number `row' if _rc { local row = rownumb(`tmp',`row') } if `row'>rowsof(`tmp') { if `hasbc'==0 continue mat `bc' = `bc', J(rowsof(`bc'),1, .y) continue } mat `tmp' = `tmp'[`row', 1...] } local bcols = colsof(`tmp') if `bcols'==0 { if `hasbc'==0 continue mat `bc' = `bc', J(rowsof(`bc'),1, .y) continue } mat `tmp' = `tmp'' if `seqmerge' & `isinbVs'==0 { local eqs: roweq `tmp', q local eqs: list uniq eqs local eqs: list clean eqs if `"`eqs'"'=="_" { local seqmergejs `seqmergejs' `j' local seqmergecoefs `"`seqmergecoefs'`"`coefn'"' "' if `hasbc'==0 continue mat `bc' = `bc', J(rowsof(`bc'),1, .y) continue } } if `hasbc'==0 { mat `bc' = `tmp' local hasbc 1 if `j'>1 { mat `bc' = `bc', J(`bcols',`j'-1, .y), `bc' mat `bc' = `bc'[1...,2...] } } else { mat_capp `bc' : `bc' `tmp', miss(.y) cons ts } } foreach coefn of local seqmergecoefs { gettoken j seqmergejs : seqmergejs gettoken coef row : coefn gettoken transpose row : row gettoken row : row, q mat `tmp' = e(`coef') if `transpose' { mat `tmp' = `tmp'' } if `"`row'"'=="" local row 1 capt confirm number `row' if _rc { local row = rownumb(`tmp',`row') } mat `tmp' = `tmp'[`row', 1...] SEQMerge `bc' `j' `tmp' } c_local hasbc `hasbc' end program SEQMerge args bc j x tempname tmp local r = rowsof(`bc') forv i = 1/`r' { mat `tmp' = `bc'[`i',1...] local v: rown `tmp' local c = colnumb(`x', `"`v'"') if `c'<. { mat `bc'[`i',`j'] = `x'[1,`c'] } } end program ComputeCoefs args bc hasmargin coefs level local bVs1 "b _star _sign _sigsign" local bVs2 "se var t z p ci_l ci_u" local c = colsof(`bc') forv j = 3/`c' { gettoken v coefs : coefs if `"`v'"'=="" continue, break if `: list v in bVs1' { ComputeCoefs_`v' `bc' `j' `level' continue } if `: list v in bVs2' { if `hasmargin' { ComputeCoefs_`v' `bc' `j' `level' continue } capt confirm matrix e(`v') if _rc { ComputeCoefs_`v' `bc' `j' `level' } } } end program CopyColFromTo args m from to cname tempname tmp mat `tmp' = `m'[1...,`from'] mat coln `tmp' = `cname' local c = colsof(`m') if `to'==`c' { mat `m' = `m'[1...,1..`c'-1], `tmp' exit } mat `m' = `m'[1...,1..`to'-1], `tmp', `m'[1...,`to'+1..`c'] end program ComputeCoefs_b args bc j CopyColFromTo `bc' 1 `j' "b" end program ComputeCoefs_se args bc j local r = rowsof(`bc') forv i = 1/`r' { local var `bc'[`i',2] local res `bc'[`i',`j'] if `var'>=. mat `res' = `var' else if `var'==0 mat `res' = . else mat `res' = sqrt(`var') } end program ComputeCoefs_var args bc j CopyColFromTo `bc' 2 `j' "var" end program ComputeCoefs_t args bc j local r = rowsof(`bc') forv i = 1/`r' { local b `bc'[`i',1] local var `bc'[`i',2] local res `bc'[`i',`j'] if `b'>=. mat `res' = `b' else if `var'>=. mat `res' = `var' else mat `res' = `b'/sqrt(`var') } end program ComputeCoefs_z ComputeCoefs_t `0' end program ComputeCoefs_p args bc j local r = rowsof(`bc') local df_r = e(df_r) forv i = 1/`r' { local b `bc'[`i',1] local var `bc'[`i',2] local res `bc'[`i',`j'] if `b'>=. mat `res' = `b' else if `var'>=. mat `res' = `var' else if `df_r'<. mat `res' = ttail(`df_r',abs(`b'/sqrt(`var'))) * 2 else mat `res' = (1 - norm(abs(`b'/sqrt(`var')))) * 2 } end program ComputeCoefs_ci_l args bc j ComputeCoefs_ci - `0' end program ComputeCoefs_ci_u args bc j ComputeCoefs_ci + `0' end program ComputeCoefs_ci args sign bc j level local r = rowsof(`bc') local df_r = e(df_r) forv i = 1/`r' { local b `bc'[`i',1] local var `bc'[`i',2] local res `bc'[`i',`j'] if `b'>=. mat `res' = `b' else if `var'>=. mat `res' = `var' else if `df_r'<. mat `res' = `b' `sign' /// invttail(`df_r',(100-`level')/200) * sqrt(`var') else mat `res' = `b' `sign' /// invnorm(1-(100-`level')/200) * sqrt(`var') } end program ComputeCoefs__star args bc j CopyColFromTo `bc' 1 `j' "_star" end program ComputeCoefs__sign args bc j CopyColFromTo `bc' 1 `j' "_sign" end program ComputeCoefs__sigsign args bc j CopyColFromTo `bc' 1 `j' "_sigsign" end program GetMarginals args bc margin meqs tempname D dfdx mat `D' = `bc'[1...,1]*0 mat coln `D' = "_dummy" 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 { QuotedRowNames `bc' local rnames `"`value'"' if `"`meqs'"'!="" local reqs: roweq `bc', 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 `bc'[`i',1] = .y mat `bc'[`i',2] = .y } else { mat `bc'[`i',1] =`dfdx'[1,`col'] mat `bc'[`i',2] = (`dfdx'[2,`col'])^2 if "`:word `col' of `dummy''"=="1" mat `D'[`i',1] = 1 } local ++i } c_local hasmargin 1 } mat `bc' = `bc', `D' end program TransformCoefs args bc coefs transform local c = colsof(`bc') forv j = 3/`c' { gettoken v coefs : coefs if inlist("`v'", "b", "ci_l", "ci_u") { _TransformCoefs `bc' `j' 0 "" "" `"`transform'"' } else if "`v'"=="se" { _TransformCoefs `bc' `j' 1 "abs" "" `"`transform'"' } else if "`v'"=="var" { _TransformCoefs `bc' `j' 1 "" "^2" `"`transform'"' } } end program _TransformCoefs args bc j usedf abs sq transform local r = rowsof(`bc') gettoken coef rest : transform gettoken f rest : rest gettoken df rest : rest while `"`coef'`f'`df'"'!="" { if `"`df'`rest'"'=="" { // last element of list may be without coef local df `"`f'"' local f `"`coef'"' local coef "" } local trcoefs `"`trcoefs'`"`coef'"' "' if `usedf' { local trs `"`trs'`"`df'"' "' } else { local trs `"`trs'`"`f'"' "' } gettoken coef rest : rest gettoken f rest : rest gettoken df rest : rest } local trs : subinstr local trs "@" "\`b'", all forv i = 1/`r' { gettoken coef coefrest : trcoefs gettoken tr trrest : trs while `"`coef'`tr'"'!="" { MatchCoef `"`coef'"' `bc' `i' if `match' { if `usedf' { local b `bc'[`i',1] local res `bc'[`i',`j'] if `res'<. { mat `res' = `res' * `abs'(`tr')`sq' } } else { local b `bc'[`i',`j'] if `b'<. { mat `b' = (`tr') } } continue, break } gettoken coef coefrest : coefrest gettoken tr trrest : trrest } } end program MatchCoef args eqx b i if inlist(trim(`"`eqx'"'),"","*") { c_local match 1 exit } tempname tmp mat `tmp' = `b'[`i',1...] local eqi: roweq `tmp' local xi: rown `tmp' 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 } if `"`eq'"'=="" local eq "*" if `"`x'"'=="" local x "*" c_local match = match(`"`eqi'"', `"`eq'"') & match(`"`xi'"', `"`x'"') 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 ccols tempname Bsub mat `Bsub' = `B'["`eq':",(`m'-1)*`ccols'+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 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 rtfrowdef rtfemptyrow /// title note discrete starlegend if `type'==1 local atvars span else { local atvars span M E width hline if `rtf' local atvars `atvars' rtfrowdefbrdrt rtfrowdefbrdrb rtfrowdef rtfemptyrow if `type'!=2 local atvars `atvars' title note 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 { if length(`"`macval(value)'"')>`width' { 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'>=. { local newpattern `newpattern' . continue } 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 delwidth starwidth repeat prefix suffix local c 0 local nspan 0 local c0 2 local spanwidth -`delwidth' local spanfmt local ncolwidth: list sizeof colwidth foreach r of local row { local rtwo: word `++c' of `rowtwo' local colwidthj: word `=1+mod(`c'-1,`ncolwidth')' of `colwidth' if `colwidthj'>0 local colfmt "%`colwidthj's" else local colfmt 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 `colwidthj' `"`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'+`colwidthj'+`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)' WriteStrLines `"`file'"' `"`macval(post)'"' WriteStrLines `"`file'"' `"`macval(post2)'"' file write `file' _n end program WriteStrLines args file lines foreach line of local lines { file write `file' `newline' `"`macval(line)'"' local newline _n } end program WriteEqrow args file delimiter stardetach value row span vwidth fmt_v /// abbrev mwidth delwidth starwidth prefix suffix /// haslabcol2 labcolwidth fmt_l2 local nspan 1 local spanwidth `vwidth' local spanfmt local c 0 local nmwidth: list sizeof mwidth 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)'"') if `haslabcol2' { file write `file' `macval(delimiter)' `fmt_l2' ("") } foreach r of local row { local mwidthj: word `=1+mod(`c++',`nmwidth')' of `mwidth' if `mwidthj'>0 local fmt_m "%`mwidthj's" else local fmt_m file write `file' `macval(delimiter)' `fmt_m' ("") if `r'==1 { file write `file' `macval(stardetach)' _skip(`starwidth') } } } else { if `haslabcol2' { local ++nspan local spanwidth = `spanwidth' + `delwidth' + `labcolwidth' } foreach r of local row { local mwidthj: word `=1+mod(`c++',`nmwidth')' of `mwidth' local ++nspan local spanwidth = `spanwidth' + `delwidth' + `mwidthj' 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 delwidth starwidth local c 0 local ncolwidth: list sizeof colwidth foreach mnum of local mrow { local eqnum: word `++c' of `eqrow' local colwidthj: word `=1+mod(`c'-1,`ncolwidth')' of `colwidth' if `colwidthj'>0 local colfmt "%`colwidthj's" else local colfmt 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 `colwidthj' `"`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 } } else if `"`fmt'"'=="%g" | `"`fmt'"'=="g" local fmt "%9.0g" else if substr(`"`fmt'"',1,1)!="%" { di as err `"`fmt': invalid format"' exit 198 } 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, .) if `"`d'"'=="" local d 3 capt confirm integer number `d' if _rc { di as err `"`fmt': invalid format"' 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 args type b spec // type=0: drop; type=1: keep capt confirm matrix `b' if _rc { exit } 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 mat drop `b' capt mat rename `res' `b' end program Order args b spec capt confirm matrix `b' if _rc { exit } 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 mat drop `b' capt mat rename `res' `b' 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 mat drop `b' capt mat rename `res' `b' 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 program define QuotedRowNames args matrix capt confirm matrix `matrix' if _rc { c_local value "" exit } tempname extract if substr(`"`matrix'"',1,2)=="r(" { local matrix0 `"`matrix'"' tempname matrix mat `matrix' = `matrix0' } local R = rowsof(`matrix') forv r = 1/`R' { mat `extract' = `matrix'[`r',1...] local name: rownames `extract' local value `"`value'`"`name'"' "' } c_local value: list clean value end prog EqReplaceCons args names eqlist eqlabels varlabels local skip 0 foreach v of local varlabels { if `skip' { local skip 0 continue } local vlabv `"`vlabv'`"`v'"' "' local skip 1 } 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' | `"`eq'"'=="_" continue local name: word `i' of `names' local isinvlabv: list posof `"`eq':`name'"' in vlabv if `"`name'"'=="_cons" & `isinvlabv'==0 { 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 nmodels unstack yesno indicate gettoken yes no : yesno gettoken no : no 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' `nmodels' "`unstack'" `"`macval(yes)'"' `"`macval(no)'"' `"`evars'"' local lbls `"`macval(value)'"' DropOrKeep 0 `B' `"`evars'"' 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 nmodels unstack yes no vars capt confirm matrix `B' if _rc { forv i = 1/`nmodels' { local lbls `"`macval(lbls)' `"`macval(no)'"'"' } c_local value `"`macval(lbls)'"' if `"`unstack'"'!="" { c_local eqs "_" } exit } 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)] [, NOLabel Label(str) Below ] c_local refcatbelow "`below'" c_local norefcatlabel "`nolabel'" 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 ccols var eqs label local models: coleq `B', q local models: list uniq models local col 1 foreach model of local models { foreach eq of local eqs { local eqvar `"`eq':`var'"' local row = rownumb(`B',"`eqvar'") if `B'[`row', `col']<.z { local value `"`macval(value)'`"`macval(label)'"' "' } else { local value `"`macval(value)'`""' "' } } local col = `col' + `ccols' } 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 ccols = r(ccols) local eq: roweq r(coefs), q local eq: list uniq eq if `: list sizeof eq'<=1 { c_local value 0 exit } tempname b bt mat `b' = r(coefs) 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 - `ccols' foreach model of local models { local i = `i' + `ccols' 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 append ParseEqVarlistRelax `list' QuotedRowNames `B' local coefs `"`value'"' local value local ucoefs: list uniq coefs capt confirm matrix `B' if _rc==0 { local eqs: roweq `B', q } else local eqs "_" 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'"=="" { if !("`append'"!="" & `"`x'"'!="") { 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 "`append'"!="" { local appendlist `"`appendlist' `"`x'"'"' local value `"`value' `"`x'"'"' } else 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 "`append'"!="" { local appendlist `"`appendlist' `"`eq':`x'"'"' local value `"`value' `"`eq':`x'"'"' } else if "`relax'"=="" { di as err `"coefficient `eq':`x' not found"' exit 111 } } else { local value `"`value' `vlist'"' } } if "`append'"!="" { local nappend : list sizeof appendlist if `nappend'>0 { capt confirm matrix `B' if _rc==0 { tempname tmp mat `tmp' = J(`nappend', colsof(`B'), .z) mat rown `tmp' = `appendlist' matrix `B' = `B' \ `tmp' } } } c_local value: list clean value end program ParseEqVarlistRelax syntax [anything] [, Relax ] c_local list `"`anything'"' c_local relax `relax' end program IsInString //, rclass args needle haystack local trash: subinstr local haystack `"`needle'"' "", count(local count) c_local strcount = `count' end program MakeRtfRowdefs args str srow sdetach vwidth mwidth haslc2 lc2width local factor 120 ParseRtfcmdNum `"`str'"' "trgaph" 0 ParseRtfcmdNum `"`str'"' "trleft" 0 if `vwidth'<=0 local vwidth 12 if real(`"`trgaph'"')>=. local trgaph 0 if real(`"`trleft'"')>=. local trleft 0 local swidth = 3 local vtwips = `vwidth'*`factor' local stwips = `swidth'*`factor' local ipos = `vtwips' + 2*`trgaph' + (`trleft') local brdrt "\clbrdrt\brdrw10\brdrs" local brdrb "\clbrdrb\brdrw10\brdrs" local emptycell "\pard\intbl\ql\cell" local rtfdef "\cellx`ipos'" local rtfdefbrdrt "`brdrt'\cellx`ipos'" local rtfdefbrdrb "`brdrb'\cellx`ipos'" local rtfrow "`emptycell'" if `haslc2' { if `lc2width'<=0 local lc2width 12 local lc2twips = `lc2width'*`factor' local ipos = `ipos' + `lc2twips' + 2*`trgaph' local rtfdef "`rtfdef'\cellx`ipos'" local rtfdefbrdrt "`rtfdefbrdrt'`brdrt'\cellx`ipos'" local rtfdefbrdrb "`rtfdefbrdrb'`brdrb'\cellx`ipos'" local rtfrow "`rtfrow'`emptycell'" } local j 0 local nmwidth: list sizeof mwidth foreach i of local srow { local mwidthj: word `=1 + mod(`j++',`nmwidth')' of `mwidth' if `mwidthj'<=0 local mwidthj 12 local mtwips = `mwidthj'*`factor' 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 prog ParseLabCol2 syntax [anything(equalok)] [ , Title(str asis) Width(numlist max=1 int >=0) ] c_local labcol2 `"`macval(anything)'"' c_local labcol2title `"`macval(title)'"' c_local labcol2width `"`width'"' end prog MakeMMDdef args varw labcol2 labcol2w modelw starsrow stardetachon starw if "`varw'"=="0" | "`varw'"=="" local varw 1 if "`labcol2w'"=="0" | "`labcol2w'"=="" local labcol2w 1 if "`modelw'"=="0" | "`modelw'"=="" local modelw 1 if "`starw'"=="0" | "`starw'"=="" local starw 1 local varw = max(1,`varw') local labcol2w = max(1,`labcol2w'-2) if "`stardetachon'"=="1" local starw = max(1,`starw'-2) else local starw = max(1,`starw') local mmddef `"| `:di _dup(`varw') "-"'"' if "`labcol2'"=="1" { local mmddef `"`mmddef' | :`:di _dup(`labcol2w') "-"':"' } local nmodelw: list sizeof modelw local c 0 foreach col of local starsrow { local modelwj: word `=1+mod(`c++',`nmodelw')' of `modelw' local modelwj = max(1,`modelwj'-2) local mmddef `"`mmddef' | :`:di _dup(`modelwj') "-"'"' if "`col'"=="1" { if "`stardetachon'"=="1" { local mmddef `"`mmddef': | :"' } local mmddef `"`mmddef'`:di _dup(`starw') "-"'"' } local mmddef `"`mmddef':"' } c_local value `"`mmddef' |"' end program MatrixMode, rclass capt syntax [, Matrix(str asis) e(str asis) r(str asis) rename(str asis) ] if _rc | `"`matrix'`e'`r'"'=="" { c_local matrixmode 0 exit } if ((`"`matrix'"'!="") + (`"`e'"'!="") + (`"`r'"'!=""))>1 { di as err "only one of matrix(), e(), or r() allowed" exit 198 } ParseMatrixOpt `matrix'`e'`r' if `"`e'"'!="" { local name "e(`name')" } else if `"`r'"'!="" { local name "r(`name')" } confirm matrix `name' tempname bc if "`transpose'"=="" { mat `bc' = `name'' } else { mat `bc' = `name' } QuotedRowNames `bc' local rnames `"`value'"' local eqs: roweq `bc', q mat `bc' = `bc'' local cols = colsof(`bc') local cells local space gettoken fmti fmtrest : fmt, match(par) gettoken rname rnames : rnames gettoken eq eqs : eqs forv i = 1/`cols' { if `"`fmti'"'!="" { local fmtopt `"f(`fmti') "' gettoken fmti fmtrest : fmtrest, match(par) if `"`fmti'"'=="" & `"`fmtrest'"'=="" { // recycle gettoken fmti fmtrest : fmt, match(par) } } else local fmtopt if `"`eq'"'=="_" { local lbl `"l(`"`rname'"')"' } else { local lbl `"l(`"`eq':`rname'"')"' } local cells `"`cells'`space'c`i'(`fmtopt'`lbl')"' local space " " gettoken rname rnames : rnames gettoken eq eqs : eqs } if `"`rename'"'!="" { local rename : subinstr local rename "," "", all RenameCoefs `bc' `"`rename'"' } return local names "`name'" return scalar nmodels = 1 return scalar ccols = `cols' return matrix coefs = `bc' c_local matrixmode 1 c_local cells (`cells') end program ParseMatrixOpt syntax name [, Fmt(str asis) Transpose ] c_local name `"`namelist'"' c_local fmt `"`fmt'"' c_local transpose `"`transpose'"' end