r - feols - fixst:循环因变量
问题描述
我正在尝试使用 fixst 包中的 feols 函数循环一组因变量。在使用 lm 或在 lfe::felm 中,我只需使用 get() 函数。使用 fixst,我收到一个错误。为什么会这样,有没有办法绕过它?这是一个可重现的示例:
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.
解决方案
更新
从fixest
0.8.0 版本开始,您可以直接执行多个估计:
res <- feols(c(y1, y2, y3) ~ x1 + x2 + x3, data = dt)
etable(res)
前面的代码执行 3 个估计,每个因变量一个。请注意,您还可以拥有多个 RHS、多个固定效果或多个样本(请参阅小插图)。
更新
从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, function(var) {
res <- feols(xpd(..lhs ~ x1 + x2 + x3, ..lhs = var), data = dt)
summary(res)
})
注意这里的因变量必须用单面公式而不是字符串来表示。该变量..lhs
以两个点开头,是将被替换的“宏”变量var
。另请注意,宏变量必须以两个点开头(以将它们与常规变量区分开来)。
这导致以下结果(与艾伦相同):
#> [[1]]
#> OLS estimation, Dep. Var.: y1
#> Observations: 1,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, Dep. Var.: y2
#> Observations: 1,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, Dep. Var.: y3
#> Observations: 1,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, ~ y2, ~ 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)
推荐阅读
- c# - WPF - Stackpanel中的多个扩展器问题
- c# - 如何保存可读的 Unity 文件?
- haskell - 功能船中的非详尽模式
- swift - 如何在 NSStatusItemButton 中绘制具有相等线宽的矩形?
- json - 从 Excel 转换为 CSV 到 Firebase 数据库的 JSON 时如何保留我的子列
- aws-lambda - 使用无服务器框架设置 API Gateway 集成请求超时
- hosting - ArcGIS online 是否可以托管 ESRI 地图服务或 OGC 的 WMS?
- python - Python3中Dictionaries-inside-another-Dictionary的空间复杂度
- python - 为什么一维 CNN 在时间序列上的准确率很低?
- android - 将 APK 上传到 Google Play 商店时出现问题