Replizieren der "robusten" Option von Stata in R


39

Ich habe versucht, die Ergebnisse der Option Stata robustin R zu replizieren . Ich habe den rlmBefehl aus dem MASS-Paket und auch den Befehl lmrobaus dem Paket "robustbase" verwendet. In beiden Fällen unterscheiden sich die Ergebnisse erheblich von der Option "robust" in Stata. Kann jemand bitte etwas in diesem Zusammenhang vorschlagen?

Hier sind die Ergebnisse, die ich erhalten habe, als ich die robuste Option in Stata ausgeführt habe:

. reg yb7 buildsqb7 no_bed no_bath rain_harv swim_pl pr_terrace, robust

Linear regression                                      Number of obs =    4451
                                                       F(  6,  4444) =  101.12
                                                       Prob > F      =  0.0000
                                                       R-squared     =  0.3682
                                                       Root MSE      =   .5721

------------------------------------------------------------------------------
             |               Robust
         yb7 |      Coef.   Std. Err.      t    P>|t|     [95% Conf. Interval]
-------------+----------------------------------------------------------------
   buildsqb7 |   .0046285   .0026486     1.75   0.081    -.0005639     .009821
      no_bed |   .3633841   .0684804     5.31   0.000     .2291284    .4976398
     no_bath |   .0832654   .0706737     1.18   0.239    -.0552904    .2218211
   rain_harv |   .3337906   .0395113     8.45   0.000     .2563289    .4112524
     swim_pl |   .1627587   .0601765     2.70   0.007     .0447829    .2807346
  pr_terrace |   .0032754   .0178881     0.18   0.855    -.0317941    .0383449
       _cons |   13.68136   .0827174   165.40   0.000     13.51919    13.84353

Und das habe ich in R mit der Option lmrob erhalten:

> modelb7<-lmrob(yb7~Buildsqb7+No_Bed+Rain_Harv+Swim_Pl+Gym+Pr_Terrace, data<-bang7)
> summary(modelb7)

Call:
lmrob(formula = yb7 ~ Buildsqb7 + No_Bed + Rain_Harv + Swim_Pl + Gym + Pr_Terrace, 
    data = data <- bang7)
 \--> method = "MM"
Residuals:
      Min        1Q    Median        3Q       Max 
-51.03802  -0.12240   0.02088   0.18199   8.96699 

Coefficients:
             Estimate Std. Error t value Pr(>|t|)    
(Intercept) 12.648261   0.055078 229.641   <2e-16 ***
Buildsqb7    0.060857   0.002050  29.693   <2e-16 ***
No_Bed       0.005629   0.019797   0.284   0.7762    
Rain_Harv    0.230816   0.018290  12.620   <2e-16 ***
Swim_Pl      0.065199   0.028121   2.319   0.0205 *  
Gym          0.023024   0.014655   1.571   0.1162    
Pr_Terrace   0.015045   0.013951   1.078   0.2809    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1   1

Robust residual standard error: 0.1678 
Multiple R-squared:  0.8062,    Adjusted R-squared:  0.8059 

3
Willkommen bei Cross Validated! Ich habe Ihren Titel ein wenig aussagekräftiger gemacht und einige Formatierungen hinzugefügt. Im Allgemeinen sind Programmierfragen hier nicht zum Thema, aber ich denke, Ihre sind, weil sie statistische Probleme mit sich bringen. Ich hoffe, wir sehen uns ...
Matt Krause

3
Es wäre sehr hilfreich, wenn Sie zumindest den Code einfügen würden, der zum Schätzen der Modelle in Stata und R verwendet wird (noch besser, wenn Sie ein vollständig reproduzierbares Beispiel angeben). Wenn Sie "Ergebnisse unterscheiden" sagen - Wenn Sie dasselbe Modell schätzen, sollten sich nur die Standardfehler unterscheiden, nicht die Koeffizientenschätzungen.
Andy W

Okay ... Dies sind die Ergebnisse, die ich mit der robusten Option in STATA erhalten habe:
user56579

5
sieht lmrobnicht so aus wie reg y x, robust. Google "heteroskedasticity-konsistente Standardfehler R". Sie erhalten Seiten, die Ihnen den Umgang mit den Bibliotheken lmtestund zeigen sandwich.
generic_user

