6  Regressionstabellen

6.1 regression

Regressionstabellen sind wohl der Klassiker des Tabellenexports.

Das grundsätzliche Vorgehen für das Erstellen von Regressionstabellen mit esttab ist etwas anders als bei den Deskriptionstabellen:

reg F518_SUF c.zpalter // einfaches Regressionsmodell
estimates store reg1     // Ergebnisse speichern
esttab reg1 // (ausgeblendet)

Mit ereturn list bekommen wir alle abrufbaren Informationen angezeigt:

      Source |       SS           df       MS      Number of obs   =    16,543
-------------+----------------------------------   F(1, 16541)     =    105.36
       Model |  1.3092e+09         1  1.3092e+09   Prob > F        =    0.0000
    Residual |  2.0555e+11    16,541    12426773   R-squared       =    0.0063
-------------+----------------------------------   Adj R-squared   =    0.0063
       Total |  2.0686e+11    16,542    12505168   Root MSE        =    3525.2

------------------------------------------------------------------------------
    F518_SUF |      Coef.   Std. Err.      t    P>|t|     [95% Conf. Interval]
-------------+----------------------------------------------------------------
     zpalter |   24.62253   2.398848    10.26   0.000     19.92053    29.32453
       _cons |    2381.28    115.577    20.60   0.000     2154.736    2607.823
------------------------------------------------------------------------------



scalars:
               e(rank) =  2
               e(ll_0) =  -158642.9792418738
                 e(ll) =  -158590.4618746699
               e(r2_a) =  .0062690083366028
                e(rss) =  205551251614.9366
                e(mss) =  1309236899.97876
               e(rmse) =  3525.162828161657
                 e(r2) =  .0063290815436915
                  e(F) =  105.3561454498825
               e(df_r) =  16541
               e(df_m) =  1
                  e(N) =  16543

macros:
            e(cmdline) : "regress F518_SUF c.zpalter"
              e(title) : "Linear regression"
          e(marginsok) : "XB default"
                e(vce) : "ols"
             e(depvar) : "F518_SUF"
                e(cmd) : "regress"
         e(properties) : "b V"
            e(predict) : "regres_p"
              e(model) : "ols"
          e(estat_cmd) : "regress_estat"

matrices:
                  e(b) :  1 x 2
                  e(V) :  2 x 2

functions:
             e(sample)   

Mit est dir bekommen wir übrigens eine Übersicht über alle Ergebnisse. Mit restore name können wir ein Modell “aktivieren”. Mit est drop _all können wir alle estimates löschen.

Alle unter e() abgespeicherten Informationen können wir direkt in unsere esttab einfügen. Los geht’s:

6.2 Eine Tabelle, ein Modell

esttab reg1 // Tabelle mit Standard-Einstellungen
                      (1)   
                 F518_SUF   
----------------------------
zpalter             24.62***
                  (10.26)   

_cons              2381.3***
                  (20.60)   
----------------------------
N                   16543   
----------------------------
t statistics in parentheses
* p<0.05, ** p<0.01, *** p<0.001

Das ist noch sehr basic. U.a. sind häufig statt der t-Werte die Standardfehler in Klammern genannt. Grundsätzlich können wir folgende Kennzahlen anfordern: + b Regressionskoeffizienten + se Standardfehler + t t-Werte + p p-Werte + ci 95%-Konfidenzintervalle + beta standardisierte Koeffizienten

esttab reg1, b se(%9.3f) label // Formatierung, SE statt t + Variablen Labels
                              (1)   
                     Wie hoch i~h   
------------------------------------
Alter der Zielp             24.62***
                          (2.399)   

Constant                   2381.3***
                        (115.577)   
------------------------------------
Observations                16543   
------------------------------------
Standard errors in parentheses
* p<0.05, ** p<0.01, *** p<0.001

Außerdem wollen wir in der Regel nicht nur die Fallzahl, sondern auch weitere Informationen zum Modell angeben. Dabei können wir auf die Liste, die wir vorhin bei ereturn list gesehen haben, zurückgreifen.

esttab reg1, b se(%9.3f) stats(N  r2 ll F) // Modellkennzahlen angeben (volle Liste oben bei ereturn list)
                      (1)   
                 F518_SUF   
----------------------------
zpalter             24.62***
                  (2.399)   

