Повторний "надійний" варіант 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.