2017-10-05 1 views
0

Je suis en train de lire le R for Data Science de Hadley Wickham et j'ai rencontré les exercices de 23.2.1, traitant de la robustesse des modèles linéaires qui étaient équipés de carrés différences par rapport aux ensembles de données générés aléatoirement.Comment ajuster des modèles linéaires à plusieurs ensembles de données générés aléatoirement en utilisant le tidyverse

J'ai essayé de l'implémenter en utilisant les paquets tidyverse.

generate_data <- function(seed){ 
    set.seed(seed) 
    tibble(
    x = rep(1:10, each = 3), 
    y = x * 1.5 + 6 + rt(length(x), df = 2), 
    seed = as.character(seed) 
) 
} 
seeds <- 6:11 
datasets <- seeds %>% 
    map(generate_data) 

Ceci est le point crucial. Les ensembles de données existent dans une liste de données, j'ai donc utilisé la fonction map, pour finalement extraire les coefficients du modèle respectif avec coef. Dans ce processus, cependant, je perds l'information sur la graine qui a été utilisée et, par conséquent, le lien vers l'ensemble de données auquel il se réfère, ce qui me force à faire la chose moche mutate(seed = as.character(seeds)).

Convertir la liste des dataframes en un seul pour le traçage:

datasets <- datasets %>% map_df(bind_rows) 

ggplot(datasets, 
     aes(x,y, col = seed) 
     ) + 
    geom_jitter(width = .1) + 
    geom_abline(
    data = model_parameters, 
    aes(
     intercept = `(Intercept)`, 
     slope = x, 
     color = seed 
    ) 
) 

Ma solution semble un peu laid. Y a-t-il une approche plus naturelle à cela?

Répondre

3

Depuis que vous avez ajouté la colonne de départ, il est généralement plus facile de travailler avec un grand data.frame qu'une liste de data.frames. Ainsi, vous pouvez faire

library(tidyverse) 
datasets <- seeds %>% 
    map_df(generate_data) 

puis lors de l'extraction des coefficients, le paquet broom peut aider d'une manière ordonnée. Par exemple

model_parameters <- datasets %>% group_by(seed) %>% 
    do(broom::tidy(lm(y~x, .))) %>% 
    select(seed, term, estimate) %>% 
    spread(term, estimate) 

Ensuite, ceux-ci peuvent aussi bien aller directement dans le code ggplot que vous avez déjà écrit

+0

Great, merci beaucoup! Je n'étais pas au courant de la fonction 'do' – telegott