การจำลองตัวเลือก“ แข็งแกร่ง” ของ Stata ใน R


38

ฉันพยายามทำซ้ำผลลัพธ์ของตัวเลือก Stata robustใน R ฉันได้ใช้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 Validated! ฉันทำให้ชื่อของคุณมีความหมายมากขึ้นและเพิ่มการจัดรูปแบบบางส่วน โดยทั่วไปคำถามการเขียนโปรแกรมไม่ได้อยู่ในหัวข้อที่นี่แต่ฉันคิดว่าคุณเป็นเพราะมันเกี่ยวข้องกับปัญหาทางสถิติบางอย่าง หวังว่าจะได้พบคุณรอบ ๆ ....
Matt Krause

3
มันจะช่วยได้อย่างมากถ้าอย่างน้อยคุณวางโค้ดที่ใช้ในการประเมินโมเดลใน Stata และ R (ดียิ่งขึ้นถ้าคุณให้ตัวอย่างที่ทำซ้ำได้ทั้งหมด) เมื่อคุณพูดว่า "ผลลัพธ์ต่างกัน" - หากคุณกำลังประเมินโมเดลเดียวกันเท่านั้นข้อผิดพลาดมาตรฐานควรแตกต่างกันไม่ใช่ค่าประมาณสัมประสิทธิ์
Andy W

ตกลง ... เหล่านี้คือผลลัพธ์ที่ฉันได้รับจากตัวเลือกที่แข็งแกร่งใน STATA:
user56579

5
ดูเหมือนไม่ได้เช่นเดียวกับlmrob reg y x, robustGoogle "ข้อผิดพลาดมาตรฐานที่สอดคล้องกับ heteroskedasticity R" คุณจะได้รับหน้าแสดงวิธีการใช้lmtestและsandwichไลบรารี
generic_user

3
Stata ใช้ปัจจัยการแก้ไขตัวอย่างขนาดเล็กที่ n / (nk) R มักจะทำอย่างอื่นดังนั้นให้แน่ใจว่าคุณปรับตัวเพื่อสิ่งนั้น
Dimitriy V. Masterov

คำตอบ:


47

ชาร์ลส์เกือบจะมีในคำตอบของเขา แต่robustตัวเลือกของregressคำสั่ง (และคำสั่งการประมาณค่าการถดถอยอื่น ๆ ) ใน Stata ทำให้มันเป็นไปได้ที่จะใช้หลายประเภทของ heteroskedasticity และอัตแข็งแกร่งแปรปรวนแปรปรวนประมาณเมทริกซ์เช่นเดียวกับcoeftestฟังก์ชั่นในlmtestแพคเกจซึ่งใน เทิร์นขึ้นอยู่กับการฝึกอบรมแปรปรวนร่วมแปรปรวนร่วมที่ผลิตโดยvcovHCฟังก์ชั่นในsandwichแพคเกจ

แต่เริ่มต้นการฝึกอบรมความแปรปรวนความแปรปรวนที่ใช้โดยทั้งสองมีความแตกต่าง:
1. เริ่มต้นเมทริกซ์ความแปรปรวนแปรปรวนส่งกลับโดยvcocHCเป็นสิ่งที่เรียกว่าสำหรับเหตุผลที่อธิบายไว้ในหน้าคนสำหรับHC3 2. ตัวเลือกที่ใช้โดย Charles ทำให้การใช้เมทริกซ์ความแปรปรวนร่วมแปรปรวนที่มีประสิทธิภาพ 3. ในการทำซ้ำพฤติกรรมเริ่มต้น Stata ของการใช้ตัวเลือกในการโทรหาคุณจะต้องขอให้ใช้เมทริกซ์ความแปรปรวนร่วมแปรปรวนที่แข็งแกร่งvcovHC
sandwichcoeftestHC0
robustregressvcovHCHC1

อ่านข้อมูลเพิ่มเติมเกี่ยวกับเรื่องนี้ที่นี่

ตัวอย่างต่อไปนี้แสดงให้เห็นว่าทุกจุดที่ทำดังกล่าวข้างต้นจะขึ้นอยู่กับตัวอย่างที่นี่

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

29

ฉันพบคำอธิบายในเว็บไซต์ต่อไปนี้ที่จำลองตัวเลือก 'แข็งแรง' 'ของ Stata ใน R

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ตัวเลือกยังคงใช้งานได้ ในวงกว้างความสับสนที่เกิดจากความแตกต่างระหว่างการถดถอยที่แข็งแกร่ง (ฯลฯ ) และ SE ที่ "แข็งแกร่ง" นั้นเป็นเรื่องที่โชคร้าย
Nick Cox

เฮ้ ขอบคุณมาก. รหัสทำงานได้จริงและให้ผลลัพธ์ที่ Stata ทำได้ แค่คำถาม. ฉันเข้าใจว่าการถดถอยที่สมบูรณ์นั้นแตกต่างจากข้อผิดพลาดมาตรฐานที่มีประสิทธิภาพและการถดถอยที่แข็งแกร่งนั้นจะใช้เมื่อข้อมูลของคุณมีค่าผิดปกติ แต่มันก็ยังแก้ปัญหาความแตกต่างของ heteroskedasticity ใครช่วยกรุณาบอกฉันว่าการประเมินชนิด MM ที่จัดทำโดยคำสั่ง "lmrob" จากแพคเกจ "robustbase" ถูกใช้เป็นวิธีแก้ปัญหาค่าผิดปกติและ heteroskedasticity simultaneuosly หรือไม่
user56579

@ user56579 ฉันเดาว่าคุณต้องการถามคำถามแยกต่างหากเกี่ยวกับเรื่องนี้
tchakravarty
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.