Как использовать дополнение с моделью на новых данных - PullRequest
0 голосов
/ 07 августа 2020

Довольно просто использовать функцию augment из пакета Broom в R для добавления прогнозов обратно в тиббл. Viz.

df <- iris %>%
  nest(data = everything()) %>%
  mutate(model = map(data, function(x) lm(Sepal.Length ~ Sepal.Width, data = x)),
         pred = map2(model, data, ~augment(.x, newdata = .y))) %>%
  unnest(pred)

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

mod <- lm(Sepal.Length ~ Sepal.Width, data = iris)

df2 <- iris %>%
  mutate(Sepal.Width = Sepal.Width + rnorm(1)) %>%
  nest(data = everything()) %>%
  mutate(pred = map2(mod, data, ~augment(.x, newdata = .y)))

# Error: Problem with `mutate()` input `pred`.
# x No augment method for objects of class numeric
# i Input `pred` is `map2(mod, data, ~augment(.x, newdata = .y))`.

Как мне следует использовать augment для соответствия новым данным? Является ли использование внешнего объекта модели (в приведенном выше примере mod) наилучшей практикой или есть более элегантный способ?

Ответы [ 2 ]

1 голос
/ 07 августа 2020

Поскольку существует только одна модель, мы можем сделать это без использования map.

library(dplyr)

df1 <- iris %>%
  mutate(Sepal.Width = Sepal.Width + rnorm(1)) %>%
  tidyr::nest(data = everything()) %>%
  summarise(pred = broom::augment(mod, newdata = data[[1]]), 
            mod = list(mod), 
            data = data)
0 голосов
/ 07 августа 2020

Только что разместив вопрос, думаю, у меня есть ответ. Я не буду принимать ответ в течение 48 часов на всякий случай, если кто-то опровергнет или предоставит более исчерпывающий ответ.

В этом примере map2 ожидает mod как вектор или список, но это объект модели . Ввод mod в таблицу в качестве объекта списка подавляет ошибку и правильно вычисляет прогнозы.

mod <- lm(Sepal.Length ~ Sepal.Width, data = iris)

df2 <- iris %>%
  mutate(Sepal.Width = Sepal.Width + rnorm(1)) %>%
  nest(data = everything()) %>%
  mutate(mod = list(mod)) %>% #! this is the additional step
  mutate(pred = map2(mod, data, ~augment(.x, newdata = .y))) %>%
  unnest(pred)

В качестве альтернативы, приведите объект внешней модели в виде списка.

...
  mutate(pred = map2(list(mod), data, ~augment(.x, newdata = .y))) %>%
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...