Tính toán mô hình trọng lực trong phần mềm R và Stata: tại sao các hệ số giống nhau nhưng sai số chuẩn khác nhau?


7

Chúng tôi đã thực hiện tính toán mô hình trọng lực trong phần mềm R và Stata.

Để tính toán, chúng tôi đã sử dụng gói tiêu chuẩn glmmtrong R (với tham số family = quasipoisson) và ppmltrong Stata.

Gọi thủ tục tính toán trong R:

summary(glmm<-glm(formula=exports ~ ln_GDPimporter + ln_GDPexporter + 
    ln_GDPimppc + ln_GDPexppc + ln_Distance + ln_Tariff + ln_ExchangeRate +
    Contig + Comlang + Colony_CIS + EAEU_CIS + EU_European_Union, 
    family=quasipoisson(link="log"),data=data_pua))

Kết quả trong R là:

Kết quả tính toán trong R

Trên cùng một dữ liệu, chúng tôi đã thực hiện các tính toán trong Stata, bằng cách sử dụng ppmlquy trình:

ppml exports ln_gdpimporter ln_gdpexporter ln_gdpimppc ln_gdpexppc ln_distance ln_tariff ln_exchangerate contig comlang colony_cis eaeu_cis eu_european_union

Kết quả tính toán trong Stata như sau:

Kết quả tính toán trong Stata

Như bạn có thể thấy, các hệ số mô hình (cột thứ hai trong bảng kết quả) giống nhau ít nhất cho đến vị trí thập phân thứ 4.

Tuy nhiên, các kết quả khác (từ cột thứ ba trong bảng kết quả) không giống nhau.

  • Bạn có thể giải thích sự khác biệt trong kết quả?

  • Cụ thể, tại sao các hệ số giống nhau (các cột của bảng kết quả đầu tiên), nhưng các lỗi tiêu chuẩn thì không?

Câu trả lời:


6

Tôi lưu ý rằng bảng hệ số Stata đã đề cập đến "Robust Std. Err.", Trong khi glmmcó lẽ không sử dụng các lỗi mạnh. Điều đó sẽ giải thích cho sự khác biệt SE.

Ngoài ra, ppmldường như thực sự giảm các hồi quy "không đáng kể" và quasipoissongia đình của R cho phép phân tán quá mức theo cách khác với hồi quy nhị thức âm, có lẽ khác với ppml.

Tôi nhận thấy rằng bạn đã hỏi ở một vài nơi về gói R nào sẽ mang lại kết quả tương đương với ppmlcác mô hình trọng lực (kinh tế) và không có câu trả lời. Tôi rất tiếc khi thấy điều đó và ước rằng tôi có thể đưa ra một khuyến nghị nhiều thông tin hơn. Dường như điều bạn cần là hồi quy Poisson với các lỗi tiêu chuẩn mạnh, xử lý các giá trị 0. Tôi không chắc gói R hỗ trợ cái gì. (Không chắc chắn nếu ppmlxử lý phân tán hơn hay không.)

Các gói hồi quy Bayes như rstanarmcó thể xử lý sự không đồng nhất mạnh mẽ hơn, nhưng tôi không chắc chắn. Tôi có xu hướng sử dụng một cái gì đó như một student_tgia đình cho điều đó, nhưng bạn phải sử dụng poissonvì vậy tôi không chắc câu trả lời ở đó. Bạn có thể thử các gia đình nhị thức âm ( neg_binomial_2trong rstanarm's stan_glm), mà cũng xử lý quá phân tán và có thể trở nên mạnh mẽ hơn quasipoisson.

Xem thêm: Khi nào nên sử dụng các lỗi tiêu chuẩn mạnh mẽ trong hồi quy Poisson?


1
Nếu một người sẵn sàng sử dụng rstanarmnhưng chức năng cần thiết không có ở đó, người ta có thể thực hiện bước nhảy vọt để chỉ mã hóa mô hình rstan.
Sycorax nói Phục hồi lại

PPML vẫn nhất quán khi có sự phân tán dưới hoặc quá mức. Bạn có thể đọc thêm tại trang Log of Gravity .
Dimitriy V. Masterov

Làm ơn, làm ơn! А нельзя ли продублировать ответ по-русски :)
Sergey S.

@salnsg: Xin lỗi, Dmitry, tiếc là tôi chỉ biết hai từ tiếng Nga. Bạn có thể thử dịch.google.com, mặc dù tôi nghi ngờ nó sẽ xử lý các bộ phận kỹ thuật đúng cách.
Wayne

5

Để mở rộng câu trả lời xuất sắc của Wayne, hãy ppmlsử dụng ma trận phương sai hiệp phương sai mạnh mẽ (đến không đồng nhất) và cũng là điều chỉnh mẫu hữu hạn cho ma trận đó để giảm sai lệch.