_cons              2381.3***
                (115.577)   
----------------------------
N                   16543   
r2                0.00633   
ll              -158590.5   
F                   105.4   
----------------------------
Standard errors in parentheses
* p<0.05, ** p<0.01, *** p<0.001

Diese Informationen können wir natürlich auch labeln und formatieren wie wir es schon kennengelernt haben. Auch coeflabel funktioniert hier so wie bei tabstat zuvor:

esttab reg1, b se(%9.3f) /// 
    stats(r2 r2_a N, fmt(%9.4f %9.4f %9.0fc) labels("R²" "adj. R²" "Observations")) /// N und R² labeln
    coeflabel(zpalter "Alter" _cons "Konstante")  // Koeffizienten links labeln
                      (1)   
                 F518_SUF   
----------------------------
Alter               24.62***
                  (2.399)   

Konstante          2381.3***
                (115.577)   
----------------------------
R²                 0.0063   
adj. R²            0.0063   
Observations       16,543   
----------------------------
Standard errors in parentheses
* p<0.05, ** p<0.01, *** p<0.001

Außerdem können wir mit mtitles die Beschrifung anpassen und mit nonumbers die Zahl oben ausblenden. Mit title können wir einen Tabellentitel und mit note eine Notiz unten hinzufügen. Wenn wir mehrere Zeilen möchten, dann geben wir einfach "Text in 1. Zeile" "Text in 2. Zeile" an:

esttab reg1, b se(%9.3f) /// 
    stats(r2 N, fmt(%9.3f %9.0g) labels(R² Observations)) ///
    coeflabel(zpalter "Alter" _cons "Konstante") ///
    mtitles("1. Modell") /// 
    nonumbers ///
    title(Tabellentitel)    /// Titel für die Tabelle
    addnotes("erste Anmerkung" "zweite Anmerkung darunter") // Notizen ganz unten
Tabellentitel
----------------------------
                1. Modell   
----------------------------
Alter               24.62***
                  (2.399)   

Konstante          2381.3***
                (115.577)   
----------------------------
R²                  0.006   
Observations        16543   
----------------------------
Standard errors in parentheses
erste Anmerkung
zweite Anmerkung darunter
* p<0.05, ** p<0.01, *** p<0.001

Auch Signifikanzsterne anpassen, mit star()

esttab reg1, b se(%9.3f) /// 
    stats(r2 N, fmt(%9.3f %9.0g) labels(R² Observations)) ///
    coeflabel(zpalter "Alter" _cons "Konstante") ///
    star(+ 0.10 * 0.05 ** 0.01 *** 0.001 **** 0.0001)
                      (1)    
                 F518_SUF    
-----------------------------
Alter               24.62****
                  (2.399)    

Konstante          2381.3****
                (115.577)    
-----------------------------
R²                  0.006    
Observations        16543    
-----------------------------
Standard errors in parentheses
+ p<0.10, * p<0.05, ** p<0.01, *** p<0.001, **** p<0.0001

Die Klammern können wir mit noparentheses unterdrücken oder mit brackets auf [] ändern.

6.2.1 Neben- statt untereinander

Dafür steht uns wide zur Verfügung:

esttab reg1, b se(%9.3f) /// 
    wide ///
    stats(r2 N, fmt(%9.3f %9.0g) labels(R² Observations)) ///
    coeflabel(zpalter "Alter" _cons "Konstante") ///
    title(Modelltitel)  ///
    addnotes("erste Anmerkung" "zweite Anmerkung darunter")
Modelltitel
-----------------------------------------
                      (1)                
                 F518_SUF                
-----------------------------------------
Alter               24.62***      (2.399)
Konstante          2381.3***    (115.577)
-----------------------------------------
R²                  0.006                
Observations        16543                
-----------------------------------------
Standard errors in parentheses
erste Anmerkung
zweite Anmerkung darunter
* p<0.05, ** p<0.01, *** p<0.001

Leider funktioniert das nicht für mehr als zwei Kennzahlen:

esttab reg1,b se(%9.3f) ci(%9.3f) p(%9.3f) /// 
            wide ///
            stats(r2 N, fmt(%9.3f %9.0g) labels(R² Observations)) ///
            coeflabel(zpalter "Alter" _cons "Konstante") ///
            star(+ 0.10 * 0.05 ** 0.01 *** 0.001 **** 0.0001) ///
            title(Modelltitel)      ///
            addnotes("erste Anmerkung" "zweite Anmerkung darunter")
