在R中复制Stata的“健壮”选项


39

我一直在尝试robust在R中复制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

这是我在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
欢迎使用交叉验证!我使您的标题更具描述性,并添加了一些格式。通常,这里不讨论编程问题,我认为您的问题是因为它涉及一些统计问题。希望能看到你周围...
马特·克劳斯

3
如果您至少在Stata和R中至少粘贴了用于估计模型的代码,则将大有帮助(如果您提供一个完全可复制的示例,甚至会更好)。当您说“结果不同”时-如果您要估算同一模型,则仅标准误差应有所不同,系数估算应不相同。
安迪W

好的...这些是我通过STATA中的健壮选项获得的结果:
user56579

5
看起来和lmrob一样reg y x, robust。Google“异方差一致性标准错误R”。您将获得显示如何使用lmtestsandwich库的页面。
2014年

3
Stata使用n /(nk)的小样本校正因子。R通常会执行其他操作,因此请确保对此进行调整。
Dimitriy V. Masterov 2014年

Answers:


47

Charles的答案几乎在那儿,但是Stata robust中的regress命令(以及其他回归估计命令)选项使得可以使用多种类型的异方差和自相关鲁棒方差-协方差矩阵估计器,包中的coeftest函数也是lmtest如此。转弯取决于包中vcovHC函数产生的各个方差-协方差矩阵sandwich

但是,两者使用的默认方差-协方差矩阵是不同的:
1. 由于在手册页中描述的原因,返回的默认方差-协方差矩阵vcocHC是所谓HC3vcovHC
2. sandwichCharles coeftest使用的选项使用HC0稳健的方差-协方差矩阵。
3.要重现在robust调用中使用选项的Stata默认行为,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

数据链接已失效。您能否更新链接?是否是同一文件: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的robust命令与可靠的回归混为一谈。引入这种混乱似乎没有任何好处。

我认为有几种方法。我还没有全部查看它们,也不知道哪个是最好的:

三明治包装:

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选项的旧方法仍然有效。更广泛地说,不幸的是,由健壮回归(等)和“健壮”的SE之间的差异引起的混乱。
尼克·考克斯

嘿。非常感谢。这些代码有效,并且确实提供了Stata所提供的结果。就一个问题。我了解稳健回归与稳健标准误差不同,并且当数据包含异常值时会使用稳健回归。但这也解决了异方差问题。谁能告诉我,软件包“ robustbase”中“ lmrob”命令提供的MM类型估计是否可以同时用于解决异常值和异方差性问题?
user56579 2014年

@ user56579我的猜测是您想对此提出一个单独的问题。
tchakravarty 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.