Добавление новых данных в существующую модель и использование broom :: augment для добавления прогнозов - PullRequest
0 голосов
/ 01 августа 2020

Я использую tidyverse, broom и purrr, чтобы подогнать модель к некоторым данным по группам. Затем я пытаюсь использовать эту модель для прогнозирования некоторых новых данных, снова по группам. Функция augment broom прекрасно добавляет не только прогнозы, но и другие значения, такие как стандартная ошибка, et c. Однако я не могу заставить функцию «увеличения» использовать новые данные вместо старых. В результате мои два набора прогнозов совершенно совпадают. Вопрос в том, как я могу заставить «дополнить» использовать новые данные вместо старых (которые использовались для соответствия модели)?

Вот воспроизводимый пример:

library(tidyverse)
library(broom)
library(purrr)

# nest the iris dataset by Species and fit a linear model
iris.nest <- nest(iris, data = c(Sepal.Length, Sepal.Width, Petal.Length, Petal.Width)) %>% 
  mutate(model = map(data, function(df) lm(Sepal.Width ~ Sepal.Length, data=df)))

# create a new dataset where the Sepal.Length is 5x as big
newdata <- iris %>% 
  mutate(Sepal.Length = Sepal.Length*5) %>% 
  nest(data = c(Sepal.Length, Sepal.Width, Petal.Length, Petal.Width)) %>% 
  rename("newdata"="data")

# join these two nested datasets together
iris.nest.new <- left_join(iris.nest, newdata)

# now form two new columns of predictions -- one using the "old" data that the model was
# initially fit on, and the second using the new data where the Sepal.Length has been increased
iris.nest.new <- iris.nest.new %>% 
  mutate(preds = map(model, broom::augment),
         preds.new = map2(model, newdata, broom::augment))  # THIS LINE DOESN'T WORK ****
                             
# unnest the predictions on the "old" data
preds <-select(iris.nest.new, preds) %>% 
 unnest(cols = c(preds))
# rename the columns prior to merging
names(preds)[3:9] <- paste0("old", names(preds)[3:9])

# now unnest the predictions on the "new" data
preds.new <-select(iris.nest.new, preds.new) %>% 
 unnest(cols = c(preds.new))
#... and also rename columns prior to merging
names(preds.new)[3:9] <- paste0("new", names(preds.new)[3:9])

# merge the two sets of predictions and compare
compare <- bind_cols(preds, preds.new) 

# compare
select(compare, old.fitted, new.fitted) %>% View(.) # EXACTLY THE SAME!!!!

1 Ответ

0 голосов
/ 01 августа 2020

При вызове broom::augment обратите внимание, что параметр newdata= является третьим параметром. Когда вы используете purr::map2, значения, которые вы перебираете, по умолчанию передаются в первых двух параметрах. Неважно, как вы назвали те списки, которые вы передаете. Вам необходимо явно поместить новые данные в параметр newdata=.

iris.nest.new <- iris.nest.new %>% 
  mutate(preds = map(model, broom::augment),
         preds.new = map2(model, newdata, ~broom::augment(.x, newdata=.y)))

Разницу можно увидеть, запустив эти два команды.

broom::augment(iris.nest.new$model[[1]], iris.nest.new$newdata[[1]])
broom::augment(iris.nest.new$model[[1]], newdata=iris.nest.new$newdata[[1]])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...