Лаги не любят фиктивные переменные

#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)