R'deki Stata'nın “sağlam” seçeneğini çoğaltma


38

robustR'deki Stata seçeneğinin sonuçlarını kopyalamaya çalışıyorum. rlmMASS paketini ve lmrob"robustbase" paketinden gelen komutları kullandım. Her iki durumda da, sonuçlar Stata'daki "sağlam" seçeneğinden oldukça farklıdır. Herhangi biri bu bağlamda bir şey önerebilir mi?

Stata'da sağlam seçeneği kullandığımda elde ettiğim sonuçlar:

. 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

R'de lmrob seçeneğiyle elde ettiğim de bu:

> 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
Doğrulanmış Cross'a Hoşgeldiniz! Başlığınızı biraz daha açıklayıcı hale getirdim ve biraz biçimlendirme ekledim. Genel olarak, programlama soruları burada konuyla ilgili değildir, ancak bence sizinki, bazı istatistiksel sorunları içerdiği içindir. Sizi görmeyi umuyoruz ....
Matt Krause

3
Stata ve R'deki modelleri tahmin etmek için kullanılan kodu en azından yapıştırırsanız (tamamen yeniden üretilebilir bir örnek sunsanız bile daha iyi) çok yardımcı olacaktır. "Sonuçlar farklı" derken, aynı modeli tahmin ediyorsanız, yalnızca standart hataların katsayı tahminlerini değil, farklı olması gerektiğini söyleyin.
Andy W,

tamam ... Bunlar STATA sağlam seçeneği ile elde edilen sonuçlar şunlardır:
user56579

5
gibi görünüyor lmrobaynı değil reg y x, robust. Google "heteroskedasticity tutarlı standart hatalar R". Sen nasıl kullanılacağını gösteren sayfaları alırsınız lmtestve sandwichkütüphaneler.
generic_user 28:14

3
Stata, n / (nk) 'nin küçük bir örnek düzeltme faktörünü kullanır. R genellikle başka bir şey yapar, bu yüzden ayar yaptığınızdan emin olun.
Dimitriy V. Masterov

Yanıtlar:


47

Charles, cevabında neredeyse orada, ancak robustStata'daki regresskomutun (ve diğer regresyon tahmin komutlarının) seçeneği coeftest, lmtestpaketteki işlevde olduğu gibi, çoklu değişken heteroskedastisite ve otokorelasyon türlerinde, güçlü varyans-kovaryans matris tahmin edicileri kullanmayı mümkün kılıyor . dönüş vcovHC, sandwichpaketteki fonksiyon tarafından üretilen ilgili kovaryans matrislerine bağlıdır .

Ancak, iki tarafından kullanılan varsayılan varyans-kovaryans matrisleri farklıdır:
döndürdüğü 1. varsayılan varyans-kovaryans matrisi vcocHColarak adlandırılan olduğu HC3için kılavuz sayfasında açıklanan nedenlerle vcovHC.
2. sandwichCharles tarafından kullanılan seçenek coeftest, HC0sağlam varyans-kovaryans matrisini kullanır.
3. Stata varsayılan davranışını çoğaltmak için bir çağrıdaki robustseçeneği kullanma davranışı , sağlam varyans-kovaryans matrisinin kullanılmasını regressistemeniz gerekir .vcovHCHC1

Bununla ilgili daha fazla bilgiyi burada bulabilirsiniz .

Yukarıda yapılan tüm noktaları gösterir Aşağıdaki örnek örnek dayanmaktadır burada .

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)

Yukarıdaki son kod satırı, Stata'dan gelen sonuçları üretir:

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

Veri bağlantısı öldü. Lütfen linki güncelleyebilir misiniz? Bu dosya aynı mı: faculty.smu.edu/tfomby/eco5350/data/Examples/elemapi2.dta ?
vasili111

Güven aralıkları da nasıl yeniden üretilir?
vasili111


10

Nisan 2018'den itibaren, yerine yenisiyle yakın bir düşüş sağlayan estimatrpaketi istediğinize inanıyorum lm. Neredeyse dokümantasyondan birkaç örnek alınmıştır:

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

carPaket o zaman kolay bu modeller için çok maddeli hipotez testlerini gerçekleştirmek için yapar:

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

Soruyu düzenlerdim. Stata'nın sağlam emriyle, sağlam gerilemeyi karıştırıyorsun. Bu karışıklığı ortaya koymanın faydası yok gibi görünüyor.

Bence birkaç yaklaşım var. Hepsine bakmadım ve hangisinin en iyisi olduğundan emin değilim:

Sandviç paketi:

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

Fakat bu bana Stata'dan aldığım cevapları nedense vermiyor. Nedenini çözmeyi hiç denemedim - ama yorumlarda yukarıda önerilen bir cevap var - sadece bu paketi kullanmıyorum.

Rms paketi:

Bunu çalışmak için biraz acı verici buluyorum ama genelde biraz çabayla iyi cevaplar alıyorum. Ve bu benim için en faydalı olanı.

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

Sıfırdan kodlayabilirsiniz

Bu blog gönderisine bakın ( http://thetarzan.wordpress.com/2011/05/28/heteroskedasticity-robust-and-clustered-standard-errors-in-r/ ). En acı seçenek gibi gözüküyor, ancak oldukça kolay ve bu seçenek genellikle en iyi sonucu veriyor.


4
Charles ana noktada haklı, ancak başka bir yerde ima edilenleri açıkça belirtmek için Stata'nın robustemir almadığına dikkat edin ! (Burada _robustdoğrudan ilgili olmayan bir programcının emri var.) Bunun yerine, sağlam (Huber-Eicker-White-sandwich) standart hatalar almak için Stata'daki modern yaklaşım vce(robust)bir seçenek olarak belirtmektir . Bir robustseçeneği belirlemek için eski yaklaşım hala çalışır. Daha genel olarak, sağlam regresyon (vb.) Ve "sağlam" SE'ler arasındaki farkın neden olduğu karışıklık talihsizdir.
Nick Cox

Hey. Çok teşekkürler. Kodlar işe yarıyor ve gerçekten Stata'nın sunduğu sonuçları veriyor. Sadece bir soru. Sağlam regresyonun, standart hatalardan farklı olduğunu ve verilerinizin aykırı değerler içerdiğinde, sağlam regresyonun kullanıldığını biliyorum. Ama aynı zamanda heteroskedasticity sorununu da çözer. Birisi lütfen bana "robustbase" paketinden "lmrob" komutu tarafından sağlanan MM cinsi tahminin, aykırı ve heteroskedastiklik sorununa bir çözüm olarak kullanılıp kullanılmayacağını söyleyebilir mi?
user56579 29:14

@ user56579 Benim tahminim, bu konuda ayrı bir soru sormak istediğin.
tchakravarty
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.