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:

estpost tabstat F518_SUF, c(stat) stat(mean sd min max n)
esttab, cells("mean sd min max count")
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:

esttab, cells("mean p50 sd min max count")
                      (1)                                                                 
                                                                                          
                     mean          p50           sd          min          max        count
------------------------------------------------------------------------------------------
F518_SUF         3532.109                  3530.928            1        72000        16635
------------------------------------------------------------------------------------------
N                   16635                                                                 
------------------------------------------------------------------------------------------

tabstat mit p50 für Median:

estpost tabstat F518_SUF, c(stat) stat(mean p50 sd min max n)
esttab, cells("mean p50 sd min max count")
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 ausblenden
  • nomtitle \(\Rightarrow\) Modelltitel oben ausblenden (hier die Leerzeile)
  • noobs \(\Rightarrow\) Beobachtungszahl unten ausblenden
  • label \(\Rightarrow\) Variablenlaben verwenden
esttab, ///
    cells("mean p50 sd min max count") ///
    nonumber nomtitle noobs label
                             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, ///
    cells("mean sd min max count") ///
    nonumber nomtitle nonote noobs label ///
    collabels("Mean" "SD" "Median" "Min" "Max" "N") ///
    coeflabel(F518_SUF "Bruttoverdienst")
                             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, ///
    cells("mean(fmt(%13.2fc)) sd(fmt(%13.2fc)) min(fmt(%13.0fc)) max(fmt(%13.0fc)) count(fmt(%6.0fc))")  ///
    nonumber nomtitle nonote noobs label ///
    collabels("Mean" "SD" "Min" "Max" "N") ///
    coeflabel(F518_SUF "Bruttoverdienst")
                             Mean           SD          Min          Max            N
-------------------------------------------------------------------------------------
Bruttoverdienst          3,532.11     3,530.93            1       72,000       16,635
-------------------------------------------------------------------------------------

Übung 1


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 lesbare csv-Datei (mehr zum Excel-Export hier)
esttab using "${res}/tab1.rtf", ///
    cells("mean(fmt(%13.2fc)) sd(fmt(%13.2fc)) min(fmt(%4.0fc)) max(fmt(%4.0fc)) count(fmt(%4.0fc))")  ///
    nonumber nomtitle nonote noobs label ///
    collabels("Mean" "SD" "Min" "Max" "N") ///
    coeflabel(F518_SUF "Bruttoverdienst") ///
    replace
   
esttab using "${res}/tab1.tex", ///
    cells("mean(fmt(%13.2fc)) sd(fmt(%13.2fc)) min(fmt(%4.0fc)) max(fmt(%4.0fc)) count(fmt(%4.0fc))")  ///
    nonumber nomtitle nonote noobs label ///
    collabels("Mean" "SD" "Min" "Max" "N") ///
    coeflabel(F518_SUF "Bruttoverdienst")  ///
    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_SUF
return list
mat miss = r(miss)
mat colname miss = F518_SUF
mat list miss
    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:

esttab, cells("mean(fmt(%13.2fc)) sd(fmt(%13.2fc)) min max count(fmt(%13.0fc)) miss(fmt(%13.0fc))") ///
        noobs nomtitle nonumber label collabels("Mean" "SD" "Min" "Max" "N" "Missings") ///
    coeflabel(F518_SUF "Bruttoverdienst") 
                             Mean           SD          Min          Max            N     Missings
--------------------------------------------------------------------------------------------------
Bruttoverdienst          3,532.11     3,530.93         1.00    72,000.00       16,635        3,377
--------------------------------------------------------------------------------------------------

Übung 2


2.5 mehrere Variablen

Wir können natürlich auch mehrere Variablen in tabstat und damit in esttab aufnehmen:

estpost tabstat zpalter F518_SUF, c(stat) stat(mean sd min max n)
esttab, cells("mean(fmt(%13.2fc)) sd(fmt(%13.2fc)) min max count(fmt(%13.0fc))") noobs ///
        nomtitle nonumber label collabels("Mean" "SD" "Min" "Max" "N") ///
        coeflabel(F518_SUF "Bruttoverdienst" zpalter "Alter") 
                             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_SUF
return 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
    glo x = "zpalter F518_SUF" // auszuwertende Variablen
    glo len: word count ${x}    // wie viele sind es?
    mat m1 = J(1,${len},.)     // entsprechend lange Matrix erstellen J(Zeilen,Spalten,Inhalt)
    mat colname m1 = ${x}       // spalten schon mal richtig benennen
    mat list m1                 // ansehen

* Schleife über die angegebenen Variablen
    forval y = 1/$len {
        loc v: dis  word("${x}",`y') // y.tes Wort aus x in v ablegen
        display "`v'"               // zur Kontrolle: v anzeigen
        mdesc `v'                   // missings in v berechnen
        loc res_mat = r(miss)
        mat m1[1,`y'] = `res_mat'
    }
    mat l m1
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
esttab, cells("count(fmt(%13.0fc)) m1(fmt(%13.0fc))")  noobs ///
        nomtitle nonumber label collabels("N" "Missings") ///
    coeflabel(F518_SUF "Bruttoverdienst" zpalter "Alter")
                                N     Missings
----------------------------------------------
Alter                      19,836          176
Bruttoverdienst            16,635        3,377
----------------------------------------------

Übung 3


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

estpost tabstat zpalter F518_SUF, by(S1) c(stat) stat(mean sd)
estpost tabstat zpalter F518_SUF, by(S1) c(stat) stat(mean sd) nototal  
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:

esttab, cells(mean(fmt(%10.1fc)) sd(fmt(%13.3fc) par)) nostar  nonumber unstack ///
  nomtitle nonote noobs  ///
   collabels(none)  ///
   eqlabels("Männer" "Frauen") /// 
   nomtitles ///
   coeflabel(F518_SUF "Bruttoverdienst" zpalter "Alter")
                   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.

esttab, cells("mean(fmt(%10.1fc)) sd(fmt(%13.3fc) par)") nostar  nonumber unstack ///
  nomtitle nonote noobs label  ///
   collabels(none)  ///
   eqlabels("Männer" "Frauen") /// 
   nomtitles ///
   coeflabel(F518_SUF "Bruttoverdienst" zpalter "Alter")   
                           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.

esttab, cells("mean(fmt(%10.1fc)) sd(fmt(%13.3fc) par)") nostar  nonumber unstack ///
  nomtitle nonote noobs label  ///
   collabels("Mean" "SD" "Mean" "SD") ///
   eqlabels("Männer" "Frauen") /// 
   nomtitles ///
   coeflabel(F518_SUF "Bruttoverdienst" zpalter "Alter")   
                           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)
------------------------------------------------------------------------

Übung 4


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 um fastgini - so kommen Sie an die abgelegte Info:
ssc install fastgini // falls nicht schon installiert
fastgini F518_SUF
return 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_SUF
return list 

2.7.4 Übung

  • Erweitern Sie den Gruppenvergleich um die Variablen az (Wochenarbeitszeit) und F1104 (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
    dis strlen("10789.1234")
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