only one allowed of z, se, p, ci, and aux()
r(198);

end of do-file
r(198);

Hier müssen wir dann auf cells() und "" zurückgreifen. Mit ci_l und ci_u statt ci bekommen wir außerdem die untere und obere KI-Grenze in separaten Spalten angezeigt, was das Ganze etwas übersichtlicher macht:

esttab reg1, cells("b se(fmt(%9.3f)) ci(fmt(%9.2f)) p(fmt(%9.3f))")
esttab reg1, cells("b se(fmt(%9.3f)) ci_l(fmt(%9.2f)) ci_u(fmt(%9.2f)) p(fmt(%9.3f))") // Übersichtlicher: KIs aufteilen in zwei Spalten
                      (1)                                       
                 F518_SUF                                       
                        b           se         ci95            p
----------------------------------------------------------------
zpalter          24.62253        2.399  19.92,29.32        0.000
_cons             2381.28      115.577 2154.74,2607.82        0.000
----------------------------------------------------------------
N                   16543                                       
----------------------------------------------------------------


-----------------------------------------------------------------------------
                      (1)                                                    
                 F518_SUF                                                    
                        b           se        min95        max95            p
-----------------------------------------------------------------------------
zpalter          24.62253        2.399        19.92        29.32        0.000
_cons             2381.28      115.577      2154.74      2607.82        0.000
-----------------------------------------------------------------------------
N                   16543                                                    
-----------------------------------------------------------------------------

Auch das können wir labeln - mit collabels:

esttab reg1, cells("b se(fmt(%9.3f)) ci_l(fmt(%9.2f)) ci_u(fmt(%9.2f)) p(fmt(%9.3f))") ///
            collabels("B" "SE" "u.KI" "o.KI" "p")       // labels
                      (1)                                                    
                 F518_SUF                                                    
                        B           SE         u.KI         o.KI            p
-----------------------------------------------------------------------------
zpalter          24.62253        2.399        19.92        29.32        0.000
_cons             2381.28      115.577      2154.74      2607.82        0.000
-----------------------------------------------------------------------------
N                   16543                                                    
-----------------------------------------------------------------------------

Übung


6.3 kategoriale unabhängige Variable

Für kategoriale unabhängige Variablen stellt sich noch die Herausforderung, dass wir die Referenzkategorie richtig angeben möchten.

reg F518_SUF i.S1
estimates store reg2
esttab reg2,  b se(%9.3f)   ///
    coeflabel(1.S1 "Maenner" 2.S1 "Frauen" _cons "Konstante")
                      (1)   
                 F518_SUF   
----------------------------
Maenner                 0   
                      (.)   

Frauen            -1431.8***
                 (53.630)   

Konstante          4232.7***
                 (37.515)   
----------------------------
N                   16635   
----------------------------
Standard errors in parentheses
* p<0.05, ** p<0.01, *** p<0.001

Um Referenzkategorie in der Tabelle kennzuzeichnen, muss die Regression mit xi: erstellt werden. Der Koeffizienten für S1 = 2 ist dann _IS1_2:

xi: reg F518_SUF i.S1
estimates store reg2b
esttab reg2b,  b se(%9.3f)  /// 
    coeflabel(_IS1_2 "Frauen" _cons "Konstante")
                      (1)   
                 F518_SUF   
----------------------------
Frauen            -1431.8***
                 (53.630)   

Konstante          4232.7***
                 (37.515)   
----------------------------
N                   16635   
----------------------------
Standard errors in parentheses
* p<0.05, ** p<0.01, *** p<0.001

Mit refcat() können wir jetzt eine Zeile in die Tabelle einfüge. Dazu geben wir die Variable an, überhalb derer die Zeile eingefügt werden soll (hier also _IS1_2) und den Text, der links in der Beschriftung angezeigt werden soll:

esttab reg2b,  b se(%9.3f)  /// 
    coeflabel(_IS1_2 "Frauen" _cons "Konstante") ///
    refcat(_IS1_2 "Männer")
                      (1)   
                 F518_SUF   
----------------------------
Männer               ref.   

Frauen            -1431.8***
                 (53.630)   

Konstante          4232.7***
                 (37.515)   
