微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

feols-最固定的:循环遍历因变量 更新更新

如何解决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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?