Как мне обновить код R из nest_legacy в гнездо? - PullRequest
0 голосов
/ 09 января 2020

У меня есть код (ниже), который применяет линейную модель за один квартал на основе данных за предыдущий квартал для оценки недостающих данных, и это работает.

data <- data %>%
  nest_legacy(-groupvar1, -groupvar2) %>%
  mutate(modelvar1 = map(data, ~lm(var1 ~ quarter_date, data = .)),
         modelvar2 = map(data, ~lm(var2 ~ quarter_date, data = .)),
         var1_pred = map2(modelvar1, data, predict),
         var2_pred = map2(modelvar2, data, predict)) %>%
  select(-modelvar1, -modelvar2) %>%
  unnest_legacy()

Я хочу доказать это в будущем используя новый код для гнезда. Я следовал инструкциям на странице справки и нашел следующее:

data = data %>%
    nest(data = c(groupvar1, groupvar2)) %>%
    mutate(modelvar1 = map(data, ~lm(var1 ~ quarter_date, data = .)),
           modelvar2 = map(data, ~lm(var2 ~ quarter_date, data = .)),
           var1_pred = map2(modelvar1, data, predict),
           var2_pred = map2(modelvar2, data, predict)) %>%
    select(-modelvar1, -modelvar2) %>%
    unnest(data, cols = c(var1, var2))

Однако я постоянно получаю сообщение об ошибке

Ошибка: столбец c(aasb, tobd) должно быть длиной 701 (количество строк) или единицей, а не 1402

Очевидно, я что-то не так делаю, но понятия не имею, что это. Может ли кто-нибудь, пожалуйста, дать некоторое представление? Спасибо!

Редактировать: вот пример, который может помочь.

quarter_date = as.Date(c("2014-01-01", "2014-04-01", "2014-01-01", "2014-07-01", "2014-04-01"))
groupvar1 = c("spec1", "spec2", "spec1", "spec3", "spec3")
groupvar2 = c("loc1", "loc2", "loc3", "loc2", "loc3")
var1 = c(0, 656, 268, 78, 92)
var2 = c(87789, 45678, 23367, 76573, 68786)
test = tibble(groupvar1, groupvar2, var1, var2, quarter_date)

1 Ответ

0 голосов
/ 10 января 2020

Я отредактировал данные вашего примера таким образом, чтобы исходный код линейной модели работал, отформатировав даты и добавив столбец quar_date к окончательному столбцу

quarter_date = as.Date(c("2014-01-01", "2014-04-01", "2014-01-01", "2014-07-01", "2014-04-01"))
groupvar1 = c("spec1", "spec2", "spec1", "spec3", "spec3")
groupvar2 = c("loc1", "loc2", "loc3", "loc2", "loc3")
var1 = c(0, 656, 268, 78, 92)
var2 = c(87789, 45678, 23367, 76573, 68786)
data = tibble(groupvar1, groupvar2, var1, var2, quarter_date)

Чтобы получить тот же результат с новым nest вам нужен минус перед группировкой переменных, как вы это делали в оригинале, и вам не нужен аргумент cols для удаления

data = data %>%
    nest(data = c(-groupvar1, -groupvar2)) %>%
    mutate(modelvar1 = map(data, ~lm(var1 ~ quarter_date, data = .)),
           modelvar2 = map(data, ~lm(var2 ~ quarter_date, data = .)),
           var1_pred = map2(modelvar1, data, predict),
           var2_pred = map2(modelvar2, data, predict)) %>%
    select(-modelvar1, -modelvar2) %>%
    unnest(data)
...