#r #panel #dummy-variable
#r #панель #фиктивная переменная
Вопрос:
У меня есть набор данных панели, в котором переменные времени и группы уже были преобразованы в фиктивные. Я хочу обратить преобразование вспять, хотя и вернуться к простому id
и time
переменному.
Давайте создадим сопоставимые данные:
library(plm)
library(tidyverse)
library(fastDummies)
data(EmplUK)
EmplUK %>%
select(-sector) %>%
dummy_cols(.data = .,select_columns = c("firm","year"),remove_selected_columns = TRUE,remove_first_dummy = TRUE) -> paneldata
head(paneldata)
Итак, в основном теперь все мои фиктивные переменные — firm_X и year_X, и я хотел бы снова иметь переменную Year и Firm.
Это немного осложняется тем фактом, что Фирма 1 и Год 1 не существуют как фиктивные (поскольку они не были бы нужны в регрессионной модели).
Меня устраивает отсутствие этих точных данных (я могу просто сделать вывод, что первой фирмой будет Фирма 1, а годом будет 1976 год, что на единицу меньше, чем у самой маленькой фирмы).
Есть какие-нибудь идеи, как сделать это красиво? В идеале использовать tidyverse?
Ответ №1:
После некоторых размышлений я понял это и создал небольшую функцию:
getfactorback <- function(data,
groupdummyprefix,
timedummyprefix,
grouplabel,
timelabel,
firstgroup,
firsttime) {
data %>%
mutate(newgroup = ifelse(rowSums(cur_data() %>% select(starts_with("id")))==1,0,1),
newtime = ifelse(rowSums(cur_data() %>% select(starts_with("time")))==1,0,1)) %>%
rename(!!paste0(groupdummyprefix,firstgroup):=newgroup,
!!paste0(timedummyprefix,firsttime):=newtime) %>%
pivot_longer(cols = starts_with(groupdummyprefix),names_to = grouplabel,names_prefix = groupdummyprefix) %>%
filter(value == 1) %>%
select(-value) %>%
pivot_longer(cols = starts_with(timedummyprefix),names_to = timelabel,names_prefix = timedummyprefix) %>%
filter(value == 1) %>%
select(-value) %>%
mutate(across(.cols = c(all_of(grouplabel),all_of(timelabel)),factor)) %>%
relocate(all_of(c(grouplabel,timelabel))) -> output
return(output)
}
getfactorback(data = paneldata,
groupdummyprefix = "firm_",
grouplabel = "firm",
timedummyprefix = "year_",
timelabel = "year",
firstgroup = "1",
firsttime = 1976)