• 1000 «эффект» лечения в каждый период времени (за исключением одного периода, обычно периода до лечения, в качестве базового периода). Я борюсь с тем, как компактно указать эту модель с помощью формул 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
))
Выглядит неплохо, но дает много NA
с, потому что некоторые коэффициенты поглощаются эффектами единицы и времени. В идеале я могу указать модель без этих коэффициентов ...
# 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
))
Теперь вопрос в том, как компактно указать эту модель. Я думал, что следующее сработает, но он дает очень непредсказуемый результат ... обрабатывали. Результатом будет ...
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
.)