如何在新数据上使用模型扩充

How to use augment with a model on new data

使用 R 中 Broom 包中的 augment 函数将预测添加回 tibble 相当简单。即

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)是最佳实践还是有更优雅的方法?

刚刚发布的问题,我想我有答案了。我不会在 48 小时内接受答案,以防万一有人反驳或提供更全面的答案。

在示例中,map2 期望 mod 作为向量或列表,但它是模型对象。将 mod 作为列表对象放入 tibble 中可以抑制错误并正确计算预测。

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))) %>%
...

由于只有一个模型,我们可以不使用 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)