Найти прогнозы для линейной модели, которая является grouped_by - PullRequest
1 голос
/ 18 октября 2019

Я хотел бы получить прогнозируемые значения на основе модели, которую я подгоняю к обучающему набору данных. Я делал это раньше, но теперь у меня есть фактор группировки, и это меня отталкивает. Я хочу прогнозировать биомассу на основе населения для каждой среды.

library(tidyverse)

fit_mods<-df %>%
  group_by(environ) %>%
  do(model = lm(biomass ~ poly(population, 2), data = .))

В конечном итоге я хочу выяснить, у какой популяции биомасса самая большая. Обычно я делал бы это, создавая сетку и запуская модель для моих новых значений и находя максимальное значение, но я не знаю, как это сделать с группировкой. Обычный способ:

min_pop <- min(df$population)
max_pop <- max(df$population)

grid_pop <- expand.grid(new = (seq(from = min_pop,
                                   to = max_pop, 
                                   length.out = 1000)),
                        environ = c("A", "B"))  

 #This is what I did with ungrouped data, but doesn't work now.
 pred_pop <- predict(object = fit_mods, 
                newdata = grid_pop,
                interval = "predict")  

Вот некоторые фиктивные данные:

  df <- as.data.frame(list(environ = c("a", "a", "a", "a", "a", "b", "b", "b", "b", "b"),
   population = c(2, 3, 4, 5, 6, 3, 4, 5, 6, 7), 
   biomass = c(1, 2.2, 3.5, 4.1, 3.8, 2.5, 3.6, 4.3, 5.2, 5.1)), class = "data.frame")

1 Ответ

1 голос
/ 19 октября 2019

При подходе во многих моделях вы можете сделать это следующим образом:

library(tidyverse)

   fit_mods <- df %>%
     nest(-environ) %>% 
     mutate(models = map(data, ~ lm(biomass ~ poly(population, 2), data = .x)),
         min_pop = map_dbl(data, ~ pull(.x, population) %>% min),
         max_pop = map_dbl(data, ~ pull(.x, population) %>% max),
         new = map2(min_pop, max_pop, ~ tibble(population = seq(from = .x,
                                                to = .y, 
                                                length.out = 1000))),
         pred = map2(models,
                     new,
                     ~ predict(object = .x,
                               newdata = select(.y,population),
                               interval = "predict")))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...