library(tidymodels)
Train %>% nest(-Groups) %>%
mutate(fit=map(data,~lm(X~Y+Z,x=.)),
augmented = map(fit,augment),
predict = map2(fit,Y,Z)) %>%
unnest(augmented) %>% select(-data)
这对于Train数据非常有效。我可以通过使用不同的扫把功能,如glance或augment,来获得合适的模型摘要等。每个小组都有自己的模型,这是我想要的。
挑战是当我想在测试数据上使用这个模型时。
似乎直截了当,但不知何故,解决方案逃避我:(
当您适合这样嵌套的数据时,您最终会得到许多模型,而不仅仅是一个,因此您还需要设置自己在上预测许多模型。
library(tidyverse)
library(broom)
data(Orange)
Orange <- as_tibble(Orange)
orange_fit <- Orange %>%
nest(data = c(-Tree)) %>% ## this sets up five separate models
mutate(
fit = map(data, ~ lm(age ~ circumference, data = .x))
)
## the "test data" here is `circumference = c(50, 100, 150)`
orange_fit %>%
select(Tree, fit) %>%
crossing(circumference = c(50, 100, 150)) %>%
mutate(new_data = map(circumference, ~tibble(circumference = .)),
predicted_age = map2_dbl(fit, new_data, predict))
#> # A tibble: 15 x 5
#> Tree fit circumference new_data predicted_age
#> <ord> <list> <dbl> <list> <dbl>
#> 1 3 <lm> 50 <tibble [1 × 1]> 392.
#> 2 3 <lm> 100 <tibble [1 × 1]> 994.
#> 3 3 <lm> 150 <tibble [1 × 1]> 1596.
#> 4 1 <lm> 50 <tibble [1 × 1]> 331.
#> 5 1 <lm> 100 <tibble [1 × 1]> 927.
#> 6 1 <lm> 150 <tibble [1 × 1]> 1523.
#> 7 5 <lm> 50 <tibble [1 × 1]> 385.
#> 8 5 <lm> 100 <tibble [1 × 1]> 824.
#> 9 5 <lm> 150 <tibble [1 × 1]> 1264.
#> 10 2 <lm> 50 <tibble [1 × 1]> 257.
#> 11 2 <lm> 100 <tibble [1 × 1]> 647.
#> 12 2 <lm> 150 <tibble [1 × 1]> 1037.
#> 13 4 <lm> 50 <tibble [1 × 1]> 282.
#> 14 4 <lm> 100 <tibble [1 × 1]> 640.
#> 15 4 <lm> 150 <tibble [1 × 1]> 999.
由reprex包(v0.3.0)在2021-01-25创建
注意,最后我们对每个模型(5)的测试集(3)中的每个点进行了预测。