【发布时间】:2020-11-02 23:57:35
【问题描述】:
我正在估计 R 中差分模型的通常称为“事件研究”规范。基本上,我们随着时间的推移观察处理单元和控制单元,并估计带有参数的双向固定效应模型每个时间段接受治疗的“效果”(省略一个时间段,通常是治疗前的那个时间段,作为参考时间段)。我正在努力研究如何用 R 公式紧凑地指定这个模型。
例如,这里是模型...
library(lfe)
library(tidyverse)
library(dummies)
N <- 100
df <- tibble(
id = rep(1:N, 5),
treat = id >= ceiling(N / 2),
time = rep(1:5, each=N),
x = rnorm(5 * N)
)
# produce an outcome variable
df <- df %>% mutate(
y = x - treat * (time == 5) + time + rnorm(5*N)
)
head(df)
# easily recover the parameters with the true model...
summary(felm(
y ~ x + I(treat * (time == 5)) | id + time, data = df
))
现在,我想使用第 4 期作为基线进行事件研究设计,因为治疗发生在第 5 期。我们预计前期 (1-4) 的系数接近于零,并且对在治疗期间治疗(time == 5)
df$timefac <- factor(df$time, levels = c(4, 1, 2, 3, 5))
summary(felm(
y ~ x + treat * timefac | id + time, data = df
))
这看起来不错,但会产生很多NAs,因为有几个系数被单位和时间效应吸收了。理想情况下,我可以指定没有这些系数的模型...
# create dummy for each time period for treated units
tdum <- dummy(df$time)
df <- bind_cols(df, as.data.frame(tdum))
df <- df %>% mutate_at(vars(time1:time5), ~ . * treat)
# estimate model, manually omitting one dummy
summary(felm(
y ~ x + time1 + time2 + time3 + time5 | id + time, data = df
))
现在,问题是如何以紧凑的方式指定此模型。我认为以下内容会起作用,但它会产生非常不可预测的输出......
summary(felm(
y ~ x + treat:timefac | id + time, data = df
))
在上述情况下,R 不使用周期 4 作为参考周期,有时会选择包含与未处理而不是处理的交互。输出是...
Coefficients:
Estimate Std. Error t value Pr(>|t|)
x 0.97198 0.05113 19.009 < 2e-16 ***
treatFALSE:timefac4 NA NA NA NA
treatTRUE:timefac4 -0.19607 0.28410 -0.690 0.49051
treatFALSE:timefac1 NA NA NA NA
treatTRUE:timefac1 -0.07690 0.28572 -0.269 0.78796
treatFALSE:timefac2 NA NA NA NA
treatTRUE:timefac2 NA NA NA NA
treatFALSE:timefac3 0.15525 0.28482 0.545 0.58601
treatTRUE:timefac3 NA NA NA NA
treatFALSE:timefac5 0.97340 0.28420 3.425 0.00068 ***
treatTRUE:timefac5 NA NA NA NA
有没有一种方法可以指定这个模型,而不必为每个时间段手动生成处理单元的虚拟变量和交互?
如果您了解 Stata,我实际上是在寻找以下简单的东西:
areg y x i.treat##ib4.time, absorb(id)
(请注意,告诉 Stata 将变量视为分类变量是多么简单——i 前缀——而不是对时间进行假想,并且还指出周期 4 应该是基本周期——b4 前缀。)
【问题讨论】:
标签: r formula dummy-variable