如何在 R fixest 中制作模型方程并选择因子交互

How to make a model equation in R fixest and choose factor interactions

我有一个差分模型,我想估计它对 R 的固定效应。我想包括暴露和治疗相互作用以计算领先和滞后效应。

基本上,我有一些共线变量,我想选择从我的模型中排除哪一个。几天前,使用 lfe 软件包会非常简单:

library(data.table)
library(fixest)

crime <- fread("crime.csv")

# Time as a factor for fixed effects
crime[, time := factor(time)]

# Model
xx <- model.matrix(any_crime ~ treatment:time - 1, data = crime) # time is a factor

# Set period 12 as base
xx[, "treatment:time12"] <- 0

# Model with leads and lags
m1 <- felm(any_crime ~ xx | id + time, data = crime)

但是,既然 lfe 已存档,我已转向速度更快的 fixest 包。但是我无法让 feols() 接受我的 model.matrix。与上述操作相同,但将 felm() 替换为 feols() 会出现以下错误:

> feols(any_crime ~ xx | id + time, data = crime)
Error in feols(any_crime ~ xx | id + time, data = crime)
  The variable xx is in the RHS of the formula but not in the dataset.

我已阅读 ?feols(),公式参数未提及模型矩阵,详细信息部分只有一句话。

fixest 也有 model.matrix.fixest,我也检查了这个函数的帮助,它说它需要一个 fixest 对象作为它的第一个参数。我一直无法使用它来创建一个将周期 12 设置为基期的模型。


Here 是可重复性的小数据样本。

谢谢大家

fixest估计公式中的所有变量必须在数据集中:与lmfelm相反,没有来自全局环境的评估。

但是你的情况可以很容易地用函数 i() 来处理。这是 vignette:

中的示例
library(fixest)
data(base_did)
est_did = feols(y ~ x1 + i(treat, period, 5) | id + period, base_did)
est_did
#> OLS estimation, Dep. Var.: y
#> Observations: 1,080 
#> Fixed-effects: id: 108,  period: 10
#> Standard-errors: Clustered (id) 
#>                   Estimate Std. Error   t value  Pr(>|t|)    
#> x1                0.973490   0.045678 21.312000 < 2.2e-16 ***
#> treat:period::1  -1.403000   1.110300 -1.263700  0.209084    
#> treat:period::2  -1.247500   1.093100 -1.141200  0.256329    
#> treat:period::3  -0.273206   1.106900 -0.246813  0.805526    
#> treat:period::4  -1.795700   1.088000 -1.650500  0.101769    
#> treat:period::6   0.784452   1.028400  0.762798  0.447262    
#> treat:period::7   3.598900   1.101600  3.267100  0.001461 ** 
#> treat:period::8   3.811800   1.247500  3.055500  0.002837 ** 
#> treat:period::9   4.731400   1.097100  4.312600   3.6e-05 ***
#> treat:period::10  6.606200   1.120500  5.895800   4.4e-08 ***
#> ---
#> Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#> Log-likelihood: -2,984.58   Adj. R2: 0.48783 
#>                           R2-Within: 0.38963

函数i()执行连续变量(虽然它也可以是一个因子)和一个因子(第二个元素总是被视为一个因子)之间的交互。然后,您可以添加参数 ref and/or drop and/or keep 以指定要保留的因子级别。 (refdrop 之间的区别很微妙:ref 只接受一个值 [drop 接受多个] 并且当在估计。)

在前面的示例中,我们有 ref = 5,因此第 5 个周期将被排除在交互之外。

回到您的示例,以下应该有效(无需创建任何额外数据):

feols(any_crime ~ i(treatment, time, 12) | id + time, data = crime)

然后很容易变基或删除几个:

feols(any_crime ~ i(treatment, time, 10) | id + time, data = crime)
feols(any_crime ~ i(treatment, time, drop = 10:12) | id + time, data = crime)