Chúng rất giống với những gì sandwich()từ gói cùng tên tính toán trong R. Điểm khác biệt duy nhất là cách điều chỉnh mẫu hữu hạn được thực hiện. Trong sandwich(...)hàm, không có sự điều chỉnh mẫu hữu hạn nào được thực hiện theo mặc định, tức là, sandwich được chia cho 1 / n trong đó n là số lượng quan sát. Ngoài ra, sandwich(..., adjust = TRUE)có thể được sử dụng chia cho 1 / (n - k) trong đó k là số lượng hồi quy. Stata, tuy nhiên, chia cho 1 / (n - 1).

Đây là cách bạn có thể khiến R khớp với Stata bằng cách sử dụng phương sai bánh sandwich tùy chỉnh với hệ số điều chỉnh là 1 / (n-1):

. clear

. set more off

. capture ssc install rsource

. use http://personal.lse.ac.uk/tenreyro/mock, clear

. saveold ~/Desktop/mock, version(12) replace
(saving in Stata 12 format, which can be read by Stata 11 or 12)
file ~/Desktop/mock.dta saved

. rsource, terminator(XXX) rpath("/usr/local/bin/R") roptions("--vanilla")
Assumed R program path: "/usr/local/bin/R"

Loading required package: zoo

Attaching package: 'zoo'

The following objects are masked from 'package:base':

    as.Date, as.Date.numeric

Beginning of R output

R version 3.2.4 (2016-03-10) -- "Very Secure Dishes"
Copyright (C) 2016 The R Foundation for Statistical Computing
Platform: x86_64-apple-darwin13.4.0 (64-bit)

R is free software and comes with ABSOLUTELY NO WARRANTY.
You are welcome to redistribute it under certain conditions.
Type 'license()' or 'licence()' for distribution details.

  Natural language support but running in an English locale

R is a collaborative project with many contributors.
Type 'contributors()' for more information and
'citation()' on how to cite R or R packages in publications.

Type 'demo()' for some demos, 'help()' for on-line help, or
'help.start()' for an HTML browser interface to help.
Type 'q()' to quit R.

>   library("foreign")
>   library("sandwich")
>   library("lmtest")
>   mock<-read.dta("~/Desktop/mock.dta")
>   glmm<-glm(formula=y ~ x + w, family=quasipoisson(link="log"),data=mock)
> 
>   sandwich1 <- function(object, ...) sandwich(object) * nobs(object) / (nobs(object) - 1)
>   coeftest(glmm,vcov=sandwich1)

z test of coefficients:

            Estimate Std. Error z value  Pr(>|z|)    
(Intercept) 0.516969   0.098062  5.2718 1.351e-07 ***
x           0.125657   0.101591  1.2369    0.2161    
w           0.013410   0.710752  0.0189    0.9849    
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

> 
End of R output

. 
. ppml y x w

note: checking the existence of the estimates

Number of regressors excluded to ensure that the estimates exist: 0
Number of observations excluded: 0

note: starting ppml estimation
note: y has noninteger values

Iteration 1:   deviance =  139.7855
Iteration 2:   deviance =  137.7284
Iteration 3:   deviance =  137.7222
Iteration 4:   deviance =  137.7222

Number of parameters: 3
Number of observations: 100
Pseudo log-likelihood: -173.89764
R-squared: .01628639
Option strict is: off
------------------------------------------------------------------------------
             |               Robust
           y |      Coef.   Std. Err.      z    P>|z|     [95% Conf. Interval]
-------------+----------------------------------------------------------------
           x |   .1256565   .1015913     1.24   0.216    -.0734588    .3247718
           w |   .0134101   .7107518     0.02   0.985    -1.379638    1.406458
       _cons |   .5169689   .0980624     5.27   0.000     .3247702    .7091676
------------------------------------------------------------------------------

Đây là mã Stata / R tạo đầu ra ở trên. Tôi đang sử dụng rsourceđể chạy R từ Stata (và bạn sẽ cần phải điều chỉnh rpath()bên dưới để phù hợp với thiết lập của mình), nhưng điều đó không thực sự cần thiết: bạn chỉ có thể chạy rsourcephần từ R.

clear
set more off
capture ssc install rsource

use http://personal.lse.ac.uk/tenreyro/mock, clear
saveold ~/Desktop/mock, version(12) replace

rsource, terminator(XXX) rpath("/usr/local/bin/R") roptions("--vanilla")
  library("foreign")
  library("sandwich")
  library("lmtest")
  mock<-read.dta("~/Desktop/mock.dta")
  glmm<-glm(formula=y ~ x + w, family=quasipoisson(link="log"),data=mock)

  sandwich1 <- function(object, ...) sandwich(object) * nobs(object) / (nobs(object) - 1)
  coeftest(glmm,vcov=sandwich1)  
XXX 

ppml y x w

@salnsg о С
Dimitriy V. Masterov
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.