Как правило, если вы хотите повторять процесс много раз с разными входными данными каждый раз, вам нужна функция. Следующая функция принимает скалярное значение year_value
в качестве входных данных, создает локальные переменные для регрессии и экспортирует оценки для модельного термина did
.
foo <- function (year_value) {
## create local variables from `mydata`
y <- mydata$y
treated <- as.numeric(mydata$country %in% c("E", "F", "G")) ## use `%in%`
time <- as.numeric(mydata$year >= year_value) ## use `year_value`
did <- time * treated
## run regression using local variables
didreg <- lm(y ~ treated + time + did)
## return estimate for model term `did`
coef(summary(didreg))["did", ]
}
foo(1993)
# Estimate Std. Error t value Pr(>|t|)
#-2.784222e+09 1.504349e+09 -1.850782e+00 6.867661e-02
Обратите внимание, что есть несколько мест, где ваш оригинальный код может быть улучшен. Скажем, с использованием "%in%"
вместо нескольких "|"
и использованием as.numeric
вместо ifelse
для приведения логического значения к числовому.
Теперь вам нужно что-то вроде цикла для итерации этой функции по нескольким year_value
. Я бы использовал lappy
.
## raw list of result from `lapply`
year_of_choice <- 1993:1994 ## taken for example
result <- lapply(year_of_choice, foo)
## rbind them into a matrix
data.frame(year = year_of_choice, do.call("rbind", result), check.names = FALSE)
# year Estimate Std. Error t value Pr(>|t|)
#1 1993 -2784221881 1504348732 -1.850782 0.06867661
#2 1994 -2519511630 1455676087 -1.730819 0.08815711
Обратите внимание, не включайте в качестве выбора год 1990 (минимум переменной year
), в противном случае time
будет вектором 1, таким же, как и перехват. Получившаяся модель имеет недостаток ранга, и вы получите ошибку «индекс за пределами». Версия R, начиная с 3.5.0, имеет новый аргумент complete
для универсальной функции coef
. Так что для стабильности мы можем использовать
coef(summary(didreg), complete = TRUE)["did", ]
Но вы должны увидеть все NA
или NaN
за 1990 год.