La generazione di stima per intervalli di più di 1 modello lineare in R?

0

Domanda

Sto tentando di generare previsione intervalli utilizzando la funzione predict() per un nuovo set di dati, ma su più di un modello che ho generato per un set di dati. Io sono relativamente inesperto utilizzo di lapply, ma la cifra dovrebbe essere di grande aiuto in questo processo:

#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
                          )

Tuttavia, questo attira il seguente errore:

Errore nell'ottenere(come.carattere(DIVERTIMENTO), mode = "funzione", pe = pe) : oggetto 'model_dna' di modalità "funzione" non è stato trovato

Io non sono certo il modo migliore per strutturare questo lapply funzione, soprattutto quando viene utilizzato su più di un modello. C'è in genere un modo più pulito per avvicinarsi a questo?

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

Migliore risposta

1

Qui si ha una completa tidyverse soluzione:

# 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

Creato il 2021-11-19 dal reprex pacchetto (v2.0.0)

Avviso:

  • dopo dplyr 1.0 non è necessario utilizzare do più per questo tipo di casi
  • con map e map_dfr è possibile calcolare i tuoi pronostici e farli stare bene nel vostro tibble
2021-11-19 18:05:38
1

Oggetto model_dna è un insieme di dati.telaio (più precisamente: un tibble) che contiene il lm-gli oggetti nella sua seconda colonna "model_dna_group".

Nel lapply-chiamata si deve fare riferimento alla colonna, non l'intero frame di dati. Lapply tenta di utilizzare predict sulle colonne del frame di dati, invece di lm-gli elementi della seconda colonna.

In modo da modificare la vostra chiamata, come segue, e funziona:

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

In altre lingue

Questa pagina è in altre lingue

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