3
Stata verwendet einen kleinen Probenkorrekturfaktor von n / (nk). R macht normalerweise etwas anderes, also stellen Sie sicher, dass Sie sich darauf einstellen.
Dimitriy V. Masterov

Antworten:


47

Charles ist fast da in seiner Antwort, aber die robustOption des regressBefehls (und anderer Regressionsschätzungsbefehle) in Stata ermöglicht die Verwendung mehrerer Arten von Heteroskedastizitäts- und Autokorrelations-robusten Varianz-Kovarianz-Matrixschätzern, ebenso wie die coeftestFunktion im lmtestPaket, die in wiederum hängt von den jeweiligen Varianz-Kovarianz-Matrizen ab, die von der vcovHCFunktion im sandwichPaket erzeugt werden.

Die von den beiden verwendeten Standard-Varianz-Kovarianz-Matrizen unterscheiden sich jedoch:
1. Die von zurückgegebene Standard-Varianz-Kovarianz-Matrix vcocHCist die sogenannte HC3aus Gründen, die in der Manpage für beschrieben sind vcovHC.
2. Die sandwichvon Charles coeftestverwendete Option verwendet die HC0robuste Varianz-Kovarianz-Matrix.
3. Um das Standardverhalten von Stata für die Verwendung der robustOption in einem Aufruf an zu reproduzieren , müssen regressSie die vcovHCVerwendung der HC1robusten Varianz-Kovarianz-Matrix anfordern .

Lesen Sie hier mehr darüber .

Das folgende Beispiel, das alle oben genannten Punkte demonstriert, basiert auf dem hier gezeigten Beispiel .

library(foreign)
library(sandwich)
library(lmtest)

dfAPI = read.dta("http://www.ats.ucla.edu/stat/stata/webbooks/reg/elemapi2.dta")
lmAPI = lm(api00 ~ acs_k3 + acs_46 + full + enroll, data= dfAPI)
summary(lmAPI)                                  # non-robust

# check that "sandwich" returns HC0
coeftest(lmAPI, vcov = sandwich)                # robust; sandwich
coeftest(lmAPI, vcov = vcovHC(lmAPI, "HC0"))    # robust; HC0 

# check that the default robust var-cov matrix is HC3
coeftest(lmAPI, vcov = vcovHC(lmAPI))           # robust; HC3 
coeftest(lmAPI, vcov = vcovHC(lmAPI, "HC3"))    # robust; HC3 (default)

# reproduce the Stata default
coeftest(lmAPI, vcov = vcovHC(lmAPI, "HC1"))    # robust; HC1 (Stata default)

Die letzte Codezeile oben gibt die Ergebnisse von Stata wieder:

use http://www.ats.ucla.edu/stat/stata/webbooks/reg/elemapi2
regress api00 acs_k3 acs_46 full enroll, robust

Link zu Daten ist tot. Können Sie bitte den Link aktualisieren? Entspricht diese Datei: faculty.smu.edu/tfomby/eco5350/data/Examples/elemapi2.dta ?
Vasili111

Wie reproduziere ich auch Konfidenzintervalle?
Vasili111


10

Ab April 2018, glaube ich, möchten Sie das estimatrPaket , das einen beinahe Rückgang des Ersatzes für bietet lm. Einige Beispiele fast aus der Dokumentation entnommen:

library(estimatr)
library(car)

# HC1 robust standard errors
model <- lm_robust(GPA_year2 ~ gpa0 + ssp, data = alo_star_men,
                   se_type = "stata")
summary(model)
#> 
#> Call:
#> lm_robust(formula = GPA_year2 ~ gpa0 + ssp, data = alo_star_men, 
#>     se_type = "stata")
#> 
#> Standard error type:  HC1 
#> 
#> Coefficients:
#>             Estimate Std. Error  Pr(>|t|) CI Lower CI Upper  DF
#> (Intercept) -3.60625    1.60084 0.0258665 -6.77180  -0.4407 137
#> gpa0         0.06814    0.02024 0.0009868  0.02812   0.1082 137
#> ssp          0.31917    0.18202 0.0817589 -0.04077   0.6791 137
#> 
#> Multiple R-squared:  0.09262 ,   Adjusted R-squared:  0.07937 
#> F-statistic: 6.992 on 2 and 137 DF,  p-value: 0.001284

