#r #dataframe #dplyr
#r #фрейм данных #dplyr
Вопрос:
Я хочу определить функцию lag_and_dummies, которая добавит 2 лага для моих данных, а также 3-уровневые фиктивные переменные (имея в виду, как правильно включить их в данные панели).
Давайте рассмотрим данные :
data("EmplUK", package="plm")
head(EmplUK)
firm year sector emp wage capital output
1 1 1977 7 5.041 13.1516 0.5894 95.7072
2 1 1978 7 5.600 12.3018 0.6318 97.3569
3 1 1979 7 5.015 12.8395 0.6771 99.6083
4 1 1980 7 4.715 13.8039 0.6171 100.5501
5 1 1981 7 4.093 14.2897 0.5076 99.5581
6 1 1982 7 3.166 14.8681 0.4229 98.6151
Функция
lag_and_dummies <- function(x) {
#adding 2 lags to wage
x <- x %>%
group_by_at(1) %>%
mutate(across(wage, dplyr::lag, n = 2, default = NA))
#deleting NA's
x <- na.omit(x)
#creating dummy three-level dummy variables
x <- within(x, {
dummy <- as.factor(ave(get(colnames(x)[2]), get(colnames(x)[1]), FUN = function(a) rep_len(1:3, length(a))))
})
x <- cbind(x, model.matrix(~ dummy - 1, data = x))
x
}
Странная вещь, которая происходит, заключается в том, что три столбца для фиктивных переменных хранятся в одном столбце. Посмотрите на вывод представления :
Однако, если я удалю добавление лагов из lag_and_dummies, это будет работать правильно, т.е.
lag_and_dummies <- function(x) {
x <- within(x, {
dummy <- as.factor(ave(get(colnames(x)[2]), get(colnames(x)[1]), FUN = function(a) rep_len(1:3, length(a))))
})
x <- cbind(x, model.matrix(~ dummy - 1, data = x))
x
}
Знаете ли вы, почему включение лагов приводит к созданию фиктивных переменных в одном столбце?
Ответ №1:
В вашей первой функции ваши данные сгруппированы. Кажется, возникает какая-то проблема, когда cbind dataframe с сгруппированным tibble. Вы можете ungroup
использовать данные, и они работают так, как ожидалось.
library(dplyr)
lag_and_dummies <- function(x) {
x <- x %>%
group_by_at(1) %>%
mutate(wage = dplyr::lag(wage, n = 2, default = NA))
x <- na.omit(x)
#creating dummy three-level dummy variables
x <- within(x, {
dummy <- as.factor(ave(get(colnames(x)[2]),
get(colnames(x)[1]), FUN = function(a) rep_len(1:3, length(a))))
})
x <- cbind(x %>% ungroup, model.matrix(~ dummy - 1, data = x))
x
}
lag_and_dummies(EmplUK)