Использование функции прогнозирования для новых данных вместе с Tidyverse - PullRequest
0 голосов
/ 14 сентября 2018

Я хочу использовать функцию predict для новых данных вместе с tidyverse, как в следующем примере. Однако я не мог понять, как использовать с новыми данными для wt = 4.0 и 4.2. Любые намеки, пожалуйста.

library(tidyverse)    
  mtcars %>%
    dplyr::mutate(cyl1 = factor(cyl)) %>%
    tidyr::nest(-cyl) %>%
    dplyr::mutate(m1  = purrr::map(.x = data, .f = ~ lm(mpg ~ wt, data = .))) %>%
    mutate(Pred = purrr::map(.x = m1, .f = predict)) %>%
    dplyr::pull(Pred)

1 Ответ

0 голосов
/ 14 сентября 2018

Вот пример того, как подгонять несколько моделей по группам и получать от них прогнозы.

Определение данных для прогнозирования:

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