To report exponentiated coefficients (aka odds ratio in logistic regression, harzard ratio in the Cox model, incidence rate ratio, relative risk ratio), apply the eform option. Example:
. sysuse auto (1978 Automobile Data) . eststo: quietly logit foreign mpg (est1 stored) . eststo: quietly logit foreign mpg weight (est2 stored) . esttab, eform -------------------------------------------- (1) (2) foreign foreign -------------------------------------------- mpg 1.173** 0.845 (3.04) (-1.83) weight 0.996*** (-3.86) -------------------------------------------- N 74 74 -------------------------------------------- Exponentiated coefficients; t statistics in parentheses * p<0.05, ** p<0.01, *** p<0.001 . eststo clear
Note that eform also transforms the standard errors (and confidence intervals), as is illustrated bellow:
. sysuse auto (1978 Automobile Data) . quietly logit foreign mpg weight . eststo raw . eststo or . esttab raw or, se mtitles eform(0 1) -------------------------------------------- (1) (2) raw or -------------------------------------------- mpg -0.169 0.845 (0.0919) (0.0777) weight -0.00391*** 0.996*** (0.00101) (0.00101) _cons 13.71** 898396.7** (4.519) (4059591.5) -------------------------------------------- N 74 74 -------------------------------------------- Standard errors in parentheses * p<0.05, ** p<0.01, *** p<0.001 . eststo clear
The example also illustrates that, optionally, eform can be applied to selected models only. If you are interested in applying other transformations, see estout's transform() option.
Since Stata 11, margins is the preferred command to compute marginal effects (example). However, esttab and estout also support Stata's old mfx command for calculating marginal effects and elasticities. To make mfx's results available for tabulation it is essential that the model is stored after applying mfx. In esttab or estout then use the margin option to display the marginal effects. Example:
. sysuse auto (1978 Automobile Data) . generate reprec = (rep78 > 3) if rep78<. (5 missing values generated) . eststo raw: logit foreign mpg reprec Iteration 0: log likelihood = -42.400729 Iteration 1: log likelihood = -28.036843 Iteration 2: log likelihood = -27.117187 Iteration 3: log likelihood = -27.07727 Iteration 4: log likelihood = -27.07712 Logistic regression Number of obs = 69 LR chi2(2) = 30.65 Prob > chi2 = 0.0000 Log likelihood = -27.07712 Pseudo R2 = 0.3614 ------------------------------------------------------------------------------ foreign | Coef. Std. Err. z P>|z| [95% Conf. Interval] -------------+---------------------------------------------------------------- mpg | .1401865 .0653246 2.15 0.032 .0121527 .2682203 reprec | 2.649856 .7380623 3.59 0.000 1.203281 4.096432 _cons | -5.370321 1.519268 -3.53 0.000 -8.348032 -2.392611 ------------------------------------------------------------------------------ . eststo mfx: mfx Marginal effects after logit y = Pr(foreign) (predict) = .21890427 ------------------------------------------------------------------------------ variable | dy/dx Std. Err. z P>|z| [ 95% C.I. ] X ---------+-------------------------------------------------------------------- mpg | .0239698 .0121 1.98 0.048 .00026 .04768 21.2899 reprec*| .4813761 .11305 4.26 0.000 .25981 .702943 .42029 ------------------------------------------------------------------------------ (*) dy/dx is for discrete change of dummy variable from 0 to 1 . esttab, se margin mtitles -------------------------------------------- (1) (2) raw mfx -------------------------------------------- mpg 0.140* 0.0240* (0.0653) (0.0121) reprec (d) 2.650*** 0.481*** (0.738) (0.113) -------------------------------------------- N 69 69 -------------------------------------------- Marginal effects; Standard errors in parentheses (d) for discrete change of dummy variable from 0 to 1 * p<0.05, ** p<0.01, *** p<0.001 . eststo clear
The default in esttab or estout is to arrange the different equations of multiple-equation models in vertical order, as in:
. sysuse auto (1978 Automobile Data) . quietly heckman price weight, select(foreign = weight mpg) twostep . esttab, wide ----------------------------------------- (1) price ----------------------------------------- price weight 5.284*** (5.89) _cons -5925.0*** (-3.50) ----------------------------------------- foreign weight -0.00234*** (-4.13) mpg -0.104* (-2.02) _cons 8.275** (3.24) ----------------------------------------- mills lambda 104.9 (0.12) ----------------------------------------- N 74 ----------------------------------------- t statistics in parentheses * p<0.05, ** p<0.01, *** p<0.001
However, for models such as mlogit or sureg it is sometimes sensible to arrange the equations horizontally, which can be achieved through the use of the unstack option. Example:
. sysuse auto (1978 Automobile Data) . sureg (price foreign weight length) (mpg displ = foreign weight) Seemingly unrelated regression ---------------------------------------------------------------------- Equation Obs Parms RMSE "R-sq" chi2 P ---------------------------------------------------------------------- price 74 3 1967.769 0.5488 89.74 0.0000 mpg 74 2 3.337283 0.6627 145.39 0.0000 displacement 74 2 39.60002 0.8115 318.62 0.0000 ---------------------------------------------------------------------- ------------------------------------------------------------------------------ | Coef. Std. Err. z P>|z| [95% Conf. Interval] -------------+---------------------------------------------------------------- price | foreign | 3575.26 621.7961 5.75 0.000 2356.562 4793.958 weight | 5.691462 .9205043 6.18 0.000 3.887307 7.495618 length | -88.27114 31.4167 -2.81 0.005 -149.8467 -26.69554 _cons | 4506.212 3588.044 1.26 0.209 -2526.225 11538.65 -------------+---------------------------------------------------------------- mpg | foreign | -1.650029 1.053958 -1.57 0.117 -3.715748 .4156902 weight | -.0065879 .0006241 -10.56 0.000 -.007811 -.0053647 _cons | 41.6797 2.121197 19.65 0.000 37.52223 45.83717 -------------+---------------------------------------------------------------- displacement | foreign | -25.6127 12.50621 -2.05 0.041 -50.12441 -1.100984 weight | .0967549 .0074051 13.07 0.000 .0822411 .1112686 _cons | -87.23548 25.17001 -3.47 0.001 -136.5678 -37.90317 ------------------------------------------------------------------------------ . esttab, unstack scalars(r2 chi2 p) noobs nomtitle ------------------------------------------------------------ (1) price mpg displacement ------------------------------------------------------------ foreign 3575.3*** -1.650 -25.61* (5.75) (-1.57) (-2.05) weight 5.691*** -0.00659*** 0.0968*** (6.18) (-10.56) (13.07) length -88.27** (-2.81) _cons 4506.2 41.68*** -87.24*** (1.26) (19.65) (-3.47) ------------------------------------------------------------ r2 0.549 0.663 0.812 chi2 89.74 145.4 318.6 p 2.50e-19 2.68e-32 6.50e-70 ------------------------------------------------------------ t statistics in parentheses * p<0.05, ** p<0.01, *** p<0.001
Tables containing the signs of the coefficients, "significance stars", or "significant signs" (i.e. the signs of the coefficient where each sing is repeated according to significance level) can be produced as follows:
. sysuse auto (1978 Automobile Data) . eststo: regress price mpg foreign Source | SS df MS Number of obs = 74 -------------+---------------------------------- F(2, 71) = 14.07 Model | 180261702 2 90130850.8 Prob > F = 0.0000 Residual | 454803695 71 6405685.84 R-squared = 0.2838 -------------+---------------------------------- Adj R-squared = 0.2637 Total | 635065396 73 8699525.97 Root MSE = 2530.9 ------------------------------------------------------------------------------ price | Coef. Std. Err. t P>|t| [95% Conf. Interval] -------------+---------------------------------------------------------------- mpg | -294.1955 55.69172 -5.28 0.000 -405.2417 -183.1494 foreign | 1767.292 700.158 2.52 0.014 371.2169 3163.368 _cons | 11905.42 1158.634 10.28 0.000 9595.164 14215.67 ------------------------------------------------------------------------------ (est1 stored) . eststo: regress price mpg foreign weight Source | SS df MS Number of obs = 74 -------------+---------------------------------- F(3, 70) = 23.29 Model | 317252881 3 105750960 Prob > F = 0.0000 Residual | 317812515 70 4540178.78 R-squared = 0.4996 -------------+---------------------------------- Adj R-squared = 0.4781 Total | 635065396 73 8699525.97 Root MSE = 2130.8 ------------------------------------------------------------------------------ price | Coef. Std. Err. t P>|t| [95% Conf. Interval] -------------+---------------------------------------------------------------- mpg | 21.8536 74.22114 0.29 0.769 -126.1758 169.883 foreign | 3673.06 683.9783 5.37 0.000 2308.909 5037.212 weight | 3.464706 .630749 5.49 0.000 2.206717 4.722695 _cons | -5853.696 3376.987 -1.73 0.087 -12588.88 881.4934 ------------------------------------------------------------------------------ (est2 stored) . esttab, cells(_sign) nogap -------------------------------------- (1) (2) price price _sign _sign -------------------------------------- mpg - + foreign + + weight + _cons + - -------------------------------------- N 74 74 -------------------------------------- . esttab, cells(_star) nogap /// > starlevels(n.s. 1 * 0.05 ** 0.01) -------------------------------------- (1) (2) price price _star _star -------------------------------------- mpg ** n.s. foreign * ** weight ** _cons ** n.s. -------------------------------------- N 74 74 -------------------------------------- . esttab, cells(_sigsign) nogap /// > starlevels("+/-" 1 "++/--" 0.05 "+++/---" 0.01) -------------------------------------- (1) (2) price price _sigsign _sigsign -------------------------------------- mpg --- + foreign ++ +++ weight +++ _cons +++ - -------------------------------------- N 74 74 -------------------------------------- . eststo clear
Use the labcol2() option to add a column indicating the expected directions of effects according to theory:
. sysuse auto (1978 Automobile Data) . quietly regress price mpg foreign weight displ . esttab, labcol2(+ ? + -, title("" Hypothesis)) ----------------------------------------- (1) Hypothesis price ----------------------------------------- mpg + 19.08 (0.26) foreign ? 3930.2*** (5.67) weight + 2.458** (2.82) displacement - 10.22 (1.65) _cons -4846.8 (-1.43) ----------------------------------------- N 74 ----------------------------------------- t statistics in parentheses * p<0.05, ** p<0.01, *** p<0.001
To save space full output is sometimes suppressed for certain control variables and it is only indicated whether the model contains the variables or not. The indicate() in estout supports the construction of such tables:
. sysuse auto (1978 Automobile Data) . eststo: quietly regress price mpg foreign (est1 stored) . eststo: xi: quietly regress price mpg foreign i.rep78 i.rep78 _Irep78_1-5 (naturally coded; _Irep78_1 omitted) (est2 stored) . esttab, indicate(rep dummies = _Irep78*) -------------------------------------------- (1) (2) price price -------------------------------------------- mpg -294.2*** -299.6*** (-5.28) (-4.73) foreign 1767.3* 1102.3 (2.52) (1.22) _cons 11905.4*** 10856.2*** (10.28) (4.79) rep dummies No Yes -------------------------------------------- N 74 69 -------------------------------------------- t statistics in parentheses * p<0.05, ** p<0.01, *** p<0.001 . eststo clear
indicate() prints its information at the bottom of the main body of the table containing the coefficients. If you want to include the information in the table footer, then use the following approach:
. sysuse auto (1978 Automobile Data) . eststo: quietly regress price mpg foreign (est1 stored) . estadd local hasrep "No" added macro: e(hasrep) : "No" . eststo: xi: quietly regress price mpg foreign i.rep78 i.rep78 _Irep78_1-5 (naturally coded; _Irep78_1 omitted) (est2 stored) . estadd local hasrep "Yes" added macro: e(hasrep) : "Yes" . esttab, drop(_Irep78*) scalars("hasrep rep dummies") -------------------------------------------- (1) (2) price price -------------------------------------------- mpg -294.2*** -299.6*** (-5.28) (-4.73) foreign 1767.3* 1102.3 (2.52) (1.22) _cons 11905.4*** 10856.2*** (10.28) (4.79) -------------------------------------------- N 74 69 rep dummies No Yes -------------------------------------------- t statistics in parentheses * p<0.05, ** p<0.01, *** p<0.001 . eststo clear
Use the refcat() option to add a table row containing the (omitted) reference category of a categorical variable. Example:
. sysuse cancer (Patient Survival in Drug Trial) . stset studytime, failure(died) failure event: died != 0 & died < . obs. time interval: (0, studytime] exit on or before: failure ------------------------------------------------------------------------------ 48 total observations 0 exclusions ------------------------------------------------------------------------------ 48 observations remaining, representing 31 failures in single-record/single-failure data 744 total analysis time at risk and under observation at risk from t = 0 earliest observed entry t = 0 last observed exit t = 39 . xi: stcox age i.drug, nolog i.drug _Idrug_1-3 (naturally coded; _Idrug_1 omitted) failure _d: died analysis time _t: studytime Cox regression -- Breslow method for ties No. of subjects = 48 Number of obs = 48 No. of failures = 31 Time at risk = 744 LR chi2(3) = 36.52 Log likelihood = -81.652567 Prob > chi2 = 0.0000 ------------------------------------------------------------------------------ _t | Haz. Ratio Std. Err. z P>|z| [95% Conf. Interval] -------------+---------------------------------------------------------------- age | 1.118334 .0409074 3.06 0.002 1.040963 1.201455 _Idrug_2 | .1805839 .0892742 -3.46 0.001 .0685292 .4758636 _Idrug_3 | .0520066 .034103 -4.51 0.000 .0143843 .1880305 ------------------------------------------------------------------------------ . lab var _Idrug_2 "Tadalafil" . lab var _Idrug_3 "Sildenafil" . esttab, eform wide label nostar refcat(_Idrug_2 "Placebo") ---------------------------------------------- (1) analysis t~s ---------------------------------------------- Patient's age at s.. 1.118 (3.06) Placebo ref. Tadalafil 0.181 (-3.46) Sildenafil 0.0520 (-4.51) ---------------------------------------------- Observations 48 ---------------------------------------------- Exponentiated coefficients; t statistics in parentheses . esttab, eform wide label nostar refcat(_Idrug_2 "Placebo", label(1)) ---------------------------------------------- (1) analysis t~s ---------------------------------------------- Patient's age at s.. 1.118 (3.06) Placebo 1 Tadalafil 0.181 (-3.46) Sildenafil 0.0520 (-4.51) ---------------------------------------------- Observations 48 ---------------------------------------------- Exponentiated coefficients; t statistics in parentheses
The refcat() option is designed to include information on the (omitted) reference category of a categorical variable (see above), but it can also be used to include extra rows in the table containing subtitles or other information. Example:
. sysuse auto (1978 Automobile Data) . regress price weight mpg turn foreign Source | SS df MS Number of obs = 74 -------------+---------------------------------- F(4, 69) = 19.23 Model | 334771309 4 83692827.3 Prob > F = 0.0000 Residual | 300294087 69 4352088.22 R-squared = 0.5271 -------------+---------------------------------- Adj R-squared = 0.4997 Total | 635065396 73 8699525.97 Root MSE = 2086.2 ------------------------------------------------------------------------------ price | Coef. Std. Err. t P>|t| [95% Conf. Interval] -------------+---------------------------------------------------------------- weight | 4.284532 .7404967 5.79 0.000 2.807282 5.761783 mpg | -.4660076 73.51407 -0.01 0.995 -147.1226 146.1905 turn | -229.2059 114.2423 -2.01 0.049 -457.1131 -1.298676 foreign | 3221.415 706.4847 4.56 0.000 1812.017 4630.813 _cons | 1368.197 4887.597 0.28 0.780 -8382.292 11118.69 ------------------------------------------------------------------------------ . foreach v of varlist weight mpg turn foreign { 2. label variable `v' `"- `: variable label `v''"' 3. } . esttab, refcat(weight "Main effects:" turn "Controls:", nolabel) wide label ------------------------------------------------- (1) Price ------------------------------------------------- Main effects: - Weight (lbs.) 4.285*** (5.79) - Mileage (mpg) -0.466 (-0.01) Controls: - Turn Circle (ft.) -229.2* (-2.01) - Car type 3221.4*** (4.56) Constant 1368.2 (0.28) ------------------------------------------------- Observations 74 ------------------------------------------------- t statistics in parentheses * p<0.05, ** p<0.01, *** p<0.001
Rename coefficients using the rename() option before matching the models and equations to merge different coefficients into the same table row. Example:
. sysuse auto (1978 Automobile Data) . set seed 123 . generate altmpg = invnorm(uniform()) . eststo: quietly regress price weight mpg (est1 stored) . eststo: quietly regress price weight altmpg (est2 stored) . esttab -------------------------------------------- (1) (2) price price -------------------------------------------- weight 1.747** 2.037*** (2.72) (5.36) mpg -49.51 (-0.57) altmpg -73.94 (-0.29) _cons 1946.1 6.433 (0.54) (0.01) -------------------------------------------- N 74 74 -------------------------------------------- t statistics in parentheses * p<0.05, ** p<0.01, *** p<0.001 . esttab, rename(altmpg mpg) -------------------------------------------- (1) (2) price price -------------------------------------------- weight 1.747** 2.037*** (2.72) (5.36) mpg -49.51 -73.94 (-0.57) (-0.29) _cons 1946.1 6.433 (0.54) (0.01) -------------------------------------------- N 74 74 -------------------------------------------- t statistics in parentheses * p<0.05, ** p<0.01, *** p<0.001 . eststo clear
If you want to produce a table that only contains the summary statistics of the models, but no coefficients, add cells(none) to the command:
. sysuse auto (1978 Automobile Data) . eststo: quietly regress price weight mpg (est1 stored) . eststo: quietly regress price weight mpg foreign (est2 stored) . esttab, cells(none) scalars(rank r2 r2_a bic aic) nomtitles -------------------------------------- (1) (2) -------------------------------------- N 74 74 rank 3 4 r2 0.293 0.500 r2_a 0.273 0.478 bic 1378.6 1357.4 aic 1371.7 1348.2 -------------------------------------- . eststo clear
The estadd's lrtest subcommand may be used to add results from likelihood-ratio tests as follows:
. sysuse auto (1978 Automobile Data) . eststo A: quietly logit foreign weight . eststo B: quietly logit foreign weight mpg price . estadd lrtest A Likelihood-ratio test LR chi2(2) = 23.78 (Assumption: A nested in .) Prob > chi2 = 0.0000 added scalars: e(lrtest_p) = 6.844e-06 e(lrtest_chi2) = 23.784217 e(lrtest_df) = 2 . esttab, scalars(lrtest_chi2 lrtest_df lrtest_p) -------------------------------------------- (1) (2) foreign foreign -------------------------------------------- weight -0.00259*** -0.00685*** (-4.25) (-3.43) mpg -0.121 (-1.27) price 0.000926** (3.01) _cons 6.283*** 14.42** (3.92) (2.66) -------------------------------------------- N 74 74 lrtest_chi2 23.78 lrtest_df 2 lrtest_p 0.00000684 -------------------------------------------- t statistics in parentheses * p<0.05, ** p<0.01, *** p<0.001 . eststo clear
The default in estout and esttab is to print the scalar summary statistics in the table footer in separate rows beneath one another (in each model's first column). Use the layout() suboption in the stats() option to rearrange the statistics. The option allows you to place the statistics in separate columns beside one another or also to combine multiple statistics in one table cell (see below). Here is an example:
. sysuse auto (1978 Automobile Data) . eststo: quietly regress price weight (est1 stored) . eststo: quietly regress price weight foreign (est2 stored) . esttab, p wide nopar label /// > stats(F p N, layout("@ @" @) fmt(a3 3 a3) /// > labels("F statistic" "Observations")) ------------------------------------------------------------------------------ (1) (2) Price Price ------------------------------------------------------------------------------ Weight (lbs.) 2.044*** 0.000 3.321*** 0.000 Car type 3637.0*** 0.000 Constant -6.707 0.995 -4942.8*** 0.000 ------------------------------------------------------------------------------ F statistic 29.42 0.000 35.35 0.000 Observations 74 74 ------------------------------------------------------------------------------ p-values in second column * p<0.05, ** p<0.01, *** p<0.001 . eststo clear
In the layout() suboption, the "@" character is used as a placeholder for the statistics, one after another. Statistics to be printed in the same row have to be enclosed in quotes.
The syntax for combining multiple summary statistics in one table cell is a bit clumsy, as is illustrated in the following example. The cell definition has to be enclosed in double quotes in the example because it contains a blank, and a set of compound double quotes is needed to mark off the row definition.
. sysuse auto (1978 Automobile Data) . eststo: quietly logit foreign weight mpg (est1 stored) . eststo: quietly logit foreign weight mpg turn displ (est2 stored) . esttab, stats(chi2 df_m r2_p N, layout(`""@ (@)""' @ @)) -------------------------------------------- (1) (2) foreign foreign -------------------------------------------- weight -0.00391*** 0.00239 (-3.86) (0.99) mpg -0.169 -0.196* (-1.83) (-2.07) turn -0.502* (-2.28) displacement -0.0769* (-2.06) _cons 13.71** 26.95** (3.03) (3.00) -------------------------------------------- chi2 (df_m) 35.72 (2) 55.82 (4) r2_p 0.397 0.620 N 74 74 -------------------------------------------- t statistics in parentheses * p<0.05, ** p<0.01, *** p<0.001 . eststo clear
Note that in this example the layout definition could be simplified to layout(`""@ (@)""') without changing the result.
The factor command does not return e(b) and e(V), which makes tabulation less obvious. For example, the factor loadings are returned in matrix e(L) and the unique variances are returned in e(Psi):
. webuse bg2 (Physician-cost data) . factor bg2cost1-bg2cost6 (obs=568) Factor analysis/correlation Number of obs = 568 Method: principal factors Retained factors = 3 Rotation: (unrotated) Number of params = 15 -------------------------------------------------------------------------- Factor | Eigenvalue Difference Proportion Cumulative -------------+------------------------------------------------------------ Factor1 | 0.85389 0.31282 1.0310 1.0310 Factor2 | 0.54107 0.51786 0.6533 1.6844 Factor3 | 0.02321 0.17288 0.0280 1.7124 Factor4 | -0.14967 0.03951 -0.1807 1.5317 Factor5 | -0.18918 0.06197 -0.2284 1.3033 Factor6 | -0.25115 . -0.3033 1.0000 -------------------------------------------------------------------------- LR test: independent vs. saturated: chi2(15) = 269.07 Prob>chi2 = 0.0000 Factor loadings (pattern matrix) and unique variances ----------------------------------------------------------- Variable | Factor1 Factor2 Factor3 | Uniqueness -------------+------------------------------+-------------- bg2cost1 | 0.2470 0.3670 -0.0446 | 0.8023 bg2cost2 | -0.3374 0.3321 -0.0772 | 0.7699 bg2cost3 | -0.3764 0.3756 0.0204 | 0.7169 bg2cost4 | -0.3221 0.1942 0.1034 | 0.8479 bg2cost5 | 0.4550 0.2479 0.0641 | 0.7274 bg2cost6 | 0.4760 0.2364 -0.0068 | 0.7175 ----------------------------------------------------------- . ereturn list scalars: e(f) = 3 e(N) = 568 e(df_m) = 15 e(df_r) = 0 e(chi2_i) = 269.0736870812582 e(df_i) = 15 e(p_i) = 1.43900835150e-48 e(evsum) = .8281790835746108 macros: e(cmdline) : "factor bg2cost1-bg2cost6" e(cmd) : "factor" e(marginsnotok) : "_ALL" e(properties) : "nob noV eigen" e(title) : "Factor analysis" e(predict) : "factor_p" e(estat_cmd) : "factor_estat" e(rotate_cmd) : "factor_rotate" e(rngstate) : "Xf7c401e15990e0b6a8f6684aaee21b8f000126c0" e(mtitle) : "principal factors" e(method) : "pf" matrices: e(sds) : 1 x 6 e(means) : 1 x 6 e(C) : 6 x 6 e(Phi) : 3 x 3 e(L) : 6 x 3 e(Psi) : 1 x 6 e(Ev) : 1 x 6 functions: e(sample) . matrix list e(L) e(L)[6,3] Factor1 Factor2 Factor3 bg2cost1 .24704957 .36703122 -.04457883 bg2cost2 -.33741222 .33210838 -.07721559 bg2cost3 -.37640773 .3755668 .02035389 bg2cost4 -.32206954 .1941843 .10341942 bg2cost5 .45501598 .24785063 .06407803 bg2cost6 .47598434 .23638092 -.0067801 . matrix list e(Psi) e(Psi)[1,6] bg2cost1 bg2cost2 bg2cost3 bg2cost4 bg2cost5 bg2cost6 Uniqueness .80226732 .76989477 .71685252 .84786809 .72742453 .717517
The simplest way to tabulate the factor loadings is to type:
. esttab e(L) --------------------------------------------------- e(L) Factor1 Factor2 Factor3 --------------------------------------------------- bg2cost1 .2470496 .3670312 -.0445788 bg2cost2 -.3374122 .3321084 -.0772156 bg2cost3 -.3764077 .3755668 .0203539 bg2cost4 -.3220695 .1941843 .1034194 bg2cost5 .455016 .2478506 .064078 bg2cost6 .4759843 .2363809 -.0067801 ---------------------------------------------------
Reproducing the factor loadings table including the unique variances is more involved. The single factors in e(L) have to be addressed individually. For example, type:
. esttab, /// > cells("L[1](transpose) L[2](transpose) L[3](transpose) Psi") /// > nogap noobs nonumber nomtitle ---------------------------------------------------------------- L[1] L[2] L[3] Psi ---------------------------------------------------------------- bg2cost1 .2470496 .3670312 -.0445788 .8022673 bg2cost2 -.3374122 .3321084 -.0772156 .7698948 bg2cost3 -.3764077 .3755668 .0203539 .7168525 bg2cost4 -.3220695 .1941843 .1034194 .8478681 bg2cost5 .455016 .2478506 .064078 .7274245 bg2cost6 .4759843 .2363809 -.0067801 .717517 ----------------------------------------------------------------
The transpose suboption is required since the factors are in the columns of e(L) and, by default, e()-matrices are read row-wise (transpose can be abbreviated to t). Hence, L[#](transpose) refers to the #th column of e(L).
The label() suboption can be used to add labels, for example:
. esttab, /// > cells("L[1](t label(Factor 1)) L[2](t) L[3](t) Psi") /// > nogap noobs nonumber nomtitle ---------------------------------------------------------------- Factor 1 L[2] L[3] Psi ---------------------------------------------------------------- bg2cost1 .2470496 .3670312 -.0445788 .8022673 bg2cost2 -.3374122 .3321084 -.0772156 .7698948 bg2cost3 -.3764077 .3755668 .0203539 .7168525 bg2cost4 -.3220695 .1941843 .1034194 .8478681 bg2cost5 .455016 .2478506 .064078 .7274245 bg2cost6 .4759843 .2363809 -.0067801 .717517 ----------------------------------------------------------------
Alternatively, you can also use syntax el[name], where name refers to the name of the row to be tabulated (or column if transpose is specified) and also sets the label:
. esttab, /// > cells("L[Factor1](t) L[Factor2](t) L[Factor3](t) Psi[Uniqueness]") /// > nogap noobs nonumber nomtitle ---------------------------------------------------------------- Factor1 Factor2 Factor3 Uniqueness ---------------------------------------------------------------- bg2cost1 .2470496 .3670312 -.0445788 .8022673 bg2cost2 -.3374122 .3321084 -.0772156 .7698948 bg2cost3 -.3764077 .3755668 .0203539 .7168525 bg2cost4 -.3220695 .1941843 .1034194 .8478681 bg2cost5 .455016 .2478506 .064078 .7274245 bg2cost6 .4759843 .2363809 -.0067801 .717517 ----------------------------------------------------------------
Tables of ologit or oprobit look somewhat complicated in Stata 9 or newer since each cutoff is stored in its own equation. To clean out the table, specify eqlabels(none):
. sysuse auto (1978 Automobile Data) . ologit rep mpg foreign Iteration 0: log likelihood = -93.692061 Iteration 1: log likelihood = -78.844995 Iteration 2: log likelihood = -78.106784 Iteration 3: log likelihood = -78.08927 Iteration 4: log likelihood = -78.089242 Ordered logistic regression Number of obs = 69 LR chi2(2) = 31.21 Prob > chi2 = 0.0000 Log likelihood = -78.089242 Pseudo R2 = 0.1665 ------------------------------------------------------------------------------ rep78 | Coef. Std. Err. z P>|z| [95% Conf. Interval] -------------+---------------------------------------------------------------- mpg | .0672774 .0494465 1.36 0.174 -.029636 .1641908 foreign | 2.599085 .6745627 3.85 0.000 1.276966 3.921204 -------------+---------------------------------------------------------------- /cut1 | -1.885212 1.175719 -4.189579 .4191555 /cut2 | -.0922328 .9934139 -2.039288 1.854823 /cut3 | 2.524538 1.021289 .5228488 4.526228 /cut4 | 4.580877 1.146847 2.333098 6.828657 ------------------------------------------------------------------------------ . esttab, wide ----------------------------------------- (1) rep78 ----------------------------------------- rep78 mpg 0.0673 (1.36) foreign 2.599*** (3.85) ----------------------------------------- cut1 _cons -1.885 (-1.60) ----------------------------------------- cut2 _cons -0.0922 (-0.09) ----------------------------------------- cut3 _cons 2.525* (2.47) ----------------------------------------- cut4 _cons 4.581*** (3.99) ----------------------------------------- N 69 ----------------------------------------- t statistics in parentheses * p<0.05, ** p<0.01, *** p<0.001 . esttab, wide eqlabels(none) ----------------------------------------- (1) rep78 ----------------------------------------- mpg 0.0673 (1.36) foreign 2.599*** (3.85) cut1 -1.885 (-1.60) cut2 -0.0922 (-0.09) cut3 2.525* (2.47) cut4 4.581*** (3.99) ----------------------------------------- N 69 ----------------------------------------- t statistics in parentheses * p<0.05, ** p<0.01, *** p<0.001
To print a line between the main part of the table and the cutoffs, type:
. esttab, wide eqlabels(none) /// > varlabels(,blist(cut1:_cons "{hline @width}{break}")) ----------------------------------------- (1) rep78 ----------------------------------------- mpg 0.0673 (1.36) foreign 2.599*** (3.85) ----------------------------------------- cut1 -1.885 (-1.60) cut2 -0.0922 (-0.09) cut3 2.525* (2.47) cut4 4.581*** (3.99) ----------------------------------------- N 69 ----------------------------------------- t statistics in parentheses * p<0.05, ** p<0.01, *** p<0.001
Furthermore, to suppress significance stars and standard errors for the cutoffs, type:
. esttab, cells("b(fmt(a3) star) se(drop(cut*:))") /// > stardrop(cut*:) eqlabels(none) /// > varlabels(,blist(cut1:_cons "{hline @width}{break}")) ----------------------------------------- (1) rep78 b se ----------------------------------------- mpg 0.0673 0.0494 foreign 2.599*** 0.675 ----------------------------------------- cut1 -1.885 cut2 -0.0922 cut3 2.525 cut4 4.581 ----------------------------------------- N 69 -----------------------------------------
To tabulate the marginal effects for all outcomes after mlogit it is necessary to store several sets of results from margins. Example:
. sysuse auto (1978 Automobile Data) . replace price = price / 1000 variable price was int now float (74 real changes made) . replace weight = weight / 1000 variable weight was int now float (74 real changes made) . quietly mlogit rep78 price mpg foreign if rep78>=3, nolog . eststo mlogit . foreach o in 3 4 5 { 2. quietly margins, dydx(*) predict(outcome(`o')) post 3. eststo, title(Outcome `o') 4. estimates restore mlogit 5. } (est2 stored) (results mlogit are active now) (est3 stored) (results mlogit are active now) (est4 stored) (results mlogit are active now) . eststo drop mlogit (mlogit dropped) . esttab, noobs se nostar mtitles nonumbers title(Average Marginal Effects) Average Marginal Effects --------------------------------------------------- Outcome 3 Outcome 4 Outcome 5 --------------------------------------------------- price -0.00245 -0.0163 0.0188 (0.0213) (0.0251) (0.0176) mpg -0.0118 -0.00802 0.0198 (0.0122) (0.0126) (0.00770) foreign -0.396 0.223 0.173 (0.0884) (0.116) (0.0754) --------------------------------------------------- Standard errors in parentheses . eststo clear
Variance parameters are returned by xtmixed as logarithms of standard deviations in e(b). To tabulate the parameters as standard deviations, back-transform them using the transform() option. Example:
. webuse pig (Longitudinal analysis of pig weights) . xtmixed weight week || id: week Performing EM optimization: Performing gradient-based optimization: Iteration 0: log restricted-likelihood = -870.51473 Iteration 1: log restricted-likelihood = -870.51473 Computing standard errors: Mixed-effects REML regression Number of obs = 432 Group variable: id Number of groups = 48 Obs per group: min = 9 avg = 9.0 max = 9 Wald chi2(1) = 4592.10 Log restricted-likelihood = -870.51473 Prob > chi2 = 0.0000 ------------------------------------------------------------------------------ weight | Coef. Std. Err. z P>|z| [95% Conf. Interval] -------------+---------------------------------------------------------------- week | 6.209896 .0916386 67.77 0.000 6.030287 6.389504 _cons | 19.35561 .4021142 48.13 0.000 18.56748 20.14374 ------------------------------------------------------------------------------ ------------------------------------------------------------------------------ Random-effects Parameters | Estimate Std. Err. [95% Conf. Interval] -----------------------------+------------------------------------------------ id: Independent | sd(week) | .6135471 .0673971 .4947035 .7609409 sd(_cons) | 2.630132 .302883 2.098719 3.296105 -----------------------------+------------------------------------------------ sd(Residual) | 1.26443 .0487971 1.172317 1.363781 ------------------------------------------------------------------------------ LR test vs. linear model: chi2(2) = 765.92 Prob > chi2 = 0.0000 Note: LR test is conservative and provided only for reference. . esttab, se wide nostar transform(ln*: exp(@) exp(@)) -------------------------------------- (1) weight -------------------------------------- weight week 6.210 (0.0916) _cons 19.36 (0.402) -------------------------------------- lns1_1_1 _cons 0.614 (0.0674) -------------------------------------- lns1_1_2 _cons 2.630 (0.303) -------------------------------------- lnsig_e _cons 1.264 (0.0488) -------------------------------------- N 432 -------------------------------------- Standard errors in parentheses . esttab, se wide nostar transform(ln*: exp(@) exp(@)) /// > eqlabels("" "sd(week)" "sd(_cons)" "sd(Residual)", none) /// > varlabels(,elist(weight:_cons "{break}{hline @width}")) /// > varwidth(13) --------------------------------------- (1) weight --------------------------------------- week 6.210 (0.0916) _cons 19.36 (0.402) --------------------------------------- sd(week) 0.614 (0.0674) sd(_cons) 2.630 (0.303) sd(Residual) 1.264 (0.0488) --------------------------------------- N 432 --------------------------------------- Standard errors in parentheses
(Note that in transform() you also have to include the function's first derivative, which is required for the standard errors. The example above might be confusing because the first derivative of exp(x) is simply exp(x). See below for examples where the two differ.)
Similarly, to display the parameters as variances, type:
. xtmixed, variance Mixed-effects REML regression Number of obs = 432 Group variable: id Number of groups = 48 Obs per group: min = 9 avg = 9.0 max = 9 Wald chi2(1) = 4592.10 Log restricted-likelihood = -870.51473 Prob > chi2 = 0.0000 ------------------------------------------------------------------------------ weight | Coef. Std. Err. z P>|z| [95% Conf. Interval] -------------+---------------------------------------------------------------- week | 6.209896 .0916386 67.77 0.000 6.030287 6.389504 _cons | 19.35561 .4021142 48.13 0.000 18.56748 20.14374 ------------------------------------------------------------------------------ ------------------------------------------------------------------------------ Random-effects Parameters | Estimate Std. Err. [95% Conf. Interval] -----------------------------+------------------------------------------------ id: Independent | var(week) | .3764401 .0827025 .2447315 .579031 var(_cons) | 6.917597 1.593245 4.40462 10.86431 -----------------------------+------------------------------------------------ var(Residual) | 1.598784 .1234011 1.374328 1.859899 ------------------------------------------------------------------------------ LR test vs. linear model: chi2(2) = 765.92 Prob > chi2 = 0.0000 Note: LR test is conservative and provided only for reference. . esttab, se wide nostar transform(ln*: exp(2*@) 2*exp(2*@)) /// > eqlabels("" "var(week)" "var(_cons)" "var(Residual)", none) /// > varlabels(,elist(weight:_cons "{break}{hline @width}")) /// > varwidth(13) --------------------------------------- (1) weight --------------------------------------- week 6.210 (0.0916) _cons 19.36 (0.402) --------------------------------------- var(week) 0.376 (0.0827) var(_cons) 6.918 (1.593) var(Residual) 1.599 (0.123) --------------------------------------- N 432 --------------------------------------- Standard errors in parentheses
If the model also has covariance terms, these are returned as arc-hyperbolic tangents of correlations in e(b) and can be back-transformed to correlations using Stata's tanh() function. Example:
. xtmixed weight week || id: week, covariance(unstructured) Performing EM optimization: Performing gradient-based optimization: Iteration 0: log restricted-likelihood = -870.43562 Iteration 1: log restricted-likelihood = -870.43562 Computing standard errors: Mixed-effects REML regression Number of obs = 432 Group variable: id Number of groups = 48 Obs per group: min = 9 avg = 9.0 max = 9 Wald chi2(1) = 4552.31 Log restricted-likelihood = -870.43562 Prob > chi2 = 0.0000 ------------------------------------------------------------------------------ weight | Coef. Std. Err. z P>|z| [95% Conf. Interval] -------------+---------------------------------------------------------------- week | 6.209896 .0920382 67.47 0.000 6.029504 6.390287 _cons | 19.35561 .4038677 47.93 0.000 18.56405 20.14718 ------------------------------------------------------------------------------ ------------------------------------------------------------------------------ Random-effects Parameters | Estimate Std. Err. [95% Conf. Interval] -----------------------------+------------------------------------------------ id: Unstructured | sd(week) | .6164379 .0680541 .4964981 .7653519 sd(_cons) | 2.643192 .3057584 2.106996 3.315842 corr(week,_cons) | -.0634377 .158876 -.3593789 .2440973 -----------------------------+------------------------------------------------ sd(Residual) | 1.263657 .0487466 1.171638 1.362903 ------------------------------------------------------------------------------ LR test vs. linear model: chi2(3) = 766.07 Prob > chi2 = 0.0000 Note: LR test is conservative and provided only for reference. . esttab, se wide nostar /// > transform(ln*: exp(@) exp(@) at*: tanh(@) (1-tanh(@)^2)) /// > eqlabels("" "sd(week)" "sd(_cons)" "corr(week,_cons)" "sd(Residual)", /// > none) /// > varlabels(,elist(weight:_cons "{break}{hline @width}")) /// > varwidth(16) ------------------------------------------ (1) weight ------------------------------------------ week 6.210 (0.0920) _cons 19.36 (0.404) ------------------------------------------ sd(week) 0.616 (0.0681) sd(_cons) 2.643 (0.306) corr(week,_cons) -0.0634 (0.159) sd(Residual) 1.264 (0.0487) ------------------------------------------ N 432 ------------------------------------------ Standard errors in parentheses
Unfortunately, it is not possible for transform() to turn such correlations into covariances (requires multiplication by the standard deviations). However, you can use estadd to manually compute the terms in advance and add them in the footer of the table. Example:
. xtmixed, variance Mixed-effects REML regression Number of obs = 432 Group variable: id Number of groups = 48 Obs per group: min = 9 avg = 9.0 max = 9 Wald chi2(1) = 4552.31 Log restricted-likelihood = -870.43562 Prob > chi2 = 0.0000 ------------------------------------------------------------------------------ weight | Coef. Std. Err. z P>|z| [95% Conf. Interval] -------------+---------------------------------------------------------------- week | 6.209896 .0920382 67.47 0.000 6.029504 6.390287 _cons | 19.35561 .4038677 47.93 0.000 18.56405 20.14718 ------------------------------------------------------------------------------ ------------------------------------------------------------------------------ Random-effects Parameters | Estimate Std. Err. [95% Conf. Interval] -----------------------------+------------------------------------------------ id: Unstructured | var(week) | .3799957 .0839023 .2465103 .5857635 var(_cons) | 6.986465 1.616357 4.439432 10.99481 cov(week,_cons) | -.1033632 .2627309 -.6183063 .41158 -----------------------------+------------------------------------------------ var(Residual) | 1.596829 .1231981 1.372736 1.857506 ------------------------------------------------------------------------------ LR test vs. linear model: chi2(3) = 766.07 Prob > chi2 = 0.0000 Note: LR test is conservative and provided only for reference. . mat list e(b) e(b)[1,6] weight: weight: lns1_1_1: lns1_1_2: atr1_1_1_2: week _cons _cons _cons _cons y1 6.2098958 19.355613 -.48379761 .97198734 -.06352304 lnsig_e: _cons y1 .23401004 . estadd scalar v1 = exp(2*[lns1_1_1]_b[_cons]) added scalar: e(v1) = .37999574 . estadd scalar v2 = exp(2*[lns1_1_2]_b[_cons]) added scalar: e(v2) = 6.9864649 . estadd scalar cov = tanh([atr1_1_1_2]_b[_cons]) /// > * exp([lns1_1_1]_b[_cons]) /// > * exp([lns1_1_2]_b[_cons]) added scalar: e(cov) = -.10336316 . estadd scalar v_e = exp(2*[lnsig_e]_b[_cons]) added scalar: e(v_e) = 1.5968295 . esttab, se wide nostar keep(weight:) obslast /// > scalars("v1 var(week)" "v2 var(_cons)" /// > "cov cov(week,_cons)" "v_e var(Residual)") /// > eqlabels(none) varwidth(15) ----------------------------------------- (1) weight ----------------------------------------- week 6.210 (0.0920) _cons 19.36 (0.404) ----------------------------------------- var(week) 0.380 var(_cons) 6.986 cov(week,_cons) -0.103 var(Residual) 1.597 N 432 ----------------------------------------- Standard errors in parentheses
. sysuse auto (1978 Automobile Data) . eststo: quietly reg weight mpg (est1 stored) . eststo: quietly reg weight mpg foreign (est2 stored) . eststo: quietly reg price weight mpg (est3 stored) . eststo: quietly reg price weight mpg foreign (est4 stored) . esttab using example.tex, booktabs label /// > mgroups(A B, pattern(1 0 1 0) /// > prefix(\multicolumn{@span}{c}{) suffix(}) /// > span erepeat(\cmidrule(lr){@span})) /// > alignment(D{.}{.}{-1}) page(dcolumn) nonumber (output written to example.tex) . eststo clear
Result:
[estpost supersedes this example. See "Post summary statistics (summarize)" or "Post summary statistics (tabstat)" under "Examples for estpost".]
Research papers usually contain a table displaying the descriptive statistics for all variables in the analysis. The following example illustrates how such a table can be produced using estadd summ and esttab. Assume, your analysis uses price as the dependent variable and weight, mpg, and foreign as independent variables. To create a descriptives table including all four variables, type:
. sysuse auto (1978 Automobile Data) . generate y = uniform() . quietly regress y price weight mpg foreign, noconstant . estadd summ added matrices: e(sd) : 1 x 4 e(max) : 1 x 4 e(min) : 1 x 4 e(mean) : 1 x 4 . esttab, cells("mean sd min max") nogap nomtitle nonumber ---------------------------------------------------------------- mean sd min max ---------------------------------------------------------------- price 6165.257 2949.496 3291 15906 weight 3019.459 777.1936 1760 4840 mpg 21.2973 5.785503 12 41 foreign .2972973 .4601885 0 1 ---------------------------------------------------------------- N 74 ----------------------------------------------------------------
The trick is to generate a fake variable and regress it on all involved variables, including the dependent variable.
[estpost supersedes this example. See "Post summary statistics by subgroups (summarize)" or "Post summary statistics by subgroups (tabstat)" under "Examples for estpost".]
A table of descriptive statistics by subgroups can easily be produced using by and eststo:
. sysuse auto (1978 Automobile Data) . generate y = uniform() . by foreign: eststo: quietly regress y price weight mpg, nocons ------------------------------------------------------------------------------- -> Domestic (est1 stored) ------------------------------------------------------------------------------- -> Foreign (est2 stored) . estadd summ : * . esttab, main(mean) aux(sd) label nodepvar nostar nonote ---------------------------------------------- (1) (2) Domestic Foreign ---------------------------------------------- Price 6072.4 6384.7 (3097.1) (2621.9) Weight (lbs.) 3317.1 2315.9 (695.4) (433.0) Mileage (mpg) 19.83 24.77 (4.743) (6.611) ---------------------------------------------- Observations 52 22 ---------------------------------------------- . eststo clear
[estpost supersedes this example. See "Post results from two-sample mean-comparison tests (ttest)" under "Examples for estpost".]
Basically anything can be tabulated by estout or esttab once it is posted in e(). Here is an example with t-tests:
. capt prog drop myttests . *! version 1.0.0 14aug2007 Ben Jann . program myttests, eclass 1. version 8 2. syntax varlist [if] [in], by(varname) [ * ] 3. marksample touse 4. markout `touse' `by' 5. tempname mu_1 mu_2 d d_se d_t d_p 6. foreach var of local varlist { 7. qui ttest `var' if `touse', by(`by') `options' 8. mat `mu_1' = nullmat(`mu_1'), r(mu_1) 9. mat `mu_2' = nullmat(`mu_2'), r(mu_2) 10. mat `d' = nullmat(`d' ), r(mu_1)-r(mu_2) 11. mat `d_se' = nullmat(`d_se'), r(se) 12. mat `d_t' = nullmat(`d_t' ), r(t) 13. mat `d_p' = nullmat(`d_p' ), r(p) 14. } 15. foreach mat in mu_1 mu_2 d d_se d_t d_p { 16. mat coln ``mat'' = `varlist' 17. } 18. tempname b V 19. mat `b' = `mu_1'*0 20. mat `V' = `b''*`b' 21. eret post `b' `V' 22. eret local cmd "myttests" 23. foreach mat in mu_1 mu_2 d d_se d_t d_p { 24. eret mat `mat' = ``mat'' 25. } 26. end . sysuse auto (1978 Automobile Data) . myttests price weight mpg, by(foreign) . ereturn list macros: e(cmd) : "myttests" e(properties) : "b V" matrices: e(b) : 1 x 3 e(V) : 3 x 3 e(d_p) : 1 x 3 e(d_t) : 1 x 3 e(d_se) : 1 x 3 e(d) : 1 x 3 e(mu_2) : 1 x 3 e(mu_1) : 1 x 3 . esttab, nomtitle nonumbers noobs /// > cells("mu_1(fmt(a3)) mu_2 d(star pvalue(d_p))" ". . d_se(par)") ------------------------------------------------------ mu_1 mu_2 d/d_se ------------------------------------------------------ price 6072.4 6384.7 -312.3 (754.4) weight 3317.1 2315.9 1001.2*** (160.3) mpg 19.83 24.77 -4.946*** (1.362) ------------------------------------------------------
(An alternative approach would be to save three sets of estimates, one for each group, and one for the differences.)
[estpost supersedes this example. See "Post a one-way frequency table (tabulate)" and "Post a two-way frequency table (tabulate)" under "Examples for estpost".]
With a little programming you could even do frequency tables in estout. Here is an example for a one-way table:
. capt prog drop e_tabulate . *! version 1.0.0 24sep2007 Ben Jann . prog e_tabulate, eclass 1. version 8.2 2. syntax varname(numeric) [if] [in] [fw aw iw] [, noTOTal * ] 3. tempname count percent vals V 4. tab `varlist' `if' `in' [`weight'`exp'], matcell(`count') matrow(`vals > ') `options' 5. local N = r(N) 6. mat `count' = `count'' 7. forv r =1/`=rowsof(`vals')' { 8. local value: di `vals'[`r',1] 9. local label: label (`varlist') `value' 10. local values "`values' `value'" 11. local labels `"`labels' `value' `"`label'"'"' 12. } 13. if "`total'"=="" { 14. mat `count' = `count', `N' 15. local values "`values' total" 16. local labels `"`labels' total `"Total"'"' 17. } 18. mat colname `count' = `values' 19. mat `percent' = `count'/`N'*100 20. mat `V' = `count''*`count'*0 21. eret post `count' `V', depname(`varlist') obs(`N') 22. eret local cmd "e_tabulate" 23. eret local depvar "`varlist'" 24. eret local labels `"`labels'"' 25. eret mat percent = `percent' 26. end . sysuse auto (1978 Automobile Data) . e_tabulate foreign Car type | Freq. Percent Cum. ------------+----------------------------------- Domestic | 52 70.27 70.27 Foreign | 22 29.73 100.00 ------------+----------------------------------- Total | 74 100.00 . ereturn list scalars: e(N) = 74 macros: e(labels) : " 0 `"Domestic"' 1 `"Foreign"' total `"Total"'" e(depvar) : "foreign" e(cmd) : "e_tabulate" e(properties) : "b V" matrices: e(b) : 1 x 3 e(V) : 3 x 3 e(percent) : 1 x 3 . mat list e(b) e(b)[1,3] 0 1 total y1 52 22 74 . mat list e(percent) e(percent)[1,3] 0 1 total c1 70.27027 29.72973 100 . esttab, cell("b percent") noobs nonumbers nomtitles /// > collabels(Freq. Percent, lhs(`:var lab `e(depvar)'')) /// > varlabels(`e(labels)', blist(total "{hline @width}{break}")) -------------------------------------- Car type Freq. Percent -------------------------------------- Domestic 52 70.27027 Foreign 22 29.72973 -------------------------------------- Total 74 100 --------------------------------------
To construct a twoway table, save the conditional distributions in the table columns as separate estimation sets. Example:
. bys foreign: eststo: e_tabulate rep ------------------------------------------------------------------------------- -> Domestic Repair | Record 1978 | Freq. Percent Cum. ------------+----------------------------------- 1 | 2 4.17 4.17 2 | 8 16.67 20.83 3 | 27 56.25 77.08 4 | 9 18.75 95.83 5 | 2 4.17 100.00 ------------+----------------------------------- Total | 48 100.00 (est1 stored) ------------------------------------------------------------------------------- -> Foreign Repair | Record 1978 | Freq. Percent Cum. ------------+----------------------------------- 3 | 3 14.29 14.29 4 | 9 42.86 57.14 5 | 9 42.86 100.00 ------------+----------------------------------- Total | 21 100.00 (est2 stored) . esttab, main(percent 2) not nostar mtitles noobs nonote /// > varlab(`e(labels)', blist(total "{hline @width}{break}")) -------------------------------------- (1) (2) Domestic Foreign -------------------------------------- 1 4.17 2 16.67 3 56.25 14.29 4 18.75 42.86 5 4.17 42.86 -------------------------------------- Total 100.00 100.00 -------------------------------------- . eststo clear
A Stata matrix can be tabulated in estout or esttab by typing matrix(matname) instead of providing a list of names of stored estimation sets. Example:
. matrix A = (11,12,13)\(21,22,23)\(31,32,33)\(41,42,43) . esttab matrix(A) --------------------------------------------------- A c1 c2 c3 --------------------------------------------------- r1 11 12 13 r2 21 22 23 r3 31 32 33 r4 41 42 43 ---------------------------------------------------
Numeric formats can be set by adding a fmt() suboption in the matrix() argument. Examples:
. esttab matrix(A, fmt(1 2 3)) --------------------------------------------------- A c1 c2 c3 --------------------------------------------------- r1 11.0 12.00 13.000 r2 21.0 22.00 23.000 r3 31.0 32.00 33.000 r4 41.0 42.00 43.000 --------------------------------------------------- . esttab matrix(A, fmt("1 2 3 4" "4 3 2 1")) --------------------------------------------------- A c1 c2 c3 --------------------------------------------------- r1 11.0 12.0000 13.0 r2 21.00 22.000 23.00 r3 31.000 32.00 33.000 r4 41.0000 42.0 43.0000 ---------------------------------------------------
Examples for tabulating a matrix that also contains equation names:
. mat rownames A = "eq1:row1" "eq1:row2" "eq2:row1" "eq2:row2" . esttab matrix(A) --------------------------------------------------- A c1 c2 c3 --------------------------------------------------- eq1 row1 11 12 13 row2 21 22 23 --------------------------------------------------- eq2 row1 31 32 33 row2 41 42 43 --------------------------------------------------- . esttab matrix(A), unstack compress ---------------------------------------------------------------------- A eq1 eq2 c1 c2 c3 c1 c2 c3 ---------------------------------------------------------------------- row1 11 12 13 31 32 33 row2 21 22 23 41 42 43 ---------------------------------------------------------------------- . set seed 123 . matrix A = matuniform(4,4) . mat coleq A = eq1 eq1 eq2 eq2 . mat roweq A = eq1 eq1 eq2 eq2 . esttab matrix(A), eqlabels(,merge) ---------------------------------------------------------------- A eq1:c1 eq1:c2 eq2:c3 eq2:c4 ---------------------------------------------------------------- eq1:r1 .912044 .0075452 .2808588 .4602787 eq1:r2 .5601059 .6731906 .6177612 .8656876 eq2:r3 9.57e-06 .4090917 .7234821 .4862948 eq2:r4 .9899684 .3205308 .1244845 .3839803 ----------------------------------------------------------------
(See "Post correlation coefficients (correlate)" under "Examples for estpost" for some basic examples on tabulating correlation coefficients.)
Kelvin Tan asked on statalist (see here): "I would like to know if I can stack two correlation matrix tables into one big correlation matrix ((foreign=1) in lower diagonal and (foreign=0) in upper diagonal of the big correlation matrix table)." Maarten Buis suggested a solution that works for the coefficients but does not provide significance stars or p-values (see here). Here are some examples for combining correlation coefficients while preserving the p-values. If you just want to stack two correlation matrices, you could code:
. eststo clear . sysuse auto (1978 Automobile Data) . local vlist price mpg weight . local rest `vlist' . foreach v of local vlist { 2. estpost correlate `v' `rest' if foreign==0 3. foreach m in b rho p count { 4. matrix tmp = e(`m') 5. matrix coleq tmp = "foreign=0" 6. matrix `m' = tmp 7. } 8. estpost correlate `v' `rest' if foreign==1 9. foreach m in b rho p count { 10. matrix tmp = e(`m') 11. matrix coleq tmp = "foreign=1" 12. matrix `m' = `m', tmp 13. } 14. ereturn post b 15. foreach m in rho p count { 16. quietly estadd matrix `m' = `m' 17. } 18. eststo `v' 19. local rest: list rest - v 20. } price | e(b) e(rho) e(p) e(count) -------------+-------------------------------------------- price | 1 1 52 mpg | -.5042629 -.5042629 .0001381 52 weight | .6723974 .6723974 4.79e-08 52 price | e(b) e(rho) e(p) e(count) -------------+-------------------------------------------- price | 1 1 22 mpg | -.6313026 -.6313026 .001628 22 weight | .885529 .885529 4.31e-08 22 mpg | e(b) e(rho) e(p) e(count) -------------+-------------------------------------------- mpg | 1 1 52 weight | -.8759427 -.8759427 1.89e-17 52 mpg | e(b) e(rho) e(p) e(count) -------------+-------------------------------------------- mpg | 1 1 22 weight | -.682854 -.682854 .0004617 22 weight | e(b) e(rho) e(p) e(count) -------------+-------------------------------------------- weight | 1 1 52 weight | e(b) e(rho) e(p) e(count) -------------+-------------------------------------------- weight | 1 1 22 . esttab, nonumbers mtitles noobs not ------------------------------------------------------------ price mpg weight ------------------------------------------------------------ foreign=0 price 1 mpg -0.504*** 1 weight 0.672*** -0.876*** 1 ------------------------------------------------------------ foreign=1 price 1 mpg -0.631** 1 weight 0.886*** -0.683*** 1 ------------------------------------------------------------ * p<0.05, ** p<0.01, *** p<0.001
The trick is to save a separate estimation set for each column of the correlation matrix and use equation names for the two groups.
Kelvin's upper/lower triangle layout can be achieved using a similar approach:
. eststo clear . sysuse auto (1978 Automobile Data) . local vlist price mpg weight . local upper . local lower `vlist' . foreach v of local vlist { 2. estpost correlate `v' `lower' if foreign==1 3. foreach m in b rho p count { 4. matrix `m' = e(`m') 5. } 6. if "`upper'"!="" { 7. estpost correlate `v' `upper' if foreign==0 8. foreach m in b rho p count { 9. matrix `m' = e(`m'), `m' 10. } 11. } 12. ereturn post b 13. foreach m in rho p count { 14. quietly estadd matrix `m' = `m' 15. } 16. eststo `v' 17. local lower: list lower - v 18. local upper `upper' `v' 19. } price | e(b) e(rho) e(p) e(count) -------------+-------------------------------------------- price | 1 1 22 mpg | -.6313026 -.6313026 .001628 22 weight | .885529 .885529 4.31e-08 22 mpg | e(b) e(rho) e(p) e(count) -------------+-------------------------------------------- mpg | 1 1 22 weight | -.682854 -.682854 .0004617 22 mpg | e(b) e(rho) e(p) e(count) -------------+-------------------------------------------- price | -.5042629 -.5042629 .0001381 52 weight | e(b) e(rho) e(p) e(count) -------------+-------------------------------------------- weight | 1 1 22 weight | e(b) e(rho) e(p) e(count) -------------+-------------------------------------------- price | .6723974 .6723974 4.79e-08 52 mpg | -.8759427 -.8759427 1.89e-17 52 . esttab, nonumbers mtitles noobs not ------------------------------------------------------------ price mpg weight ------------------------------------------------------------ price 1 -0.504*** 0.672*** mpg -0.631** 1 -0.876*** weight 0.886*** -0.683*** 1 ------------------------------------------------------------ * p<0.05, ** p<0.01, *** p<0.001
esttab and estout place different models in separate columns. Sometimes it is desirable, however, to arrange a table so that the models are placed in separate rows. Here are two approaches to construct such a table.
Approach 1: esttab and estout return a matrix r(coefs) that contains the tabulated results. You can run esttab or estout and then run it again in matrix mode to transpose and tabulate r(coefs). This approach is simple but the possibilities for formatting the table are somewhat limited. Example:
. sysuse auto (1978 Automobile Data) . eststo model1: quietly reg price weight . eststo model2: quietly reg price weight mpg . esttab, se nostar -------------------------------------- (1) (2) price price -------------------------------------- weight 2.044 1.747 (0.377) (0.641) mpg -49.51 (86.16) _cons -6.707 1946.1 (1174.4) (3597.0) -------------------------------------- N 74 74 -------------------------------------- Standard errors in parentheses . mat list r(coefs) r(coefs)[3,4] model1: model1: model2: model2: b se b se weight 2.0440626 .37683413 1.7465592 .64135379 mpg .z .z -49.512221 86.156039 _cons -6.7073534 1174.4296 1946.0687 3597.0496 . esttab r(coefs, transpose) --------------------------------------------------- r(coefs) weight mpg _cons --------------------------------------------------- model1 b 2.044063 -6.707353 se .3768341 1174.43 --------------------------------------------------- model2 b 1.746559 -49.51222 1946.069 se .6413538 86.15604 3597.05 --------------------------------------------------- . eststo clear
Approach 2: Again run esttab or estout to compile r(coefs) but then, for each coefficient, collect the results and post them in e() (i.e. post one "model" per coefficient). This approach requires some programming but gives you full flexibility. Example:
. sysuse auto (1978 Automobile Data) . eststo model1: quietly reg price weight . eststo model2: quietly reg price weight mpg . esttab, se nostar -------------------------------------- (1) (2) price price -------------------------------------- weight 2.044 1.747 (0.377) (0.641) mpg -49.51 (86.16) _cons -6.707 1946.1 (1174.4) (3597.0) -------------------------------------- N 74 74 -------------------------------------- Standard errors in parentheses . matrix C = r(coefs) . eststo clear . local rnames : rownames C . local models : coleq C . local models : list uniq models . local i 0 . foreach name of local rnames { 2. local ++i 3. local j 0 4. capture matrix drop b 5. capture matrix drop se 6. foreach model of local models { 7. local ++j 8. matrix tmp = C[`i', 2*`j'-1] 9. if tmp[1,1]<. { 10. matrix colnames tmp = `model' 11. matrix b = nullmat(b), tmp 12. matrix tmp[1,1] = C[`i', 2*`j'] 13. matrix se = nullmat(se), tmp 14. } 15. } 16. ereturn post b 17. quietly estadd matrix se 18. eststo `name' 19. } . esttab, se mtitle noobs ------------------------------------------------------------ (1) (2) (3) weight mpg _cons ------------------------------------------------------------ model1 2.044*** -6.707 (0.377) (1174.4) model2 1.747** -49.51 1946.1 (0.641) (86.16) (3597.0) ------------------------------------------------------------ Standard errors in parentheses * p<0.05, ** p<0.01, *** p<0.001 . eststo clear
Approach 2 with summary statistics:
. sysuse auto (1978 Automobile Data) . eststo model1: quietly reg price weight . eststo model2: quietly reg price weight mpg . esttab, se nostar r2 -------------------------------------- (1) (2) price price -------------------------------------- weight 2.044 1.747 (0.377) (0.641) mpg -49.51 (86.16) _cons -6.707 1946.1 (1174.4) (3597.0) -------------------------------------- N 74 74 R-sq 0.290 0.293 -------------------------------------- Standard errors in parentheses . matrix C = r(coefs) . matrix S = r(stats) . eststo clear . local rnames : rownames C . local models : coleq C . local models : list uniq models . local i 0 . foreach name of local rnames { 2. local ++i 3. local j 0 4. capture matrix drop b 5. capture matrix drop se 6. foreach model of local models { 7. local ++j 8. matrix tmp = C[`i', 2*`j'-1] 9. if tmp[1,1]<. { 10. matrix colnames tmp = `model' 11. matrix b = nullmat(b), tmp 12. matrix tmp[1,1] = C[`i', 2*`j'] 13. matrix se = nullmat(se), tmp 14. } 15. } 16. ereturn post b 17. quietly estadd matrix se 18. eststo `name' 19. } . local snames : rownames S . local i 0 . foreach name of local snames { 2. local ++i 3. local j 0 4. capture matrix drop b 5. foreach model of local models { 6. local ++j 7. matrix tmp = S[`i', `j'] 8. matrix colnames tmp = `model' 9. matrix b = nullmat(b), tmp 10. } 11. ereturn post b 12. eststo `name' 13. } . esttab, se mtitle noobs compress nonumb --------------------------------------------------------------------------- weight mpg _cons N r2 --------------------------------------------------------------------------- model1 2.044*** -6.707 74 0.290 (0.377) (1174.4) model2 1.747** -49.51 1946.1 74 0.293 (0.641) (86.16) (3597.0) --------------------------------------------------------------------------- Standard errors in parentheses * p<0.05, ** p<0.01, *** p<0.001 . eststo clear
Many Stata commands and user programs return results in r(). To tabulate such results in estout or esttab you can collect them in a matrix and tabulate the matrix (Approach 1) or post the results as one or more vectors in e() and tabulate them from there (Approach 2). Approach 2 is more flexible than Approach 1.
Approach 1: collect results in a matrix and tabulate the matrix
In the following example
the ineqrbd command by Carlo V. Fiorio and Stephen P. Jenkins is used (see
http://ideas.repec.org/c/boc/bocode/s456960.html).
ineqrbd happens to return results in a series of r()-macros.
We can construct a matrix from these macros (and also compute some additional
results using the formulas provided in ineqrbd's output) and then tabulate
the matrix as follows:
. capture which ineqrbd // check whether -ineqrbd- is installed . if _rc ssc install ineqrbd // and get it if not checking ineqrbd consistency and verifying not already installed... installing into /Users/jann/Library/Application Support/Stata/Stata 14/ado/plus > /... installation complete. . sysuse auto (1978 Automobile Data) . ineqrbd price trunk weight length foreign, noregression Regression-based decomposition of inequality in price --------------------------------------------------------------------------- Decomp. | 100*s_f S_f 100*m_f/m CV_f CV_f/CV(total) ---------+----------------------------------------------------------------- residual | 45.1031 0.2158 0.0000 1.79e+15 3.74e+15 trunk | -0.4687 -0.0022 -2.2943 -0.3109 -0.6499 weight | 81.8711 0.3917 282.5215 0.2574 0.5380 length | -29.2268 -0.1398 -273.2854 -0.1185 -0.2477 foreign | 2.7213 0.0130 17.2635 1.5479 3.2356 ---------+----------------------------------------------------------------- Total | 100.0000 0.4784 100.0000 0.4784 1.0000 --------------------------------------------------------------------------- Note: proportionate contribution of composite var f to inequality of Total, s_f = rho_f*sd(f)/sd(Total). S_f = s_f*CV(Total). m_f = mean(f). sd(f) = std.dev. of f. CV_f = sd(f)/m_f. Total = price . return list macros: r(sf_Z4) : ".0272132003266729" r(cv_Z4) : "1.547906632830336" r(sd_Z4) : "1647.497942176796" r(mean_Z4) : "1064.339351763328" r(sf_Z3) : "-.2922677469661964" r(cv_Z3) : "-.1184805603472781" r(sd_Z3) : "1996.248597028214" r(mean_Z3) : "-16848.7437194508" r(sf_Z2) : ".8187108270390759" r(cv_Z2) : ".2573949336205026" r(sd_Z2) : "4483.350954895487" r(mean_Z2) : "17418.17871794493" r(sf_Z1) : "-.004687100101882" r(cv_Z1) : "-.3109311493112151" r(sd_Z1) : "43.98088549818675" r(mean_Z1) : "-141.4489529132564" r(sf_Z0) : ".4510308197023296" r(cv_Z0) : "1790770538833059" r(sd_Z0) : "1980.84687222313" r(mean_Z0) : "1.10614220486e-12" r(cv_tot) : ".4784060098610566" r(sd_tot) : "2949.495884768919" r(mean_tot) : "6165.256756756757" r(total) : " price" r(xvars) : "trunk weight length foreign" r(yvar) : "price" r(varlist) : "price trunk weight length foreign" . // Step 1: collect results from r(sf_Z#), r(mean_Z#), and r(cv_Z#) . local xvars "`r(xvars)'" . local nx : list sizeof xvars . foreach s in sf mean cv { 2. tempname `s' 3. matrix ``s'' = J(`nx'+2, 1, .z) 4. matrix rownames ``s'' = residual `r(xvars)' Total 5. forv i = 0/`nx' { 6. matrix ``s''[`i'+1, 1] = `r(`s'_Z`i')' 7. } 8. } . matrix `sf'[rowsof(`sf'), 1] = 1 . matrix `mean'[rowsof(`mean'), 1] = `r(mean_tot)' . matrix `cv'[rowsof(`sf'), 1] = `r(cv_tot)' . // Step 2: build matrix that mirrors -ineqrbd-'s output . matrix ineqrbd = /// > `sf' * 100 , /// column 1: 100*s_f > `sf' * `r(cv_tot)' , /// column 2: S_f > `mean' / `r(mean_tot)' * 100, /// column 3: 100*m_f/m > `cv', /// column 4: CV_f > `cv' / `r(cv_tot)' // column 5: CV_f/CV(total) . matrix colnames ineqrbd = 100*s_f S_f 100*m_f/m CV_f CV_f/CV(total) . // Step 3: tabulate the matrix . esttab matrix(ineqrbd) ----------------------------------------------------------------------------- ineqrbd 100*s_f S_f 100*m_f/m CV_f CV_f/CV(to~) ----------------------------------------------------------------------------- residual 45.10308 .2157759 1.79e-14 1.79e+15 3.74e+15 trunk -.46871 -.0022423 -2.294291 -.3109311 -.6499315 weight 81.87108 .3916762 282.5215 .2573949 .5380261 length -29.22677 -.1398226 -273.2854 -.1184806 -.2476569 foreign 2.72132 .013019 17.2635 1.547907 3.23555 Total 100 .478406 100 .478406 1 -----------------------------------------------------------------------------
Approach 2: post results as vectors in e()
Instead of directly
tabulating the matrix you can post the matrix columns as vectors in e() and
then tabulate these vectors. This gives you some additional flexibility for formatting
the columns. Here is an example (Stata 9 is required):
. capture which ineqrbd // check whether -ineqrbd- is installed . if _rc ssc install ineqrbd // and get it if not . sysuse auto (1978 Automobile Data) . ineqrbd price trunk weight length foreign, noregression Regression-based decomposition of inequality in price --------------------------------------------------------------------------- Decomp. | 100*s_f S_f 100*m_f/m CV_f CV_f/CV(total) ---------+----------------------------------------------------------------- residual | 45.1031 0.2158 0.0000 1.79e+15 3.74e+15 trunk | -0.4687 -0.0022 -2.2943 -0.3109 -0.6499 weight | 81.8711 0.3917 282.5215 0.2574 0.5380 length | -29.2268 -0.1398 -273.2854 -0.1185 -0.2477 foreign | 2.7213 0.0130 17.2635 1.5479 3.2356 ---------+----------------------------------------------------------------- Total | 100.0000 0.4784 100.0000 0.4784 1.0000 --------------------------------------------------------------------------- Note: proportionate contribution of composite var f to inequality of Total, s_f = rho_f*sd(f)/sd(Total). S_f = s_f*CV(Total). m_f = mean(f). sd(f) = std.dev. of f. CV_f = sd(f)/m_f. Total = price . // Step 1: collect results from r(sf_Z#), r(mean_Z#), and r(cv_Z#) . local xvars "`r(xvars)'" . local nx : list sizeof xvars . foreach s in sf mean cv { 2. tempname `s' 3. matrix ``s'' = J(`nx'+2, 1, .z) 4. matrix rownames ``s'' = residual `r(xvars)' Total 5. forv i = 0/`nx' { 6. matrix ``s''[`i'+1, 1] = `r(`s'_Z`i')' 7. } 8. } . matrix `sf'[rowsof(`sf'), 1] = 1 . matrix `mean'[rowsof(`mean'), 1] = `r(mean_tot)' . matrix `cv'[rowsof(`sf'), 1] = `r(cv_tot)' . // Step 2: build matrix that mirrors -ineqrbd-'s output . matrix ineqrbd = /// > `sf' * 100 , /// column 1: 100*s_f > `sf' * `r(cv_tot)' , /// column 2: S_f > `mean' / `r(mean_tot)' * 100, /// column 3: 100*m_f/m > `cv', /// column 4: CV_f > `cv' / `r(cv_tot)' // column 5: CV_f/CV(total) . matrix colnames ineqrbd = 100*s_f S_f 100*m_f/m CV_f CV_f/CV(total) . // Step 3: post matrix columns in e() . ereturn post . tempname tmp . local i 0 . foreach col in s_f100 S_f m_f100 CV_f CV_ftot { 2. local ++i 3. matrix `tmp' = ineqrbd[1...,`i']' 4. quietly estadd matrix `col' = `tmp' 5. } . ereturn list matrices: e(CV_ftot) : 1 x 6 e(CV_f) : 1 x 6 e(m_f100) : 1 x 6 e(S_f) : 1 x 6 e(s_f100) : 1 x 6 . // Step 4: tabulate . esttab, cell("s_f100 S_f m_f100 CV_f CV_ftot") noobs ----------------------------------------------------------------------------- (1) s_f100 S_f m_f100 CV_f CV_ftot ----------------------------------------------------------------------------- residual 45.10308 .2157759 1.79e-14 1.79e+15 3.74e+15 trunk -.46871 -.0022423 -2.294291 -.3109311 -.6499315 weight 81.87108 .3916762 282.5215 .2573949 .5380261 length -29.22677 -.1398226 -273.2854 -.1184806 -.2476569 foreign 2.72132 .013019 17.2635 1.547907 3.23555 Total 100 .478406 100 .478406 1 ----------------------------------------------------------------------------- . esttab, cell((S_f s_f100(fmt(1) par("" "%")))) noobs -------------------------------------- (1) S_f s_f100 -------------------------------------- residual .2157759 45.1% trunk -.0022423 -0.5% weight .3916762 81.9% length -.1398226 -29.2% foreign .013019 2.7% Total .478406 100.0% --------------------------------------
estout cannot stack models. A solution is to stack the models in advance and save the result in e(). Here is an example where the goal is to include a column containing the bivariate effects of the regressors:
. capt prog drop appendmodels . *! version 1.0.0 14aug2007 Ben Jann . program appendmodels, eclass 1. // using first equation of model . version 8 2. syntax namelist 3. tempname b V tmp 4. foreach name of local namelist { 5. qui est restore `name' 6. mat `tmp' = e(b) 7. local eq1: coleq `tmp' 8. gettoken eq1 : eq1 9. mat `tmp' = `tmp'[1,"`eq1':"] 10. local cons = colnumb(`tmp',"_cons") 11. if `cons'<. & `cons'>1 { 12. mat `tmp' = `tmp'[1,1..`cons'-1] 13. } 14. mat `b' = nullmat(`b') , `tmp' 15. mat `tmp' = e(V) 16. mat `tmp' = `tmp'["`eq1':","`eq1':"] 17. if `cons'<. & `cons'>1 { 18. mat `tmp' = `tmp'[1..`cons'-1,1..`cons'-1] 19. } 20. capt confirm matrix `V' 21. if _rc { 22. mat `V' = `tmp' 23. } 24. else { 25. mat `V' = /// > ( `V' , J(rowsof(`V'),colsof(`tmp'),0) ) \ /// > ( J(rowsof(`tmp'),colsof(`V'),0) , `tmp' ) 26. } 27. } 28. local names: colfullnames `b' 29. mat coln `V' = `names' 30. mat rown `V' = `names' 31. eret post `b' `V' 32. eret local cmd "whatever" 33. end . sysuse auto (1978 Automobile Data) . eststo b1: quietly regress price weight . eststo b2: quietly regress price mpg . eststo b3: quietly regress price foreign . eststo bivar: appendmodels b1 b2 b3 . eststo multi: quietly regress price weight mpg foreign . esttab b1 b2 b3 bivar, mtitles ---------------------------------------------------------------------------- (1) (2) (3) (4) b1 b2 b3 bivar ---------------------------------------------------------------------------- weight 2.044*** 2.044*** (5.42) (5.42) mpg -238.9*** -238.9*** (-4.50) (-4.50) foreign 312.3 312.3 (0.41) (0.41) _cons -6.707 11253.1*** 6072.4*** (-0.01) (9.61) (14.76) ---------------------------------------------------------------------------- N 74 74 74 ---------------------------------------------------------------------------- t statistics in parentheses * p<0.05, ** p<0.01, *** p<0.001 . esttab multi bivar, mtitles -------------------------------------------- (1) (2) multi bivar -------------------------------------------- weight 3.465*** 2.044*** (5.49) (5.42) mpg 21.85 -238.9*** (0.29) (-4.50) foreign 3673.1*** 312.3 (5.37) (0.41) _cons -5853.7 (-1.73) -------------------------------------------- N 74 -------------------------------------------- t statistics in parentheses * p<0.05, ** p<0.01, *** p<0.001 . eststo clear
Assume you are including a categorical variable in a regression model (e.g. using the xi command) and want to report the group sizes. You could proceed as follows:
. sysuse auto (1978 Automobile Data) . xi: reg price weight mpg i.rep i.rep78 _Irep78_1-5 (naturally coded; _Irep78_1 omitted) Source | SS df MS Number of obs = 69 -------------+---------------------------------- F(6, 62) = 6.03 Model | 212481723 6 35413620.6 Prob > F = 0.0001 Residual | 364315236 62 5876052.19 R-squared = 0.3684 -------------+---------------------------------- Adj R-squared = 0.3073 Total | 576796959 68 8482308.22 Root MSE = 2424.1 ------------------------------------------------------------------------------ price | Coef. Std. Err. t P>|t| [95% Conf. Interval] -------------+---------------------------------------------------------------- weight | 2.093066 .636901 3.29 0.002 .8199193 3.366213 mpg | -63.0971 87.45276 -0.72 0.473 -237.9127 111.7185 _Irep78_2 | 753.7024 1919.763 0.39 0.696 -3083.849 4591.254 _Irep78_3 | 1349.361 1772.706 0.76 0.449 -2194.228 4892.95 _Irep78_4 | 2030.47 1810.09 1.12 0.266 -1587.848 5648.788 _Irep78_5 | 3376.91 1900.17 1.78 0.080 -421.4749 7175.296 _cons | -598.9665 3960.904 -0.15 0.880 -8516.701 7318.768 ------------------------------------------------------------------------------ . capt matrix drop nobs . foreach cat of varlist _Irep* { 2. count if `cat'==1 & e(sample) 3. matrix nobs = nullmat(nobs), r(N) 4. local collab "`collab'`cat' " 5. } 8 30 18 11 . matrix colname nobs = `collab' . estadd matrix nobs added matrix: e(nobs) : 1 x 4 . esttab, cells("b(fmt(a3)) t(fmt(2)) nobs") nogap --------------------------------------------------- (1) price b t nobs --------------------------------------------------- weight 2.093 3.29 mpg -63.10 -0.72 _Irep78_2 753.7 0.39 8 _Irep78_3 1349.4 0.76 30 _Irep78_4 2030.5 1.12 18 _Irep78_5 3376.9 1.78 11 _cons -599.0 -0.15 --------------------------------------------------- N 69 ---------------------------------------------------
[estpost supersedes this example. See "Post confidence intervals for survival time (stci)" under "Examples for estpost".]
The stci command to compute confidence intervals for survival time estimates returns its results in r(), or not at all if used with the by() option. The following example therefore provides a wrapper for stci that collects the results and posts them in e(), so that they can be tabulated using estout or esttab:
. capt prog drop e_stci . *! version 1.0.0 16sep2008 Ben Jann . prog e_stci, eclass 1. version 9.2 2. syntax [if] [in] [ , by(varname) Median Rmean Emean p(str) * ] 3. local stat "p50" 4. if `"`p'"'!="" local stat `"p`p'"' 5. else if "`rmean'"!="" local stat "rmean" 6. else if "`emean'"!="" local stat "emean" 7. tempname b V N_sub lb ub 8. marksample touse 9. if "`by'"!="" { 10. markout `touse' `by', strok 11. qui levelsof `by' if `touse', local(levels) 12. } 13. local levels `"`levels' "total""' 14. gettoken l rest : levels, quotes 15. while (`"`l'"'!="") { 16. if `"`rest'"'=="" local lcond 17. else local lcond `" & `by'==`l'"' 18. qui stci if `touse'`lcond', `median' `rmean' `emean' `p' `options' 19. mat `b' = nullmat(`b'), r(`stat') 20. mat `V' = nullmat(`V'), r(se)^2 21. mat `N_sub' = nullmat(`N_sub'), r(N_sub) 22. mat `lb' = nullmat(`lb'), r(lb) 23. mat `ub' = nullmat(`ub'), r(ub) 24. gettoken l rest : rest 25. } 26. foreach m in b V N_sub lb ub { 27. mat coln ``m'' = `levels' 28. } 29. if matmissing(`V') { 30. mat `V' = `b'' * `b' * 0 // set V to zero 31. } 32. else { 33. mat `V' = diag(`V') 34. } 35. eret post `b' `V' 36. eret matrix N_sub = `N_sub' 37. eret matrix lb = `lb' 38. eret matrix ub = `ub' 39. eret local cmd "e_stci" 40. end . webuse page2 . stci, by(group) failure _d: dead analysis time _t: time | no. of group | subjects 50% Std. Err. [95% Conf. Interval] -------------+------------------------------------------------------------- 1 | 19 216 7.661029 190 234 2 | 21 233 3.081611 232 280 -------------+------------------------------------------------------------- total | 40 232 2.562933 213 239 . e_stci, by(group) . ereturn list macros: e(cmd) : "e_stci" e(properties) : "b V" matrices: e(b) : 1 x 3 e(V) : 3 x 3 e(ub) : 1 x 3 e(lb) : 1 x 3 e(N_sub) : 1 x 3 . estout, cell("N_sub b(label(50%)) se lb ub") ----------------------------------------------------------------------------- . N_sub 50% se lb ub ----------------------------------------------------------------------------- 1 19 216 7.661029 190 234 2 21 233 3.081611 232 280 total 40 232 2.562933 213 239 -----------------------------------------------------------------------------