R에서 Stata의 "견고한"옵션 복제


38

robustR 에서 Stata 옵션의 결과를 복제하려고했습니다 rlm. MASS 패키지와 lmrob"robustbase"패키지 의 명령 을 사용했습니다. 두 경우 모두 결과는 Stata의 "robust"옵션과 상당히 다릅니다. 이 맥락에서 누군가 제안 할 수 있습니까?

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

그리고 이것은 lmrob 옵션으로 R에서 얻은 것입니다.

> 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 Validated에 오신 것을 환영합니다! 제목을 좀 더 설명하기 쉽게 만들고 형식을 추가했습니다. 일반적으로 프로그래밍 질문은 여기서 다루지 않지만 통계적인 문제가 있기 때문입니다. 당신을 둘러보고 싶습니다 ....
매트 크라우스

3
Stata와 R에서 모델을 추정하는 데 사용 된 코드를 최소한 붙여 넣는 경우 (전혀 재현 가능한 예를 제공하는 경우에도) 훨씬 도움이됩니다. "결과가 다름"이라고 말할 때-동일한 모형을 추정하는 경우 계수 추정치가 아니라 표준 오차 만 달라야합니다.
Andy W

OK ... STATA의 강력한 옵션으로 얻은 결과는 다음과 같습니다.
user56579

5
같지 lmrob않은 것 같습니다 reg y x, robust. Google "이분산성 일관성이있는 표준 오류 R". lmtestsandwich라이브러리 사용법을 보여주는 페이지가 표시 됩니다.
generic_user

3
Stata는 n / (nk)의 작은 샘플 보정 계수를 사용합니다. R은 일반적으로 다른 작업을 수행하므로 이에 맞게 조정하십시오.
Dimitriy V. Masterov

답변:


47

Charles는 거의 답을 얻었지만 Stata robustregress명령 (및 다른 회귀 추정 명령) 옵션 을 사용 coeftest하면 lmtest패키지 의 함수와 마찬가지로 여러 유형의이 분산 및 자기 상관 강력한 분산 공분산 행렬 추정기를 사용할 수 있습니다 . 회전은 패키지 의 vcovHC함수에 의해 생성 된 각 분산 공분산 행렬에 따라 달라집니다 sandwich.

그러나이 둘이 사용하는 기본 분산 공분산 행렬은 다릅니다.
1.에서 반환하는 기본 분산 공분산 행렬 은의 맨 페이지에 설명 된 이유로 vcocHC소위 HC3입니다 vcovHC.
2. sandwichCharles가 coeftest사용하는 옵션 은 HC0강력한 분산 공분산 행렬을 사용합니다.
3. robust호출에 옵션 을 사용하는 Stata 기본 동작을 재현하려면 강력한 분산 공분산 행렬 을 사용 regress하도록 요청해야합니다 .vcovHCHC1

자세한 내용은 여기를 참조 하십시오 .

위의 모든 사항을 보여주는 다음 예제는 여기 예제를 기반으로합니다 .

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

데이터 연결이 끊어졌습니다. 링크를 업데이트 하시겠습니까? 동일한 파일 입니까 : faculty.smu.edu/tfomby/eco5350/data/Examples/elemapi2.dta ?
vasili111

신뢰 구간도 재현하는 방법은 무엇입니까?
vasili111


10

2018 년 4 월 현재, 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
Charles는 요점에서 정확하지만 다른 곳에서 암시 된 것을 명시하기 위해 Stata에는 아무런 robust명령 이 없습니다 . ( _robust직접적으로 관련이없는 프로그래머의 명령이 있습니다.) 오히려 강력한 (Huber-Eicker-White-sandwich) 표준 오류를 얻기 위해 Stata의 현대적인 접근 방식 vce(robust)은 옵션 으로 지정 하는 것입니다. robust옵션 을 지정하는 이전 방법은 여전히 작동합니다. 보다 광범위하게, 강력한 회귀 (regression) 등과 "견고한"SE의 차이로 인한 혼동은 불행합니다.
Nick Cox

야. 고마워 코드는 작동하며 실제로 Stata가 수행 한 결과를 제공합니다. 그냥 질문입니다. 강력한 회귀 분석은 강력한 표준 오류와 다르며 데이터에 특이 치가 포함 된 경우 강력한 회귀 분석이 사용됩니다. 그러나 또한 이분산성 문제를 해결합니다. 누구든지 "robustbase"패키지의 "lmrob"명령에 의해 제공된 MM 종류 추정값이 이상치와 이분산성 문제에 대한 해결책으로 동시에 사용되는지 여부를 알려주시겠습니까?
user56579 2014 년

@ user56579 제 생각에는 이것에 대해 별도의 질문을하고 싶습니다.
tchakravarty
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.