Как вы прогнозируете на многих моделях, вложенных в таблицы? - PullRequest
0 голосов
/ 10 апреля 2020

Я следовал https://r4ds.had.co.nz/many-models.html, чтобы создать тиббл с отдельными GAM для каждой строки. Столбец данных содержит данные, которые использовались для создания GAM. Теперь у меня возникли проблемы при попытке использовать функциюgnast.Gam для создания нового столбца с прогнозируемыми значениями.

# A tibble: 2,157 x 3
# Groups:   Site [2,157]
   Site                     data             model 
   <fct>                    <list>           <list>
 1 Abana Rock North 1       <tibble [7 x 6]> <gam> 
 2 Abana Rock North 2       <tibble [7 x 6]> <gam> 
 3 Abana Rock South 1       <tibble [7 x 6]> <gam> 
 4 Abana Rock South 2       <tibble [7 x 6]> <gam> 
 5 Ampa Marker East         <tibble [7 x 6]> <gam> 
 6 Ampa Marker West         <tibble [7 x 6]> <gam> 
 7 Ampa Patches Southwest 1 <tibble [7 x 6]> <gam> 
 8 Ampa Patches Southwest 2 <tibble [7 x 6]> <gam> 
 9 Brunei Patches 1         <tibble [7 x 6]> <gam> 
10 Brunei Patches 2         <tibble [7 x 6]> <gam> 
# ... with 2,147 more rows

# A tibble: 7 x 6
  Country Location       Year Population100km
  <fct>   <fct>          <dbl>           <int>
1 Brunei  Inshore Brunei  1990          431102
2 Brunei  Inshore Brunei  1995          492958
3 Brunei  Inshore Brunei  2000          545008
4 Brunei  Inshore Brunei  2005          602691
5 Brunei  Inshore Brunei  2010          660197
6 Brunei  Inshore Brunei  2015          715266
7 Brunei  Inshore Brunei  2020          766133

Код на данный момент выглядит следующим образом:

data <- rawdata %>% 
  group_by(Site) %>% 
  nest()

model_function <- function(df) {
  gam(Population100km ~ Year, data = df)
}

models <- data %>% 
  mutate(model = map(data, mode_function))

years <- data.frame(Year=1990:2020)

Теперь я в основном пытаюсь выполнить следующее для каждой модели и сохранить его как другой столбец, используя mutate.

predict.gam(models$model, predict.years)

Любая помощь будет принята с благодарностью. Спасибо!

1 Ответ

1 голос
/ 10 апреля 2020

Вы должны быть в состоянии использовать аналогичный синтаксис для прогнозов. Здесь я использовал gapminder, чтобы сделать его воспроизводимым.

library(tidyverse)
library(mgcv)
#> Loading required package: nlme
#> 
#> Attaching package: 'nlme'
#> The following object is masked from 'package:dplyr':
#> 
#>     collapse
#> This is mgcv 1.8-31. For overview type 'help("mgcv-package")'.

rawdata <- gapminder::gapminder

data <- rawdata %>% 
  group_by(country) %>% 
  nest()

years <- data.frame(year=1990:2020)

models <- data %>% 
  mutate(
    model = map(data, ~ gam(lifeExp ~ year, data = .x)),
    predicted = map(model, ~ predict(.x, newdata = years))
    )

unnest(models, predicted)
#> # A tibble: 4,402 x 4
#> # Groups:   country [142]
#>    country     data              model  predicted
#>    <fct>       <list>            <list>     <dbl>
#>  1 Afghanistan <tibble [12 × 5]> <gam>       40.4
#>  2 Afghanistan <tibble [12 × 5]> <gam>       40.6
#>  3 Afghanistan <tibble [12 × 5]> <gam>       40.9
#>  4 Afghanistan <tibble [12 × 5]> <gam>       41.2
#>  5 Afghanistan <tibble [12 × 5]> <gam>       41.5
#>  6 Afghanistan <tibble [12 × 5]> <gam>       41.7
#>  7 Afghanistan <tibble [12 × 5]> <gam>       42.0
#>  8 Afghanistan <tibble [12 × 5]> <gam>       42.3
#>  9 Afghanistan <tibble [12 × 5]> <gam>       42.6
#> 10 Afghanistan <tibble [12 × 5]> <gam>       42.8
#> # … with 4,392 more rows

Создано в 2020-04-10 пакетом Представить (v0.3.0)

...