如何在新数据上使用模型扩充
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)
使用 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)