【问题标题】:feols - fixest: loop over dependent variablefeols - fixst:循环因变量
【发布时间】:2020-08-31 10:33:03
【问题描述】:

我正在尝试使用 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. 

【问题讨论】:

    标签: r lfe


    【解决方案1】:

    更新

    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, 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)
    })
    

    好的,现在是最后一个音符。当您使用不需要重新定义的宏时,您可以避免在fixest 估计函数中使用xpd。以下将起作用:

    setFixest_fml(..lhs = ~ y1, ..rhs = ~ x1 + x2 + x3)
    res <- feols(..lhs ~ ..rhs, data = dt)
    

    【讨论】:

      【解决方案2】:

      我认为这是因为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 
      

      【讨论】:

        猜你喜欢
        • 2021-03-24
        • 1970-01-01
        • 2022-07-27
        • 2016-07-26
        • 1970-01-01
        • 2020-10-31
        • 1970-01-01
        • 1970-01-01
        • 2018-12-05
        相关资源
        最近更新 更多