----------------------------
N                   16635   
----------------------------
Standard errors in parentheses
* p<0.05, ** p<0.01, *** p<0.001

Mit label("Referenzkategorie") können wir ref. ersetzen. Mit below wird die Zeile unter der angegebenen Variable eingefügt.

esttab reg2b,  b se(%9.3f)  /// 
    coeflabel(_IS1_2 "Frauen" _cons "Konstante") ///
    refcat(_IS1_2 "Männer", label("Referenzkategorie") below)   

Übung


6.4 mehrere Regressionsmodelle nebeneinander

Häufig haben wir aber mehrere Regressionsmodelle, die aufeinander aufbauen und sich alle auf die gleiche abhängige Variable beziehen. Für eine Übersicht werden solche Modelle häufig nebeneinander gestellt in einer Tabelle gezeigt. Auch das geht mit esttab.

Wir können nämlich mit estimates store (est store) auch mehrere Modelle speichern und dann namentlich aufrufen.

Dafür könnnen wir auch “wild cards” verwenden - also * als Platzhalter für “alles oder nichts” und ? für “irgendein Zeichen”. Mit est dir bekommen wir eine Liste alle gespeicherten Ergebnisse ausgegeben. estimates clear löst alle Ergebnisse, est drop name nur das Modell name.

Genestete Modelle lassen sich mit einer Schleife elegant erstellen. Wir können dafür in globals die Kontrollvariablen angeben und anschließend die Modelle nacheinander schätzen lassen.

glo mod1 " "
glo mod2 "c.zpalter"
glo mod3 "c.zpalter##c.zpalter"
glo mod4 "c.zpalter##c.zpalter i.m1202"

