R преобразовать манекены в факторную переменную

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