2 Deskriptionen
2.1 summarize
Klassiker für die Erstellung einer deskriptiven Übersicht in Stata ist summarize
:
summarize zpalter
Variable | Obs Mean Std. Dev. Min Max
-------------+---------------------------------------------------------
zpalter | 19,836 47.19228 11.33762 15 87
Flexibler und für unsere Zwecke passender ist tabstat
:
2.2 tabstat
Mit tabstat
können wir eine ganze Reihe statistischer Kennzahlen für metrische/kontinuierliche Merkmale berechnen. Die Syntax hat dabei das folgende Format: tabstat varlist, s(*option*) c(stat|var)
Hier eine Übersicht der Kennzahlen:
Option | Kennzahl |
---|---|
mean | arithm. Mittel |
median | Median |
count | Anzahl der Beobachtungen ohne Missings |
n | entspricht count |
sum | Summe der Ausprägungen |
max | Maximum |
min | Minimum |
range | Spannweite = max - min |
variance | Varianz |
sd | Standardabweichung |
cv | Variationskoefficient (sd/mean) |
skewness | Schiefe |
kurtosis | Wölbung |
pX | X. Perzentil (5,10,25,50,75,90,95,99) |
iqr | Interquartilsdistanz = p75 - p25 |
q | Entspricht p25 p50 p75 |
Hier ein Bespielbefehl für die Berechnung des arith. Mittels, der Standardabweichung, der Minimum und Maximum sowie der Fallzahl mit tabstat
:
tabstat zpalter, s(mean sd min max n) c(stat)
variable | mean sd min max N
-------------+--------------------------------------------------
zpalter | 47.19228 11.33762 15 87 19836
----------------------------------------------------------------
Für Deskriptionsbefehle müssen wir immer zuerst ein estpost
voranstellen:
tabstat F518_SUF, c(stat) stat(mean sd min max n)
estpost "mean sd min max count") esttab, cells(
Summary statistics: mean sd min max count
for variables: F518_SUF
| e(mean) e(sd) e(min) e(max) e(count)
-------------+-------------------------------------------------------
F518_SUF | 3532.109 3530.928 1 72000 16635
-----------------------------------------------------------------------------
(1)
mean sd min max count
-----------------------------------------------------------------------------
F518_SUF 3532.109 3530.928 1 72000 16635
-----------------------------------------------------------------------------
N 16635
-----------------------------------------------------------------------------
Wenn wir jetzt den Median hinzufügen möchten, brauchen wir ein neues estpost
:
"mean p50 sd min max count") esttab, cells(
(1)
mean p50 sd min max count
------------------------------------------------------------------------------------------
F518_SUF 3532.109 3530.928 1 72000 16635
------------------------------------------------------------------------------------------
N 16635
------------------------------------------------------------------------------------------
tabstat
mit p50
für Median:
tabstat F518_SUF, c(stat) stat(mean p50 sd min max n)
estpost "mean p50 sd min max count") esttab, cells(
Summary statistics: mean p50 sd min max count
for variables: F518_SUF
| e(mean) e(p50) e(sd) e(min) e(max) e(count)
-------------+------------------------------------------------------------------
F518_SUF | 3532.109 3000 3530.928 1 72000 16635
------------------------------------------------------------------------------------------
(1)
mean p50 sd min max count
------------------------------------------------------------------------------------------
F518_SUF 3532.109 3000 3530.928 1 72000 16635
------------------------------------------------------------------------------------------
N 16635
------------------------------------------------------------------------------------------
So oder so sieht diese Tabelle sieht natürlich noch überhaupt nicht so aus, wie wir sie haben möchten. Um das anzupassen, stehen uns eine ganze Reihe an Formatierungsbefehlen zur Verfügung.
nonumber
\(\Rightarrow\) Zahl oben ausblendennomtitle
\(\Rightarrow\) Modelltitel oben ausblenden (hier die Leerzeile)noobs
\(\Rightarrow\) Beobachtungszahl unten ausblendenlabel
\(\Rightarrow\) Variablenlaben verwenden
///
esttab, "mean p50 sd min max count") ///
cells(noobs label nonumber nomtitle
mean p50 sd min max count
--------------------------------------------------------------------------------------------------
Wie hoch ist Ih 3532.109 3000 3530.928 1 72000 16635
--------------------------------------------------------------------------------------------------
Das label ist hier allerdings abgeschnitten, wäre aber die Frageformulierung. Stattdessen hätten wir gernen einen Variablennamen, dazu können wir mit coeflabel()
den Variablennamen und in ""
ein Label angeben. Außerdem wollen wir die Spalten ansprechender beschriften, dazu geben wir mit collabels
ebenfalls in ""
der Reihe nach Werte an:
///
esttab, "mean sd min max count") ///
cells(noobs label ///
nonumber nomtitle nonote "Mean" "SD" "Median" "Min" "Max" "N") ///
collabels("Bruttoverdienst") coeflabel(F518_SUF
Mean SD Median Min Max N
--------------------------------------------------------------------------------------------------
Bruttoverdienst 3532.109 3000 3530.928 1 72000 16635
--------------------------------------------------------------------------------------------------
Abschließend möchten wir noch die Kennzahlen formatieren. Dazu können wir auf die Zahlenformate in Stata zurückgreifen - hier eine kurze Erklärung dazu.
///
esttab, "mean(fmt(%13.2fc)) sd(fmt(%13.2fc)) min(fmt(%13.0fc)) max(fmt(%13.0fc)) count(fmt(%6.0fc))") ///
cells(noobs label ///
nonumber nomtitle nonote "Mean" "SD" "Min" "Max" "N") ///
collabels("Bruttoverdienst") coeflabel(F518_SUF
Mean SD Min Max N
-------------------------------------------------------------------------------------
Bruttoverdienst 3,532.11 3,530.93 1 72,000 16,635
-------------------------------------------------------------------------------------
2.3 export
Bisher bewegen wir uns aber immer noch im Ausgabe-Fenster von Stata. Um die Tabelle nun zu exportieren, hängen wir ein using
-Statement an esttab
. Für das Ausgabeformat hängen wir einfach die gewünschte Dateiendung an:
.rtf
für eine Datei, die mit Word geöffnet und weiterverarbeitet werden kann.tex
für eine Latex-Datei.csv
für eine in Excel lesbarecsv
-Datei (mehr zum Excel-Export hier)
using "${res}/tab1.rtf", ///
esttab "mean(fmt(%13.2fc)) sd(fmt(%13.2fc)) min(fmt(%4.0fc)) max(fmt(%4.0fc)) count(fmt(%4.0fc))") ///
cells(noobs label ///
nonumber nomtitle nonote "Mean" "SD" "Min" "Max" "N") ///
collabels("Bruttoverdienst") ///
coeflabel(F518_SUF replace
using "${res}/tab1.tex", ///
esttab "mean(fmt(%13.2fc)) sd(fmt(%13.2fc)) min(fmt(%4.0fc)) max(fmt(%4.0fc)) count(fmt(%4.0fc))") ///
cells(noobs label ///
nonumber nomtitle nonote "Mean" "SD" "Min" "Max" "N") ///
collabels("Bruttoverdienst") ///
coeflabel(F518_SUF replace booktabs
2.4 Zusätzliche Kennzahlen hinzufügen
Gelegentlich möchten wir aber unserer Tabelle auch noch weitere Kennzahlen hinzufügen, bspw. aus mdesc
oder fastgini
.
ssc install mdesc
ssc install fastgini
Dazu können wir die estadd
-Funktion nutzen. Um eine neue Spalte mit der gewünschten Kennzahl zu erhalten, müssen wir estadd matrix
verwenden. Deswegen müssen wir ein klein bisschen in die matrix
-Welt von Stata eintauchen, um die Werte richtig hinzufügen zu können.
mdesc F518_SUFreturn list
r(miss)
mat miss =
mat colname miss = F518_SUFlist miss mat
Variable | Missing Total Percent Missing
----------------+-----------------------------------------------
F518_SUF | 3,377 20,012 16.87
----------------+-----------------------------------------------
scalars:
r(percent) = 16.87487507495502
r(total) = 20012
r(miss) = 3377
macros:
r(miss_vars) : "F518_SUF"
symmetric miss[1,1]
F518_SUF
r1 3377
Die so formatierte \(1x1\) matrix
können wir jetzt in unsere Tabelle einfügen, indem wir estadd matrix miss
angeben:
estadd mat miss
added matrix:
e(miss) : 1 x 1
Anschließend können wir die Tabelle mit esttab
erstellen und die Information aus mdesc
unter dem Namen der hinzugefügten matrix
aufrufen:
"mean(fmt(%13.2fc)) sd(fmt(%13.2fc)) min max count(fmt(%13.0fc)) miss(fmt(%13.0fc))") ///
esttab, cells(noobs nomtitle nonumber label collabels("Mean" "SD" "Min" "Max" "N" "Missings") ///
"Bruttoverdienst") coeflabel(F518_SUF
Mean SD Min Max N Missings
--------------------------------------------------------------------------------------------------
Bruttoverdienst 3,532.11 3,530.93 1.00 72,000.00 16,635 3,377
--------------------------------------------------------------------------------------------------
2.5 mehrere Variablen
Wir können natürlich auch mehrere Variablen in tabstat
und damit in esttab
aufnehmen:
tabstat zpalter F518_SUF, c(stat) stat(mean sd min max n)
estpost "mean(fmt(%13.2fc)) sd(fmt(%13.2fc)) min max count(fmt(%13.0fc))") noobs ///
esttab, cells(label collabels("Mean" "SD" "Min" "Max" "N") ///
nomtitle nonumber "Bruttoverdienst" zpalter "Alter") coeflabel(F518_SUF
Mean SD Min Max N
-------------------------------------------------------------------------------------
Alter 47.19 11.34 15.00 87.00 19,836
Bruttoverdienst 3,532.11 3,530.93 1.00 72,000.00 16,635
-------------------------------------------------------------------------------------
Etwas tricky wird’s aber, wenn wir auch hier eigene Kennzahlen miteinfügen möchten. Die r()
-Skalare für mdesc
(und auch fastgini
) geben uns nämlich nur den Wert für die letzte Variable aus:
mdesc zpalter F518_SUFreturn list
Variable | Missing Total Percent Missing
----------------+-----------------------------------------------
zpalter | 176 20,012 0.88
F518_SUF | 3,377 20,012 16.87
----------------+-----------------------------------------------
scalars:
r(percent) = 16.87487507495502
r(total) = 20012
r(miss) = 3377
macros:
r(miss_vars) : "zpalter F518_SUF"
Daher müssen wir uns hier mit einer Schleife helfen:
matrix vorbereiten
* "zpalter F518_SUF" // auszuwertende Variablen
glo x = word count ${x} // wie viele sind es?
glo len: J(1,${len},.) // entsprechend lange Matrix erstellen J(Zeilen,Spalten,Inhalt)
mat m1 = ${x} // spalten schon mal richtig benennen
mat colname m1 = list m1 // ansehen
mat
* Schleife über die angegebenen Variableny = 1/$len {
forval word("${x}",`y') // y.tes Wort aus x in v ablegen
loc v: dis display "`v'" // zur Kontrolle: v anzeigen
`v' // missings in v berechnen
mdesc r(miss)
loc res_mat = `y'] = `res_mat'
mat m1[1,
}l m1 mat
m1[1,2]
zpalter F518_SUF
r1 . .
zpalter
Variable | Missing Total Percent Missing
----------------+-----------------------------------------------
zpalter | 176 20,012 0.88
----------------+-----------------------------------------------
F518_SUF
Variable | Missing Total Percent Missing
----------------+-----------------------------------------------
F518_SUF | 3,377 20,012 16.87
----------------+-----------------------------------------------
m1[1,2]
zpalter F518_SUF
r1 176 3377
…und dann können wir wieder zur gewohnten Routine zurück. estpost
mit quietly
unterdrückt den Output, den wir ja schon kennen.
quietly estpost tabstat zpalter F518_SUF, c(stat) stat(mean sd min max n)
estadd mat m1"count(fmt(%13.0fc)) m1(fmt(%13.0fc))") noobs ///
esttab, cells(label collabels("N" "Missings") ///
nomtitle nonumber "Bruttoverdienst" zpalter "Alter") coeflabel(F518_SUF
N Missings
----------------------------------------------
Alter 19,836 176
Bruttoverdienst 16,635 3,377
----------------------------------------------
2.6 Gruppenvergleich
Mit by(S1)
bekommen wir einen Gruppenvergleich - hier zwischen Männern und Frauen. Die Option nototal
unterdrückt dabei die total
-Angabe
tabstat zpalter F518_SUF, by(S1) c(stat) stat(mean sd)
estpost tabstat zpalter F518_SUF, by(S1) c(stat) stat(mean sd) nototal estpost
Summary statistics: mean sd
for variables: zpalter F518_SUF
by categories of: S1
S1 | e(mean) e(sd)
-------------+----------------------
männlich |
zpalter | 46.49079 11.87744
F518_SUF | 4232.735 3951.324
-------------+----------------------
weiblich |
zpalter | 47.90402 10.71604
F518_SUF | 2800.926 2852.935
-------------+----------------------
Total |
zpalter | 47.19228 11.33762
F518_SUF | 3532.109 3530.928
Summary statistics: mean sd
for variables: zpalter F518_SUF
by categories of: S1
S1 | e(mean) e(sd)
-------------+----------------------
männlich |
zpalter | 46.49079 11.87744
F518_SUF | 4232.735 3951.324
-------------+----------------------
weiblich |
zpalter | 47.90402 10.71604
F518_SUF | 2800.926 2852.935
Mit par
bekommen wir den entsprechenden Wert in Klammern angezeigt:
mean(fmt(%10.1fc)) sd(fmt(%13.3fc) par)) nostar nonumber unstack ///
esttab, cells(noobs ///
nomtitle nonote none) ///
collabels("Männer" "Frauen") ///
eqlabels(///
nomtitles "Bruttoverdienst" zpalter "Alter") coeflabel(F518_SUF
Männer Frauen
--------------------------------------
Alter 46.5 47.9
(11.877) (10.716)
Bruttoverd~t 4,232.7 2,800.9
(3,951.324) (2,852.935)
--------------------------------------
Um die in cells()
angegebenen Werte in eine Zeile zu bringen, müssen wir sie in ""
setzen.
"mean(fmt(%10.1fc)) sd(fmt(%13.3fc) par)") nostar nonumber unstack ///
esttab, cells(noobs label ///
nomtitle nonote none) ///
collabels("Männer" "Frauen") ///
eqlabels(///
nomtitles "Bruttoverdienst" zpalter "Alter") coeflabel(F518_SUF
Männer Frauen
------------------------------------------------------------------------
Alter 46.5 (11.877) 47.9 (10.716)
Bruttoverdienst 4,232.7 (3,951.324) 2,800.9 (2,852.935)
------------------------------------------------------------------------
Mit collabels()
können wir die Werte auch beschriften.
"mean(fmt(%10.1fc)) sd(fmt(%13.3fc) par)") nostar nonumber unstack ///
esttab, cells(noobs label ///
nomtitle nonote "Mean" "SD" "Mean" "SD") ///
collabels("Männer" "Frauen") ///
eqlabels(///
nomtitles "Bruttoverdienst" zpalter "Alter") coeflabel(F518_SUF
Männer Frauen
Mean SD Mean SD
------------------------------------------------------------------------
Alter 46.5 (11.877) 47.9 (10.716)
Bruttoverdienst 4,232.7 (3,951.324) 2,800.9 (2,852.935)
------------------------------------------------------------------------
2.7 Übungen
2.7.1 Übung
- Erstellen Sie eine Überblickstabelle für
F200
(Wochenarbeitszeit) mit Min, Mean, SD, 1. Quartil (p25
), Median, 3. Quartil (p75
) und der Anzahl der Beobachtungen. - Labeln Sie die Spalten mit den Kennzahlen und auch die Variable.
2.7.2 Übung
- Ergänzen Sie die Tabelle von Übung 1
F200
umfastgini
- so kommen Sie an die abgelegte Info:
ssc install fastgini // falls nicht schon installiert
fastgini F518_SUFreturn list
2.7.3 Übung
- Verändern Sie die oben gezeigte Schleife so, dass nicht mehr die Anzahl, sondern der Anteil der Missings eingefügt wird.
mdesc zpalter F518_SUFreturn list
2.7.4 Übung
- Erweitern Sie den Gruppenvergleich um die Variablen
az
(Wochenarbeitszeit) undF1104
(Jahr des Schulabschlusses) - Wo könnten Sie die Nachkommastellen verändern? Verändern Sie die Anzeige für die Mittelwerte auf 3 Nachkommastellen
- Lassen Sie sich in auch den Median ausgeben. Legen Sie dafür 0 Nachkommastellen als Format fest. Denken Sie daran,
estpost
neu zu konfigurieren. - Passen Sie die Syntax in
cells()
an, um die Werte neben- oder untereinander angezeigt zu bekommen.
2.8 Mehr zu format
Hier eine kurze (unvollständige) Erklärung zu den fmt()
-Optionen, mehr unter help format
oder hier
2.8.1 %w.df
- Mit
w
geben wir die Gesamtbreite des Outputs an - die Vorzeichen und Dezimaltrenner mitgezählt d
gibt die Zahl der Dezimalstellen- Grundsätzlich wird von “rechts” gezählt - The result is right-justified.
Aus der Stata-Hilfe:
The number 5.139 in %12.2f
format displays as
----+----1--
5.14
Beispiele
help format
strlen("10789.1234") dis
10
display %10.2f 10789.1234 // 0 Nachkommastellen
display %10.0f 10789.1234 // 2 Nachkommastellen
display %11.5f 10789.1234 // 0 am Ende hinzugefügt
2.8.2 %w.dfc
Analog zu %w.df
, jedoch werden Kommata für bessere Lesbarkeit eingefügt. Auch die Kommata zählen für die Breite w
.
Während ``
Mit %
w**,**
dfc
können wir das Format für Dezimal- und Tausendertrenner ändern: Dezimalstellen werden mit einem ,
abgetrennt, 1000er mit .
Beispiele: mit fc
werden Tausendertrenner eingefügt
display %10.2fc 10789.1234
display %10.2fc 10789.1234
10,789.12
display %10,2fc 10789.1234 // , und . tauschen -> "dt Format"
10.789,12