forval i = 1/4 {
    xi: reg F518_SUF i.S1 ${mod`i'}
    est store regm`i'
}
esttab regm*,  b se(%9.3f)
                      (1)             (2)             (3)             (4)   
                 F518_SUF        F518_SUF        F518_SUF        F518_SUF   
----------------------------------------------------------------------------
_IS1_2            -1431.8***      -1471.7***      -1496.8***      -1458.5***
                 (53.630)        (53.722)        (53.768)        (52.124)   

zpalter                             28.45***        146.5***        130.8***
                                  (2.350)        (17.208)        (16.839)   

c.zpalter#~r                                       -1.317***       -1.193***
                                                  (0.190)         (0.186)   

_Im1202_2                                                           470.2***
                                                                (119.627)   

_Im1202_3                                                          1114.5***
                                                                (143.641)   

_Im1202_4                                                          2322.9***
                                                                (120.657)   

_cons              4232.7***       2922.0***        467.3          -334.3   
                 (37.515)       (114.755)       (372.647)       (364.132)   
----------------------------------------------------------------------------
N                   16635           16543           16543           16521   
----------------------------------------------------------------------------
Standard errors in parentheses
* p<0.05, ** p<0.01, *** p<0.001

Auch hier lohnt sich aber natürlich etwas label-Arbeit:

esttab regm*,  b se(%9.3f) ///
    coeflabel(_IS1_2 "Frauen" zpalter "Alter" ///
              c.zpalter#c.zpalter "Alter²" ///
              _Im1202_2  "dual/schul. Abs." ///    
              _Im1202_3  "Meister/Techniker" ///
              _Im1202_4  "Hochschule/Uni" ///
              _cons "Konstante") ///
    refcat(_IS1_2 "Männer" ///
           _Im1202_2 "kein Abs.")   ///
           nomtitle ///
    stats(r2 N, fmt(%9.3f %9.0g) labels(R² Observations)) ///
    varwidth(20)
                              (1)             (2)             (3)             (4)   
------------------------------------------------------------------------------------
Männer                       ref.            ref.            ref.            ref.   

Frauen                    -1431.8***      -1471.7***      -1496.8***      -1458.5***
                         (53.630)        (53.722)        (53.768)        (52.124)   

Alter                                       28.45***        146.5***        130.8***
                                          (2.350)        (17.208)        (16.839)   

Alter²                                                     -1.317***       -1.193***
                                                          (0.190)         (0.186)   

kein Abs.                                                                    ref.   

dual/schul. Abs.                                                            470.2***
                                                                        (119.627)   

Meister/Techniker                                                          1114.5***
                                                                        (143.641)   

Hochschule/Uni                                                             2322.9***
                                                                        (120.657)   

Konstante                  4232.7***       2922.0***        467.3          -334.3   
                         (37.515)       (114.755)       (372.647)       (364.132)   
------------------------------------------------------------------------------------
R²                          0.041           0.049           0.052           0.117   
Observations                16635           16543           16543           16521   
------------------------------------------------------------------------------------
Standard errors in parentheses
* p<0.05, ** p<0.01, *** p<0.001

Übung


6.5 Nur ein Koeffizient

Manchmal möchten wir die Tabelle etwas entrümpeln und nur den interessierenden Koeffizienten behalten, das geht mit keep():

esttab regm*,  b se(%9.3f) keep(_IS1_2)
esttab regm*,  b se(%9.3f) keep(_IS1_2 zpalter) // mehrere mit Leerzeichen
                      (1)             (2)             (3)             (4)   
                 F518_SUF        F518_SUF        F518_SUF        F518_SUF   
----------------------------------------------------------------------------
_IS1_2            -1431.8***      -1471.7***      -1496.8***      -1458.5***
                 (53.630)        (53.722)        (53.768)        (52.124)   
----------------------------------------------------------------------------
N                   16635           16543           16543           16521   
----------------------------------------------------------------------------
Standard errors in parentheses
* p<0.05, ** p<0.01, *** p<0.001


----------------------------------------------------------------------------
                      (1)             (2)             (3)             (4)   
                 F518_SUF        F518_SUF        F518_SUF        F518_SUF   
----------------------------------------------------------------------------
_IS1_2            -1431.8***      -1471.7***      -1496.8***      -1458.5***
                 (53.630)        (53.722)        (53.768)        (52.124)   

zpalter                             28.45***        146.5***        130.8***
                                  (2.350)        (17.208)        (16.839)   
----------------------------------------------------------------------------
N                   16635           16543           16543           16521   
----------------------------------------------------------------------------
Standard errors in parentheses
* p<0.05, ** p<0.01, *** p<0.001

Allerdings fehlt hier jetzt die Information, welche Kontrollvariablen jeweils im Modell waren. Da kann uns estadd local weiter helfen. Damit können wir einen Text zu jedem estimate hinzufügen und den dann unten in der Tabelle ausgeben lassen. Wir erweitern unsere Schleife also und lassen sie nochmal laufen. Mit scalars("note Kontrollvariablen") werden die vorher abgelegten notes dann als Zeile Kontrollvariablen in der Tabelle angezeigt. Mit modelwidth() können wir die Breite der Spalten steuern.

glo mod1 " "
glo mod2 "c.zpalter"
glo mod3 "c.zpalter##c.zpalter"
glo mod4 "c.zpalter##c.zpalter i.m1202"

forval i = 1/4 {
    xi: reg F518_SUF i.S1 ${mod`i'}
    est store regm`i'
    estadd local note "${mod`i'}"
}
esttab regm*,  b se(%9.3f) keep(_IS1_2) scalars("note Kontrollvariablen")
esttab regm*,  b se(%9.3f) keep(_IS1_2) scalars("note Kontrollvariablen") ///
    modelwidth(25) ///
    coeflabel(_IS1_2 "Frauen") ///
    refcat(_IS1_2 "Männer")
                      (1)             (2)             (3)             (4)   
                 F518_SUF        F518_SUF        F518_SUF        F518_SUF   
----------------------------------------------------------------------------
_IS1_2            -1431.8***      -1471.7***      -1496.8***      -1458.5***
                 (53.630)        (53.722)        (53.768)        (52.124)   
----------------------------------------------------------------------------
N                   16635           16543           16543           16521   
Kontrollva~n                    c.zpalter    c.zpalter##c.zpalter    c.zpalter##c.zpalter i.m1202   
----------------------------------------------------------------------------
Standard errors in parentheses
* p<0.05, ** p<0.01, *** p<0.001


--------------------------------------------------------------------------------------------------------------------------------
                                   (1)                          (2)                          (3)                          (4)   
                              F518_SUF                     F518_SUF                     F518_SUF                     F518_SUF   
--------------------------------------------------------------------------------------------------------------------------------
Männer                            ref.                         ref.                         ref.                         ref.   

Frauen                         -1431.8***                   -1471.7***                   -1496.8***                   -1458.5***
                              (53.630)                     (53.722)                     (53.768)                     (52.124)   
--------------------------------------------------------------------------------------------------------------------------------
N                                16635                        16543                        16543                        16521   
Kontrollva~n                                              c.zpalter         c.zpalter##c.zpalter    c.zpalter##c.zpalter i.m1202   
--------------------------------------------------------------------------------------------------------------------------------
Standard errors in parentheses
* p<0.05, ** p<0.01, *** p<0.001

Mit der regex-Funktion ustrregexra("","Suchtext", "Ersetztext") können wir aus den Variablenangaben auch noch sprechendere Bezeichnungen machen. Die Option quietly vor dem reg-Befehl unterdrückt die Standard-Regressionstabelle von Stata.

forval i = 1/4 {
    quietly xi: reg F518_SUF i.S1 ${mod`i'}
    est store regm`i'
    
    loc note "${mod`i'}"
    loc note = ustrregexra("`note'","^\s", "-") // ^\s = "an Anfang Leerzeichen"
    loc note = ustrregexra("`note'","c.zpalter##c.zpalter", "Alter & Alter^2") 
    loc note = ustrregexra("`note'","c.zpalter", "Alter")
    loc note = ustrregexra("`note'"," i.m1202", ", Ausbildung")
    estadd local note "`note'"
    }
  
esttab regm*,  b se(%9.3f) keep(_IS1_2) scalars("note Kontrollvariablen") ///
    modelwidth(25) ///
    varwidth(17) ///
    coeflabel(_IS1_2 "Frauen") ///
    refcat(_IS1_2 "Männer") ///
    nomtitle
                                        (1)                          (2)                          (3)                          (4)   
-------------------------------------------------------------------------------------------------------------------------------------
Männer                                 ref.                         ref.                         ref.                         ref.   

Frauen                              -1431.8***                   -1471.7***                   -1496.8***                   -1458.5***
                                   (53.630)                     (53.722)                     (53.768)                     (52.124)   
-------------------------------------------------------------------------------------------------------------------------------------
N                                     16635                        16543                        16543                        16521   
Kontrollvariablen                         -                        Alter              Alter & Alter^2    Alter & Alter^2, Ausbildung   
-------------------------------------------------------------------------------------------------------------------------------------
Standard errors in parentheses
* p<0.05, ** p<0.01, *** p<0.001

Übung


6.6 mehrere Modellgruppen

Manchmal möchten wir auch getrennte Modelle nebeneinander stellen. Auch das geht natürlich. Hier also eine Schleife über die Werte 1 und 2 von S1, also getrennte Modelle für Männer und Frauen durch die Bedingung if S1 == s am Ende des reg-Befehls:

forvalues s = 1/2 {
        
    reg F518_SUF c.zpalter##c.zpalter if S1 == `s'
    est store reg_`s'_1
    estadd local note "Alter & Alter^2"
    
    reg F518_SUF c.zpalter##c.zpalter i.m1202  if S1 == `s'
    est store reg_`s'_2
    estadd local note "Alter & Alter^2, Ausbildung"
}
esttab reg_*
                      (1)             (2)             (3)             (4)   
                 F518_SUF        F518_SUF        F518_SUF        F518_SUF   
----------------------------------------------------------------------------
zpalter             213.0***        192.2***        42.43           33.35   
                   (8.44)          (7.78)          (1.88)          (1.51)   

c.zpalter#~r       -1.930***       -1.810***       -0.326          -0.217   
                  (-6.90)         (-6.63)         (-1.31)         (-0.89)   

1.m1202                                 0                               0   
                                      (.)                             (.)   

2.m1202                             390.5*                          524.5***
                                   (2.12)                          (3.56)   

3.m1202                            1172.5***                       1020.9***
                                   (5.45)                          (5.55)   

4.m1202                            2549.6***                       2046.7***
                                  (13.72)                         (13.76)   

_cons             -1210.6*        -1824.9***       1560.8**         606.5   
                  (-2.22)         (-3.43)          (3.15)          (1.25)   
----------------------------------------------------------------------------
N                    8451            8442            8092            8079   
----------------------------------------------------------------------------
t statistics in parentheses
* p<0.05, ** p<0.01, *** p<0.001

Mit mgroups können wir dann mehrere Spalten überschreiben. pattern gibt dabei die Gruppierung an: 1 steht für “(nächstes) Label”, 0 für “unter vorheriges einordnen”.

esttab reg_*, r2 ///
     mgroups("Männer" "Frauen", pattern(1 0 1 0))
esttab reg_*, r2 ///
     mgroups("" "Männer" "Frauen", pattern(1 1 0 1 ))
                   Männer                          Frauen                   
                      (1)             (2)             (3)             (4)   
                 F518_SUF        F518_SUF        F518_SUF        F518_SUF   
----------------------------------------------------------------------------
zpalter             213.0***        192.2***        42.43           33.35   
                   (8.44)          (7.78)          (1.88)          (1.51)   

c.zpalter#~r       -1.930***       -1.810***       -0.326          -0.217   
                  (-6.90)         (-6.63)         (-1.31)         (-0.89)   

1.m1202                                 0                               0   
                                      (.)                             (.)   

2.m1202                             390.5*                          524.5***
                                   (2.12)                          (3.56)   

3.m1202                            1172.5***                       1020.9***
                                   (5.45)                          (5.55)   

4.m1202                            2549.6***                       2046.7***
                                  (13.72)                         (13.76)   

_cons             -1210.6*        -1824.9***       1560.8**         606.5   
                  (-2.22)         (-3.43)          (3.15)          (1.25)   
----------------------------------------------------------------------------
N                    8451            8442            8092            8079   
R-sq                0.021           0.089           0.003           0.072   
----------------------------------------------------------------------------
t statistics in parentheses
* p<0.05, ** p<0.01, *** p<0.001


----------------------------------------------------------------------------
                                   Männer                          Frauen   
                      (1)             (2)             (3)             (4)   
                 F518_SUF        F518_SUF        F518_SUF        F518_SUF   
----------------------------------------------------------------------------
zpalter             213.0***        192.2***        42.43           33.35   
                   (8.44)          (7.78)          (1.88)          (1.51)   

c.zpalter#~r       -1.930***       -1.810***       -0.326          -0.217   
                  (-6.90)         (-6.63)         (-1.31)         (-0.89)   

1.m1202                                 0                               0   
                                      (.)                             (.)   

2.m1202                             390.5*                          524.5***
                                   (2.12)                          (3.56)   

3.m1202                            1172.5***                       1020.9***
                                   (5.45)                          (5.55)   

4.m1202                            2549.6***                       2046.7***
                                  (13.72)                         (13.76)   

_cons             -1210.6*        -1824.9***       1560.8**         606.5   
                  (-2.22)         (-3.43)          (3.15)          (1.25)   
----------------------------------------------------------------------------
N                    8451            8442            8092            8079   
R-sq                0.021           0.089           0.003           0.072   
----------------------------------------------------------------------------
t statistics in parentheses
* p<0.05, ** p<0.01, *** p<0.001

6.7 Einmal mit allem

All diese Formatierungen sind natürlich kombinierbar:

  glo mod1 " "
  glo mod2 "c.zpalter"
  glo mod3 "c.zpalter##c.zpalter"
  glo mod4 "c.zpalter##c.zpalter i.m1202"

    forvalues s = 1/2 {
            
        xi: reg F518_SUF c.zpalter##c.zpalter if S1 == `s'
        est store reg_`s'_1
        estadd local note "Alter & Alter^2"
        
        xi:  reg F518_SUF c.zpalter##c.zpalter i.m1202  if S1 == `s'
        est store reg_`s'_2
        estadd local note "Alter & Alter^2, Ausbildung"
    }

esttab reg_* , ///
        b se(%9.3f)  ///
        nomtitle ///
        coeflabel(_IS1_2 "Frauen" zpalter "Alter" ///
              c.zpalter#c.zpalter "Alter²" ///
              _Im1202_2  "dual/schul. Abs." ///    
              _Im1202_3  "Meister/Techniker" ///
              _Im1202_4  "Hochschule/Uni" ///
              _cons "Konstante") ///
        stats(r2 N, fmt(%9.3f %9.0g) labels(R² Observations)) ///
    refcat(_Im1202_2 "kein Abs.") ///
     mgroups("Männer" "Frauen", pattern(1 0 1 0)) ///
  varwidth(20)
                           Männer                          Frauen                   
                              (1)             (2)             (3)             (4)   
------------------------------------------------------------------------------------
Alter                       213.0***        192.2***        42.43           33.35   
                         (25.236)        (24.688)        (22.611)        (22.120)   

Alter²                     -1.930***       -1.810***       -0.326          -0.217   
                          (0.280)         (0.273)         (0.249)         (0.243)   

dual/schul. Abs.                            390.5*                          524.5***
                                        (183.930)                       (147.488)   

Meister/Techniker                          1172.5***                       1020.9***
                                        (215.289)                       (183.784)   

Hochschule/Uni                             2549.6***                       2046.7***
                                        (185.774)                       (148.792)   

Konstante                 -1210.6*        -1824.9***       1560.8**         606.5   
                        (544.709)       (532.431)       (494.799)       (483.370)   
------------------------------------------------------------------------------------
R²                          0.021           0.089           0.003           0.072   
Observations                 8451            8442            8092            8079   
------------------------------------------------------------------------------------
Standard errors in parentheses
* p<0.05, ** p<0.01, *** p<0.001

6.8 Übungen

6.8.1 Übung

  • Erstellen Sie ein bivariates Regressionsmodell mit F518_SUF als abhängiger und az als unabhängiger Variable.
reg F518_SUF az
  • Speichern Sie die Ergebnisse mit estimates store und erstellen Sie eine Tabelle mit esttab
  • Wie können Sie die Standardfehler statt der t-Werte anzeigen lassen?
  • Lassen Sie sich auch das R² und die Fallzahl ausgeben.
  • Labeln Sie die Variablen links in der Tabelle.
  • Verändern Sie das Signifikanzniveau
  • Lassen Sie sich den Koeffizienten, den SE, die 95%-KI-Grenzen, den t-Wert und den p-Wert für die Variable und die Konstante neben- statt untereinander anzeigen.

6.8.2 Übung

  • Erstellen Sie ein bivariates Regressionsmodell mit F518_SUF als abhängiger und mig als unabhängiger Variable. In mig01 steht dann 0 für keinen Migrationshintergrund und 1 für Migrationshintergrund (siehe auch 01_init.do):
gen mig01 = Mig != 0  if !missing(Mig)
reg F518_SUF i.mig01
  • Erstellen Sie das Modell mit Hilfe von xi so, dass Sie die Referenzkategorie beschriften können.
  • FÜgen Sie die Beschriftung für die Referenzkategorie ein.

6.8.3 Übung

  • Erstellen Sie ein Regressionsmodell, welches schrittweise mehrere Variablen aufnimmt:
est dir // liste alle gespeicherten Ergebnisse
estimates clear

glo mod1 " "
glo mod2 "c.zpalter"
glo mod3 "c.zpalter##c.zpalter"
glo mod4 "c.zpalter##c.zpalter i.m1202"

forval i = 1/4 {
    xi: reg az i.S1 ${mod`i'}
    est store regmx`i'
}

est dir
esttab regmx*,  b se(%9.3f)
  • Stellen Sie die Ergebnisse in einer Tabelle nebeneinander dar.
  • Labeln Sie Variablen und wie oben gezeigt und verändern Sie die labels

6.8.4 Übung

  • Verwenden Sie die Modellserie von gerade eben (Übung 3), behalten Sie aber den Koeffizienten für das Geschlecht in ihrer Tabelle.
  • Wie müssen Sie die Schleife für die Modellserie aus Übung 3 anpassen, um die Kontrollvariablen in einer Zeile unten einzufügen?

6.8.5 Übung

  • Schätzen Sie getrennte Modelle für mig01=0 und mig01=1 mit den Kontrollvariablen aus Übung 3. Passen Sie also die Schleife von oben an, sodass jeweils zwei Modelle für die Gruppen mig01=0 und mig01=1 geschätzt werden:
forvalues m = 0/1 {
        
    xi: reg F518_SUF c.zpalter##c.zpalter if mig01 == `m'
    est store reg_`s'_1
    estadd local note "Alter & Alter^2"
    
    xi: reg F518_SUF c.zpalter##c.zpalter i.m1202  if mig01 == `m'
    est store reg_`s'_2
    estadd local note "Alter & Alter^2, Ausbildung"
}
esttab reg_*
  • Fügen Sie jetzt Gruppenlabels ein und labeln Sie die Tabelle entsprechend der kennengelernten Optionen.