如何在 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
估计公式中的所有变量必须在数据集中:与lm
或felm
相反,没有来自全局环境的评估。
但是你的情况可以很容易地用函数 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
以指定要保留的因子级别。 (ref
和 drop
之间的区别很微妙: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)
我有一个差分模型,我想估计它对 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
估计公式中的所有变量必须在数据集中:与lm
或felm
相反,没有来自全局环境的评估。
但是你的情况可以很容易地用函数 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
以指定要保留的因子级别。 (ref
和 drop
之间的区别很微妙: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)