# HC1 cluster robust standard errors
model2 <- lm_robust(GPA_year2 ~ gpa0 + ssp, cluster = ssp,
                   data = alo_star_men, se_type = "stata")
summary(model2)
#> 
#> Call:
#> lm_robust(formula = GPA_year2 ~ gpa0 + ssp, data = alo_star_men, 
#>     clusters = ssp, se_type = "stata")
#> 
#> Standard error type:  stata 
#> 
#> Coefficients:
#>             Estimate Std. Error Pr(>|t|) CI Lower CI Upper DF
#> (Intercept) -3.60625   1.433195 0.240821 -21.8167  14.6042  1
#> gpa0         0.06814   0.018122 0.165482  -0.1621   0.2984  1
#> ssp          0.31917   0.004768 0.009509   0.2586   0.3798  1
#> 
#> Multiple R-squared:  0.09262 ,   Adjusted R-squared:  0.07937 
#> F-statistic: 6.992 on 2 and 137 DF,  p-value: 0.001284

Das carPaket macht es dann einfach, Omnibus-Hypothesentests für diese Modelle durchzuführen:

linearHypothesis(model, c("gpa0 = ssp"))
#> Linear hypothesis test
#> 
#> Hypothesis:
#> gpa0 - ssp = 0
#> 
#> Model 1: restricted model
#> Model 2: GPA_year2 ~ gpa0 + ssp
#> 
#>   Res.Df Df  Chisq Pr(>Chisq)
#> 1    138                     
#> 2    137  1 1.8859     0.1697

4

Ich würde die Frage bearbeiten. Sie verwechseln die robuste Regression mit dem robusten Befehl von Stata. Es scheint keinen Nutzen zu bringen, diese Verwirrung einzuführen.

Ich denke, es gibt einige Ansätze. Ich habe sie nicht alle angeschaut und bin mir nicht sicher, welches das Beste ist:

Das Sandwich-Paket:

library(sandwich)    
coeftest(model, vcov=sandwich)

Aber das gibt mir nicht die gleichen Antworten, die ich aus irgendeinem Grund von Stata bekomme. Ich habe nie versucht herauszufinden, warum - aber oben in Kommentaren gibt es eine vorgeschlagene Antwort - ich benutze dieses Paket einfach nicht.

Das RMS-Paket:

Ich finde es ein bisschen mühsam, damit zu arbeiten, aber normalerweise bekomme ich mit einigem Aufwand gute Antworten. Und es ist das nützlichste für mich.

model = ols(a~b, x=TRUE)    
robcov(model)

Sie können es von Grund auf neu codieren

Siehe diesen Blog-Beitrag ( http://thetarzan.wordpress.com/2011/05/28/heteroskedasticity-robust-and-clustered-standard-errors-in-r/ ). Es sieht aus wie die schmerzhafteste Option, ist aber bemerkenswert einfach und funktioniert oft am besten.


4
In der Hauptsache ist Charles korrekt, aber um deutlich zu machen, was an anderer Stelle impliziert wird, beachten Sie, dass Stata keinen robustBefehl hat! (Es gibt einen Befehl eines Programmierers _robust, der hier nicht direkt relevant ist.) Um robuste (Huber-Eicker-White-Sandwich) Standardfehler zu erhalten, besteht der moderne Ansatz in Stata darin, vce(robust)als Option anzugeben . Der ältere Ansatz zum Angeben einer robustOption funktioniert weiterhin. Im weiteren Sinne ist die Verwirrung, die durch den Unterschied zwischen robuster Regression (usw.) und "robusten" SEs verursacht wird, bedauerlich.
Nick Cox

Hallo. Vielen Dank. Die Codes funktionieren und liefern tatsächlich die Ergebnisse, die Stata erzielt. Nur eine Frage. Ich verstehe, dass robuste Regression sich von robusten Standardfehlern unterscheidet und dass robuste Regression verwendet wird, wenn Ihre Daten Ausreißer enthalten. Es löst aber auch das Problem der Heteroskedastizität. Könnte mir bitte jemand sagen, ob die vom Befehl "lmrob" aus dem Paket "robustbase" bereitgestellte MM-Schätzung gleichzeitig als Lösung für das Problem von Ausreißern und Heteroskedastizität verwendet werden kann?
user56579

@ user56579 Vermutlich möchten Sie hierzu eine separate Frage stellen.
Tschakravarty
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.