Generování predikce časových intervalech pro více než 1 lineární model v R?

0

Otázka

Pokouším se vytvořit predikční intervaly pomocí funkce predict() pro novou sadu dat, ale na více než jeden model, který jsem vytvořili pro dataset. Jsem relativně nezkušený v používání lapply, ale postava to by mělo být užitečné v tomto procesu:

#Calling in my libraries:
library(dplyr)

#Creating dataset:

DNase <- DNase

#Generating models, one for each "Run" in DNAse:
model_dna <- DNase %>% 
  group_by(Run) %>% 
  do(model_dna_group = lm(log(density) ~ log(conc), data = .)) %>%   ungroup()

#Creating a new data set to be used to generate predictions:
new_dna <- as.data.frame(DNase$conc) %>% 
  mutate(conc = DNase$conc * 2) %>% select(conc)

#Attempting to apply predict to these models for a new data frame:
new_dna_w_predictions <- lapply(
                           X = model_dna, 
                           FUN = predict, 
                           newdata = new_dna, 
                           interval = "prediction", 
                           level = 0.9
                          )

Nicméně, toto čerpá následující chyba:

Chyba v(jako.charakteru(ZÁBAVA), mode = "funkce", envir = žp) : objekt 'model_dna' režim 'funkce' nebyl nalezen

Nejsem si jistý, jak nejlépe strukturovat tento lapply funkce, zejména při použití po více než jeden model. Je obecně čistší způsob, jak na to?

dplyr lm model predict
2021-11-19 15:33:36
2

Nejlepší odpověď

1

Zde máte kompletní tidyverse řešení:

# Calling in my libraries:
library(dplyr)
library(purrr)

# Creating dataset:
DNase <- DNase

# Creating a new data set to be used to generate predictions:
new_dna <- DNase %>% transmute(conc = conc * 2)  # simplified

# Generating models, one for each "Run" in DNAse:
model_dna <- DNase %>% 
  group_by(Run) %>% 
  summarise(model_dna_group = list(lm(log(density) ~ log(conc))))
  
model_dna
#> # A tibble: 11 x 2
#>    Run   model_dna_group
#>    <ord> <list>         
#>  1 10    <lm>           
#>  2 11    <lm>           
#>  3 9     <lm>           
#>  4 1     <lm>           
#>  5 4     <lm>           
#>  6 8     <lm>           
#>  7 5     <lm>           
#>  8 7     <lm>           
#>  9 6     <lm>           
#> 10 2     <lm>           
#> 11 3     <lm>


# Run predictions
model_dna %>%
  group_by(Run) %>% 
  summarise(map(model_dna_group, predict, newdata = new_dna, interval = "prediction", level = 0.9) %>% map_dfr(as_tibble),
            .groups = "drop")

#> # A tibble: 1,936 x 4
#>    Run       fit    lwr    upr
#>    <ord>   <dbl>  <dbl>  <dbl>
#>  1 10    -2.16   -2.48  -1.85 
#>  2 10    -2.16   -2.48  -1.85 
#>  3 10    -1.33   -1.64  -1.03 
#>  4 10    -1.33   -1.64  -1.03 
#>  5 10    -0.918  -1.22  -0.617
#>  6 10    -0.918  -1.22  -0.617
#>  7 10    -0.503  -0.804 -0.201
#>  8 10    -0.503  -0.804 -0.201
#>  9 10    -0.0873 -0.392  0.217
#> 10 10    -0.0873 -0.392  0.217
#> # ... with 1,926 more rows

Vytvořen na 2021-11-19 do reprex balíček (v2.0.0)

Upozornění:

  • po dplyr 1.0 nemusíte použít do už pro tento druh případů
  • s map a map_dfr můžete vypočítat vaše předpovědi a fit je hezky ve vaší tibble
2021-11-19 18:05:38
1

Váš objekt model_dna je datový.rám (přesněji: tibble), která obsahuje lm-objekty v jeho druhém sloupci "model_dna_group".

V lapply-volání, měli byste odkazovat na sloupce, ne celý datový rámec. Lapply pokusí použít predict na sloupce dat rám místo lm-předměty ve druhém sloupci.

Takže upravit váš hovor takto a funguje:

new_dna_w_predictions <- lapply(
                           X = model_dna$model_dna_group, 
                           FUN = predict, 
                           newdata = new_dna, 
                           interval = "prediction", 
                           level = 0.9
                          )
2021-11-19 17:22:23

V jiných jazycích

Tato stránka je v jiných jazycích

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................