Повторний "надійний" варіант Stata в R


39

Я намагався повторити результати параметра Stata robustв Р. Я використав rlmкоманду з пакету MASS, а також команду lmrobз пакету "robustbase". В обох випадках результати сильно відрізняються від "надійного" варіанту в Stata. Чи може хтось запропонувати щось у цьому контексті?

Ось результати, які я отримав, коли запустив надійний варіант у 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

І ось що я отримав в R за допомогою 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
Ласкаво просимо в Cross Valified! Я зробив ваш заголовок трохи більш описовим і додав трохи форматування. Взагалі питання програмування тут не присвячені темі, але я думаю, що ваше - це тому, що воно включає деякі статистичні питання. Сподіваюсь побачити вас навколо ....
Метт Крауз

3
Це надзвичайно допоможе, якби ви принаймні вставили код, який використовується для оцінки моделей у Stata та R (ще краще, якщо ви надасте повністю відтворюваний приклад). Коли ви говорите "результати відрізняються" - якщо ви оцінюєте одну і ту ж модель, повинні відрізнятися лише стандартні помилки, а не оцінки коефіцієнтів.
Енді Ш

добре ... Ось такі результати я отримав завдяки надійному варіанту в STATA:
user56579

5
схоже, lmrobце не те саме, що reg y x, robust. "Стандартні помилки R", сумісні з гетерокедастичністю, Google ". Ви отримаєте сторінки, які показують, як користуватися бібліотеками lmtestта ними sandwich.
generic_user

3
Stata використовує невеликий поправочний коефіцієнт вибірки n / (nk). R зазвичай робить щось інше, тому переконайтеся, що ви налаштувались на це.
Мастеров Дмитро Васильович

Відповіді:


47

Чарльз майже є у своїй відповіді, але robustопція regressкоманди (та інших команд оцінки регресії) в Stata дає можливість використовувати кілька типів гетерокедастичності та автокореляції, міцних оціночних матричних варіантів-коваріації, як і coeftestфункція в lmtestпакеті, який у Поворот залежить від відповідних дисперсійно-коваріаційних матриць, вироблених vcovHCфункцією в sandwichпакеті.

Однак матриці дисперсії-коваріації за замовчуванням, які використовуються двома, відрізняються:
1. Матриця дисперсії-коваріації за замовчуванням, повернута, vcocHCє так званими HC3з причин, описаних на сторінці "man" vcovHC.
2. sandwichВаріант, який використовує Чарльз, coeftestвикористовує HC0надійну дисперсію-коваріаційну матрицю.
3. Для відтворення поведінки за замовчуванням Stata використання robustпараметра в дзвінку regressвам потрібно подати запит vcovHCна використання HC1міцної матриці дисперсії-коваріації.

Детальніше про це читайте тут .

Наступний приклад, який демонструє всі наведені вище пункти, ґрунтується на прикладі тут .

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)

Останній рядок коду вище відтворює результати Stata:

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

Посилання на дані мертве. Чи можете ви оновити посилання? Це той самий файл: fakultet.smu.edu/tfomby/eco5350/data/Examples/elemapi2.dta ?
vasili111

Як відтворити також довірчі інтервали?
vasili111

29

Я знайшов опис на наступному веб-сайті, який повторює "надійний" варіант Stata в Р.

https://economictheoryblog.com/2016/08/08/robust-standard-errors-in-r

Дотримуючись інструкцій, все, що вам потрібно зробити, це завантажити функцію у свій R-сеанс, а потім встановити параметр '' надійний '' у вашій підсумковій функції на TRUE.

summary(lm.object, robust=TRUE)

10

Станом на квітень 2018 року, я вважаю, що ви хочете отримати той estimatrпакет , який забезпечує майже падіння заміни lm. Кілька прикладів, витягнутих майже з документації:

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

Потім carпакет дозволяє легко виконати тести гіпотез омнібусів для цих моделей:

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

Я б редагував питання. Ви плутаєте надійну регресію з надійною командою Stata. Здається, що введення цієї плутанини не має ніякої користі.

Я думаю, є кілька підходів. Я не переглянув їх усіх і не впевнений, що найкраще:

Пакет сендвіч:

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

Але це не дає мені тих самих відповідей, які я чомусь отримую від Stata. Я ніколи не намагався розібратися, чому - але вище в коментарях є запропонована відповідь - я просто не використовую цей пакет.

Пакет rms:

Мені здається, що з цим боротися, але зазвичай отримую хороші відповіді з деякими зусиллями. І це для мене найкорисніше.

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

Ви можете кодувати це з нуля

Дивіться це повідомлення в блозі ( http://thetarzan.wordpress.com/2011/05/28/heteroskedasticity-robust-and-clustered-standard-errors-in-r/ ). Це виглядає як найбільш болісний варіант, але надзвичайно просто, і цей варіант часто працює найкраще.


4
Чарльз правильний в основному, але щоб чітко сказати, що мається на увазі в іншому місці, зауважте, що Stata не має robustкоманди! (Існує команда програміста _robust, яка тут безпосередньо не стосується.) Швидше, щоб отримати надійні (Huber-Eicker-White-sandwich) стандартні помилки, сучасний підхід в Stata полягає в тому, щоб вказати vce(robust)як варіант. Старіший підхід до визначення robustваріанту все ще працює. Загалом, сумбур, спричинений різницею між стійкою регресією (тощо) та "надійною" СЕ, прикро.
Нік Кокс

Гей. Дуже дякую. Коди працюють, і вони дійсно забезпечують результати, які робить Stata. Лише питання. Я розумію, що надійна регресія відрізняється від надійної стандартної помилки, і що надійна регресія застосовується, коли ваші дані містять інтенсивність роботи. Але це також вирішує проблему гетерокедастичності. Чи не будь-хто, будь-ласка, скажіть мені, чи буде використана оцінка виду ММ, що надається командою "lmrob" з пакету "robustbase", як вирішення проблеми одночасності та гетерокедастичності?
користувач56579

@ user56579 Думаю, що ви хочете задати окреме питання з цього приводу.
чакраварти
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.