Replica dell'opzione "robusta" di Stata in R


39

Ho cercato di replicare i risultati dell'opzione Stata robustin R. Ho usato il rlmcomando dal pacchetto MASS e anche il comando lmrobdal pacchetto "robustbase". In entrambi i casi i risultati sono abbastanza diversi dall'opzione "robusta" di Stata. Qualcuno può suggerire qualcosa in questo contesto?

Ecco i risultati che ho ottenuto quando ho eseguito l'opzione robusta in Stata:

. 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

E questo è quello che ho ottenuto in R con l'opzione lmrob:

> 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
Benvenuto in Cross Validated! Ho reso il tuo titolo un po 'più descrittivo e ho aggiunto un po' di formattazione. In generale, le domande di programmazione non sono in tema qui, ma penso che il tuo sia perché comporta alcuni problemi statistici. Spero di vederti in giro ....
Matt Krause,

3
Sarebbe di grande aiuto se almeno incollassi il codice usato per stimare i modelli in Stata e R (ancora meglio se fornisci un esempio interamente riproducibile). Quando dici "i risultati differiscono" - se stai valutando lo stesso modello dovrebbero differire solo gli errori standard, non le stime dei coefficienti.
Andy W,

okay ... Questi sono i risultati che ho ottenuto con l'opzione robusta in STATA:
user56579

5
sembra che lmrobnon sia lo stesso di reg y x, robust. Google "errori standard coerenti con l'eteroschedasticità R". Riceverai pagine che mostrano come utilizzare le librerie lmteste sandwich.
generic_user

3
Stata utilizza un piccolo fattore di correzione del campione di n / (nk). Di solito R fa qualcos'altro, quindi assicurati di adattarti a questo.
Dimitriy V. Masterov,

Risposte:


47

Charles è quasi lì nella sua risposta, ma l' robustopzione del regresscomando (e altri comandi di stima della regressione) in Stata consente di utilizzare più tipi di stimatori a matrice di varianza-covarianza robusta per eteroschedasticità e autocorrelazione, così come la coeftestfunzione nel lmtestpacchetto, che in il turno dipende dalle rispettive matrici varianza-covarianza prodotte dalla vcovHCfunzione nel sandwichpacchetto.

Tuttavia, le matrici di varianza-covarianza predefinite utilizzate dalle due sono diverse:
1. La matrice di varianza-covarianza predefinita restituita vcocHCè la cosiddetta HC3per i motivi descritti nella pagina man per vcovHC.
2. L' sandwichopzione usata da Charles coeftestutilizza la HC0robusta matrice varianza-covarianza.
3. Per riprodurre il comportamento predefinito di Stata dell'utilizzo robustdell'opzione in una chiamata, regressè necessario richiedere vcovHCl'utilizzo della HC1matrice varianza-covarianza robusta.

Leggi di più qui .

L'esempio seguente che mostra tutti i punti sopra riportati si basa sull'esempio qui .

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)

L'ultima riga di codice sopra riproduce i risultati di Stata:

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

Il collegamento ai dati è morto. Potete per favore aggiornare il link? È lo stesso file: faculty.smu.edu/tfomby/eco5350/data/Examples/elemapi2.dta ?
vasili111

Come riprodurre anche intervalli di confidenza?
vasili111,


10

Ad aprile 2018 credo che tu voglia il estimatrpacchetto , che prevede un calo quasi sostitutivo per lm. Numerosi esempi sono stati quasi estratti dalla documentazione:

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

Il carpacchetto semplifica quindi l'esecuzione di test di ipotesi omnibus per questi modelli:

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

Modificherei la domanda. Stai confondendo una forte regressione con il robusto comando di Stata. Non sembra esserci alcun vantaggio nell'introdurre questa confusione.

Penso che ci siano alcuni approcci. Non li ho guardati tutti e non sono sicuro di quale sia il migliore:

Il pacchetto sandwich:

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

Ma questo non mi dà le stesse risposte che ottengo da Stata per qualche motivo. Non ho mai provato a capire perché - ma sopra nei commenti c'è una risposta suggerita - non uso questo pacchetto.

Il pacchetto rms:

Trovo che sia un po 'una seccatura con cui lavorare ma di solito ottengo buone risposte con un certo sforzo. Ed è il più utile per me.

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

Puoi codificarlo da zero

Vedi questo post del blog ( http://thetarzan.wordpress.com/2011/05/28/heteroskedasticity-robust-and-clustered-standard-errors-in-r/ ). Sembra l'opzione più dolorosa, ma straordinariamente facile e questa opzione spesso funziona meglio.


4
Charles ha ragione sul punto principale, ma per rendere esplicito ciò che è implicato altrove si noti che Stata non ha alcun robustcomando! (C'è un comando di un programmatore _robust, non direttamente rilevante qui.) Piuttosto, per ottenere errori standard (Huber-Eicker-White-sandwich), l'approccio moderno in Stata è di specificare vce(robust)come opzione. L'approccio precedente per specificare robustun'opzione funziona ancora. Più in generale, la confusione causata dalla differenza tra regressione robusta (ecc.) E SE "robuste" è sfortunata.
Nick Cox,

Hey. Molte grazie. I codici funzionano e in effetti fornisce i risultati di Stata. Solo una domanda. Comprendo che la regressione affidabile è diversa dagli errori standard robusti e che la regressione robusta viene utilizzata quando i dati contengono valori anomali. Ma risolve anche il problema dell'eteroschedasticità. Qualcuno potrebbe dirmi se la stima del tipo MM fornita dal comando "lmrob" dal pacchetto "robustbase" può essere utilizzata come soluzione al problema dei valori anomali e dell'eteroschedasticità simultaneamente?
user56579

@ user56579 Suppongo che tu voglia fare una domanda separata a riguardo.
Tchakravarty,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.