簡體   English   中英

在lm_robust()之后出現聚類標准錯誤后,如何獲得邊際效應?

[英]How to get the marginal effects after lm_robust() with clustered standard errors?

我正在逐年對聚類標准誤差進行回歸。 使用Stata可以很容易地做到這一點,但是我必須使用R來實現,因此我使用estimatr包中的lm_robust()函數來運行它。 問題是我現在必須獲得某些變量的邊際效應,但是我做不到,我想這是因為群集標准錯誤。 我遵循了lm_robust()手冊上的內容,並且看到它們僅將margins包中的margins命令用於其他功能,而沒有聚集的標准錯誤...沒有人知道如何獲取和繪制邊際的線索。效果如何?

set.seed(42)
library(fabricatr)
library(randomizr)
dat <- fabricate(
  N = 100,                        # sample size
  x = runif(N, 0, 1),             # pre-treatment covariate
  y0 = rnorm(N, mean = x),        # control potential outcome
  y1 = y0 + 0.35,                 # treatment potential outcome
  z = complete_ra(N),             # complete random assignment to treatment
  y = ifelse(z, y1, y0),          # observed outcome

  # We will also consider clustered data
  clust = sample(rep(letters[1:20], each = 5)),
  z_clust = cluster_ra(clust),
  y_clust = ifelse(z_clust, y1, y0)
)

然后,當我使用lm_robust()函數運行回歸時:

library(estimatr)
lmout_cl <- lm_robust(
  y_clust ~ z_clust + x,
  data = dat,
  clusters = clust
)

最后,我嘗試獲取利潤...

library(margins)
mar_cl <- margins(lmout_cl)

但這會導致錯誤:

Error in attributes(.Data) <- c(attributes(.Data), attrib) :'names' attribute 
[1] must be the same length as the vector [0]

針對此錯誤的道歉,該錯誤阻止margins()estimatr版本0.10及更低版本中具有非數字群集的lm_robust()對象一起使用。 這是由estimatr::lm_robust()margins::margins()處理模型中哪些變量的內部方式創建的。

此錯誤已得到解決,因此在estimatr有兩個解決方案。

首先讓我生成數據。

library(fabricatr)
library(randomizr)
dat <- fabricate(
  N = 100,
  x = runif(N),
  clust = sample(rep(letters[1:20], each = 5)),
  y_clust = rnorm(N),
  z_clust = cluster_ra(clust),
)

獲取最新版本的estimatr (v0.11.0)

https://declaredesign.org/r/estimatr上的開發版本已修復了該錯誤,它將在下個月左右在CRAN上發布。

install.packages("estimatr", dependencies = TRUE,
                 repos = c("http://r.declaredesign.org", "https://cloud.r-project.org"))
library(estimatr)
lmout_cl <- lm_robust(
  y_clust ~ z_clust + x,
  data = dat,
  clusters = clust
)
library(margins)
mar_cl <- margins(lmout_cl)

將數字群集與estimatr (v0.10.0)的CRAN版本一起使用

CRAN上現有版本的estimatr解決方法是使用數字群集而不是字符群集

dat <- fabricate(
  N = 100,
  x = runif(N),
  clust = sample(rep(1:20, each = 5)),
  y_clust = rnorm(N),
  z_clust = cluster_ra(clust),
)
install.packages("estimatr")
library(estimatr)
lmout_cl <- lm_robust(
  y_clust ~ z_clust + x,
  data = dat,
  clusters = clust
)
mar_cl <- margins(lmout_cl)

問題在於estimatr::lm_robust()產生一個"lm_robust"對象,目前看來margins()不支持該對象。 我們可以改用miceadds::lm.cluster() -並獲得與Stata相同的聚類標准錯誤。

library(miceadds)

lmout_cl <- lm.cluster(y_clust ~ z_clust + x, data=dat, cluster=dat$clust)

這將產生一個包含兩個元素的列表,其中將正常lm對象存儲在第一個元素中,將具有聚類標准誤差的方差-協方差矩陣存儲在第二個元素中(請參閱str(lmout_cl) ):

> names(lmout_cl)
[1] "lm_res" "vcov"  

margins()現在可以指定為margins(model=model, vcov=vcov) ,所以我們說:

mar_cl <- with(lmout_cl, margins(lm_res, vcov=vcov))

生產

> mar_cl
Average marginal effects
stats::lm(formula = formula, data = data)

 z_clust     x
  0.6558 1.444

> summary(mar_cl)
  factor    AME     SE      z      p  lower  upper
       x 1.4445 0.3547 4.0728 0.0000 0.7494 2.1396
 z_clust 0.6558 0.1950 3.3633 0.0008 0.2736 1.0379

與聚類的標准錯誤。


與Stata的比較

[R

foreign::write.dta(dat, "dat.dta")  # export as Stata data to wd

塔塔

. use dat, clear
(Written by R.              )

. quietly regress y_clust z_clust x, vce(cluster clust)

. mfx

Marginal effects after regress
      y  = Fitted values (predict)
         =  .67420391
------------------------------------------------------------------------------
variable |      dy/dx    Std. Err.     z    P>|z|  [    95% C.I.   ]      X
---------+--------------------------------------------------------------------
 z_clust*|   .6557558      .19498    3.36   0.001   .273609   1.0379        .5
       x |   1.444481      .35466    4.07   0.000   .749352  2.13961   .524479
------------------------------------------------------------------------------
(*) dy/dx is for discrete change of dummy variable from 0 to 1

. 

正如我們可以清楚地看到的那樣,R在聚類標准誤差和邊際效應方面與Stata相同。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM