如何解决feols-最固定的:循环遍历因变量 更新更新
我正在尝试使用来自fixest包的feols函数遍历一组因变量。 在使用lm的基础上或在lfe :: felm中,我将简单地使用get()函数。最固定,我收到一个错误。为什么会这样,有办法解决吗?这是一个可复制的示例:
library(data.table)
library(lfe)
library(fixest)
N <- 1000
dt <- data.table(
x1 = rnorm(N),x2 = rnorm(N),x3 = rnorm(N)
)
beta <- rnorm(3)
dt[,y1 := x1*beta[1] + x2*beta[2] * x3*beta[3] + rnorm(N)]
dt[,y2 := x1*beta[1] + x2*beta[2] * x3*beta[3] + rnorm(N)]
dt[,y3 := x1*beta[1] + x2*beta[2] * x3*beta[3] + rnorm(N)]
dt
beta
depvars <- c("y1","y2","y3")
res_lm <-
lapply(depvars,function(i){
res <- lm(get(i) ~ x1 + x2 + x3,data = dt)
summary(res)
})
res_felm <-
lapply(depvars,function(i){
res <- felm(get(i) ~ x1 + x2 + x3,data = dt)
summary(res)
})
res_feols <-
lapply(depvars,function(i){
res <- feols(get(i) ~ x1 + x2 + x3,data = dt)
summary(res)
})
# Error in feols(get(i) ~ x1 + x2 + x3,data = dt) :
# The variable i is in the LHS of the formula but not in the dataset.
解决方法
我认为这是因为feols
将未评估公式get(i) ~ x1 + x2 + x3
传递给fixest_env
。到未评估的get(i)
到达fixest_env
时,它在调用环境中不再具有引用对象,因此会引发错误。
解决方法是确保公式包含要用作DV的变量的实际名称。您可以通过将字符串转换为公式来实现:
lapply(depvars,function(i) {
fml <- as.formula(paste(i,"~ x1 + x2 + x3"))
res <- feols(fml,data = dt)
summary(res)
})
哪个返回:
#> [[1]]
#> OLS estimation,Dep. Var.: y1
#> Observations: 1,000
#> Standard-errors: Standard
#> Estimate Std. Error t value Pr(>|t|)
#> (Intercept) -0.057391 0.036018 -1.593400 0.111389
#> x1 0.350159 0.036080 9.705000 < 2.2e-16 ***
#> x2 -0.058296 0.036721 -1.587500 0.112711
#> x3 0.012196 0.036110 0.337733 0.735635
#> ---
#> Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#> Log-likelihood: -1,545.80 Adj. R2: 0.0864
#>
#> [[2]]
#> OLS estimation,Dep. Var.: y2
#> Observations: 1,000
#> Standard-errors: Standard
#> Estimate Std. Error t value Pr(>|t|)
#> (Intercept) -0.013447 0.036563 -0.367778 0.713117
#> x1 0.369671 0.036626 10.093000 < 2.2e-16 ***
#> x2 0.004896 0.037277 0.131345 0.895529
#> x3 0.019210 0.036656 0.524056 0.600357
#> ---
#> Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#> Log-likelihood: -1,560.80 Adj. R2: 0.09126
#>
#> [[3]]
#> OLS estimation,Dep. Var.: y3
#> Observations: 1,000
#> Standard-errors: Standard
#> Estimate Std. Error t value Pr(>|t|)
#> (Intercept) -0.020945 0.036181 -0.578896 0.56279
#> x1 0.397365 0.036244 10.964000 < 2.2e-16 ***
#> x2 -0.057537 0.036887 -1.559800 0.119126
#> x3 0.032324 0.036274 0.891114 0.373083
#> ---
#> Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#> Log-likelihood: -1,550.31 Adj. R2: 0.10881
,
更新
从fixest
0.8.0版开始,您可以直接执行多种估算:
res <- feols(c(y1,y2,y3) ~ x1 + x2 + x3,data = dt)
etable(res)
前面的代码执行3个估计,每个因变量一个。请注意,您还可以具有多个RHS,多个固定效果或多个样本 (请参见vignette)。
更新
从fixest
版本0.7开始,公式宏解析器接受字符向量。所以下面的工作:
depvars <- c("y1","y2","y3")
lapply(depvars,function(var) {
res <- feols(xpd(..lhs ~ x1 + x2 + x3,..lhs = var),data = dt)
summary(res)
})
艾伦的答案是完全正确的。另外,您可以在fixest
工具箱中使用一些工具,即公式宏。
您可以使用函数xpd
来“扩展”公式。这是一个示例:
depvars <- list(~ y1,~ y2,~ y3)
lapply(depvars,data = dt)
summary(res)
})
请注意,此处的因变量必须由单侧公式而不是字符串表示。
变量..lhs
以两个点开头,是“宏”变量,将由var
代替。还要注意,宏变量必须以两个点开头(以区别于常规变量)。
这将导致以下结果(与艾伦相同):
#> [[1]]
#> OLS estimation,000
#> Standard-errors: Standard
#> Estimate Std. Error t value Pr(>|t|)
#> (Intercept) -0.026417 0.033482 -0.788981 0.430311
#> x1 0.675098 0.033764 19.995000 < 2.2e-16 ***
#> x2 0.022227 0.032332 0.687468 0.491948
#> x3 -0.001915 0.034032 -0.056276 0.955133
#> ---
#> Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#> Log-likelihood: -1,470.78 Adj. R2: 0.28434
#>
#> [[2]]
#> OLS estimation,000
#> Standard-errors: Standard
#> Estimate Std. Error t value Pr(>|t|)
#> (Intercept) -0.028379 0.034692 -0.818031 0.413535
#> x1 0.718648 0.034984 20.542000 < 2.2e-16 ***
#> x2 0.009986 0.033500 0.298072 0.76571
#> x3 0.021206 0.035262 0.601372 0.547729
#> ---
#> Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#> Log-likelihood: -1,506.27 Adj. R2: 0.29582
#>
#> [[3]]
#> OLS estimation,000
#> Standard-errors: Standard
#> Estimate Std. Error t value Pr(>|t|)
#> (Intercept) -0.040832 0.034680 -1.177400 0.239316
#> x1 0.689918 0.034972 19.728000 < 2.2e-16 ***
#> x2 -0.017889 0.033489 -0.534170 0.593343
#> x3 -0.028022 0.035250 -0.794952 0.426831
#> ---
#> Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#> Log-likelihood: -1,505.94 Adj. R2: 0.28041
仅需注意一下宏:您也可以使用setFixest_fml
对其进行全局设置。以下代码也可以使用:
depvars <- list(~ y1,~ y3)
setFixest_fml(..rhs = ~ x1 + x2 + x3)
lapply(depvars,function(i) {
res <- feols(xpd(..lhs ~ ..rhs,..lhs = i),data = dt)
summary(res)
})
好的,现在是最后一个音符。使用不需要重新定义的宏时,可以避免在xpd
估计函数中使用fixest
。以下将起作用:
setFixest_fml(..lhs = ~ y1,..rhs = ~ x1 + x2 + x3)
res <- feols(..lhs ~ ..rhs,data = dt)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。