Вот пример того, как подгонять несколько моделей по группам и получать от них прогнозы.
Определение данных для прогнозирования:
newdat <- data.frame(wt = c(4,4.2))
library(tidyverse)
mtcars %>%
group_by(cyl) %>% #group by cyl
nest %>% #nest groups
mutate(m1 = purrr::map(.x = data, .f = ~ lm(mpg ~ wt, data = .))) %>% #create models
mutate(Pred = purrr::map(.x = m1, ~ predict(., newdat))) %>% #predict on new data
pull(Pred) #pull predictions
#output
[[1]]
1 2
17.28842 16.73240
[[2]]
1 2
16.98309 15.85369
[[3]]
1 2
15.09828 14.65979
или слегка изменено:
mtcars %>%
group_by(cyl) %>%
nest %>%
mutate(m1 = purrr::map(.x = data, .f = ~ lm(mpg ~ wt, data = .))) %>%
mutate(Pred = purrr::map(.x = m1, ~ predict(., newdat))) %>%
select(cyl, Pred) %>%
unnest #one can add %>% cbind(newdat = newdat) to know for which wt the pred is for
#output
# A tibble: 6 x 2
cyl Pred
<dbl> <dbl>
1 6.00 17.3
2 6.00 16.7
3 4.00 17.0
4 4.00 15.9
5 8.00 15.1
6 8.00 14.7
РЕДАКТИРОВАТЬ к вопросу в комментариях
Чтобы получить стандартные ошибки, я думаю, что проще всего определить пользовательскую функцию для предиката, которая будет возвращать фрейм данных fit
и se.fit
:
pred <- function(x, ...){
z <- predict.lm(x, se.fit = TRUE, ...)
as.data.frame(z[1:2])
}
mtcars %>%
mutate(cyl1 = factor(cyl)) %>%
group_by(cyl) %>%
nest %>%
mutate(m1 = purrr::map(.x = data, .f = ~ lm(mpg ~ wt, data = .))) %>%
mutate(Pred = purrr::map(.x = m1, ~ pred(., newdat = newdat))) %>%
select(cyl, Pred) %>%
unnest %>%
cbind(newdat = newdat)
#output
cyl fit se.fit wt
1 6 17.28842 1.2581400 4.0
2 6 16.73240 1.5111249 4.2
3 4 16.98309 3.3269446 4.0
4 4 15.85369 3.6813880 4.2
5 8 15.09828 0.5409614 4.0
6 8 14.65979 0.5609545 4.2