[英]ggpredict error with lm_robust model including fixed effects and clustered standard errors
[英]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.