2013-03-21 16 views
7

Vorrei utilizzare esttab (ssc install estout) per generare statistiche di riepilogo per gruppo con colonne per differenza e significato medi. È abbastanza facile generare questi come due tabelle separate con estpost, summarize e ttest e combinare manualmente, ma vorrei automatizzare l'intero processo.Utilizzare esttab per generare statistiche di riepilogo per gruppo con colonne per differenza media e significato

Il seguente codice genera i due componenti della tabella desiderata.

sysuse auto, clear 

* summary statistics by group 
eststo clear 
by foreign: eststo: quietly estpost summarize /// 
    price mpg weight headroom trunk 
esttab, cells("mean sd") label nodepvar 

* difference in means 
eststo: estpost ttest price mpg weight headroom trunk, /// 
    by(foreign) unequal 
esttab ., wide label 

E posso stampare i due tavoli e tagliare-un-incolla in un tavolo.

* can generate similar tables and append horizontally 
esttab, cells("mean sd") label 
esttab, wide label 


* manual, cut-and-paste solution 
------------------------------------------------------------------------------------------------------- 
           (1)      (2)       (3)     

          mean   sd   mean   sd   
------------------------------------------------------------------------------------------------------- 
Price     6072.423  3097.104  6384.682  2621.915   -312.3   (-0.44) 
Mileage (mpg)   19.82692  4.743297  24.77273  6.611187   -4.946**  (-3.18) 
Weight (lbs.)   3317.115  695.3637  2315.909  433.0035   1001.2***  (7.50) 
Headroom (in.)   3.153846  .9157578  2.613636  .4862837   0.540**  (3.30) 
Trunk space (.. ft.)  14.75  4.306288  11.40909  3.216906   3.341***  (3.67) 
------------------------------------------------------------------------------------------------------- 
Observations     52      22       74     
------------------------------------------------------------------------------------------------------- 
t statistics in parentheses 
* p<0.05, ** p<0.01, *** p<0.001 

Sembra che dovrebbe essere in grado di ottenere la tabella desiderata con un esttab chiamata e senza taglio-e-incolla, ma non può capire. C'è un modo per generare la tabella desiderata senza tagliare e incollare manualmente?

Preferisco l'output di una tabella LaTeX, ma tutto ciò che elimina il taglio e incolla è un grande passo, anche passando attraverso un file di testo delimitato.

risposta

6

Se si vuole ancora utilizzare esttab, si può giocare con le cellule e modello. La tabella nel post originale può essere replicato con il seguente codice:

sysuse auto, clear 

eststo domestic: quietly estpost summarize /// 
    price mpg weight headroom trunk if foreign == 0 
eststo foreign: quietly estpost summarize /// 
    price mpg weight headroom trunk if foreign == 1 
eststo diff: quietly estpost ttest /// 
    price mpg weight headroom trunk, by(foreign) unequal 

esttab domestic foreign diff, /// 
cells("mean(pattern(1 1 0) fmt(2)) sd(pattern(1 1 0)) b(star pattern(0 0 1) fmt(2)) t(pattern(0 0 1) par fmt(2))") /// 
label 

che produce

----------------------------------------------------------------------------------------------------- 
           (1)      (2)      (3)     

          mean   sd   mean   sd   b    t 
----------------------------------------------------------------------------------------------------- 
Price      6072.42  3097.10  6384.68  2621.92  -312.26   (-0.44) 
Mileage (mpg)    19.83   4.74  24.77   6.61  -4.95**  (-3.18) 
Weight (lbs.)    3317.12  695.36  2315.91  433.00  1001.21***  (7.50) 
Headroom (in.)    3.15   0.92   2.61   0.49   0.54**  (3.30) 
Trunk space (.. ft.)  14.75   4.31  11.41   3.22   3.34***  (3.67) 
----------------------------------------------------------------------------------------------------- 
Observations     52      22      74     
----------------------------------------------------------------------------------------------------- 
+0

Grazie! Non ho guardato da vicino le opzioni delle "cellule". Questo sarà utile ovunque io usi 'esttab'. Che è ovunque Ben Jann dovrebbe ottenere un Nobel per "esttab". –

3

Io non credo che ci sia un modo per fare questo con esttab (estout pacchetto da ssc), ma ho una soluzione con listtab (anche ssc) e postfile. La tabella qui è leggermente diversa da quella che propongo in precedenza, ma l'approccio è abbastanza generale da poter essere modificato in base alle proprie esigenze.

Questa soluzione utilizza anche il pacchetto booktabs di LaTeX.

/* data and variables */ 
sysuse auto, clear 
local vars price mpg weight headroom trunk 

/* means */ 
tempname postMeans 
tempfile means 
postfile `postMeans' /// 
    str100 varname domesticMeans foreignMeans pMeans using "`means'", replace 
foreach v of local vars { 
    local name: variable label `v' 
    ttest `v', by(foreign) 
    post `postMeans' ("`name'") (r(mu_1)) (r(mu_2)) (r(p)) 
} 
postclose `postMeans' 

/* medians */ 
tempname postMedians 
tempfile medians 
postfile `postMedians' /// 
    domesticMedians foreignMedians pMedians using `medians', replace 
foreach v of local vars { 
    summarize `v' if !foreign, detail 
    local med1 = r(p50) 
    summarize `v' if foreign, detail 
    local med2 = r(p50) 
    ranksum `v', by(foreign) 
    local pval = 2 * (1 - normal(abs(r(z)))) 
    post `postMedians' (`med1') (`med2') (`pval') 
} 
postclose `postMedians' 

/* combine */ 
use `means' 
merge 1:1 _n using `medians', nogenerate 
format *Means *Medians %9.3gc 
list 

/* make latex table */ 
/* requires LaTeX package `booktabs` */ 
listtab * using "Table.tex", /// 
    rstyle(tabular) replace /// 
    head("\begin{tabular}{lcccccc}" /// 
    "\toprule" /// 
    "& \multicolumn{3}{c}{Means} & \multicolumn{3}{c}{Medians} \\" /// 
    "\cmidrule(lr){2-4} \cmidrule(lr){5-7}" /// 
    "& Domestic & Foreign & \emph{p} & Domestic & Foreign & \emph{p}\\" /// 
    "\midrule") /// 
    foot("\bottomrule" "\end{tabular}") 

Questo produce quanto segue.

enter image description here

1

La risposta scelto è bello, ma un po 'redudant. È possibile ottenere lo stesso risultato solo con estpost ttest.

sysuse auto, clear 
estpost ttest price mpg weight headroom trunk, by(foreign) 
esttab, cells("mu_1 mu_2 b(star)" 

L'output è simile al seguente:

   mu_1   mu_2   b 

c_score  43.33858 42.034  1.30458*** 
nc_a4_17 4.007524 3.924623 .0829008* 
+0

Bello! Un vantaggio della risposta scelta è che puoi includere momenti non segnalati da 'estpost ttest'. –

Problemi correlati