Ich versuche, eine Reihe von abhängigen Variablen mit der Funktion feols aus dem fixest-Paket zu durchlaufen. In der Basis mit lm oder in lfe :: felm würde ich einfach die Funktion get () verwenden. Mit fixest erhalte ich einen Fehler. Warum ist das so und gibt es einen Weg, es zu umgehen? Hier ist ein reproduzierbares Beispiel:

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
A.Fischer 31 Aug. 2020 im 13:33

2 Antworten

Beste Antwort

Aktualisieren

Ab der besten Version 0.7 akzeptiert der Formel-Makro-Parser Zeichenvektoren. Also funktioniert folgendes:

depvars <- c("y1", "y2", "y3")

lapply(depvars, function(var) {
    res <- feols(xpd(..lhs ~ x1 + x2 + x3, ..lhs = var), data = dt)
    summary(res)
})

Die Antwort von Allan ist vollkommen richtig. Alternativ können Sie einige Werkzeuge in der fixest Toolbox verwenden, nämlich Formelmakros.

Mit der Funktion xpd können Sie eine Formel "erweitern". Hier ist ein Beispiel:

depvars <- list(~ y1, ~ y2, ~ y3)

lapply(depvars, function(var) {
    res <- feols(xpd(..lhs ~ x1 + x2 + x3, ..lhs = var), data = dt)
    summary(res)
})

Beachten Sie, dass die abhängige Variable hier durch einseitige Formeln anstelle von Zeichenfolgen dargestellt werden muss. Die Variable ..lhs beginnt mit zwei Punkten und ist die "Makro" -Variable, die durch var ersetzt wird. Beachten Sie auch, dass Makrovariablen mit zwei Punkten beginnen müssen (um sie von regulären Variablen zu unterscheiden).

Dies führt zu folgenden Ergebnissen (wie Allan):

#> [[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 

Nur noch ein Hinweis zu Makros: Mit setFixest_fml können Sie sie auch global festlegen. Der folgende Code hätte auch funktioniert:

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

OK, jetzt die allerletzte Note. Wenn Sie Makros verwenden, die keiner Neudefinition bedürfen, können Sie die Verwendung von xpd in fixest Schätzfunktionen vermeiden. Folgendes würde funktionieren:

setFixest_fml(..lhs = ~ y1, ..rhs = ~ x1 + x2 + x3)
res <- feols(..lhs ~ ..rhs, data = dt)
2
Laurent Bergé 29 Okt. 2020 im 10:30

Ich denke, das liegt daran, dass feols die nicht bewertete Formel get(i) ~ x1 + x2 + x3 an fixest_env übergibt. Wenn das nicht bewertete get(i) in fixest_env eintrifft, hat es keinen Referenten mehr in der aufrufenden Umgebung, sodass ein Fehler ausgegeben wird.

Um dies zu umgehen, müssen Sie sicherstellen, dass die Formel den tatsächlichen Namen der Variablen enthält, die Sie als DV verwenden möchten. Sie können dies tun, indem Sie eine Zeichenfolge in eine Formel konvertieren:

lapply(depvars, function(i) {
   fml <- as.formula(paste(i, "~ x1 + x2 + x3"))
   res <- feols(fml, data = dt)
   summary(res)
 })

Welches gibt zurück:

#> [[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 
2
Allan Cameron 31 Aug. 2020 im 11:52