2014-07-05 3 views
7

Un esempio cambiare leggermente l'aiuto R per do():dplyr, do(), estraendo parametri dal modello senza perdere raggruppamento variabile

by_cyl <- group_by(mtcars, cyl) 
models <- by_cyl %>% do(mod = lm(mpg ~ disp, data = .)) 
coefficients<-models %>% do(data.frame(coef = coef(.$mod)[[1]])) 

Nel dataframe coefficienti, c'è il primo coefficiente il modello lineare per ciascun gruppo cyl. La mia domanda è come posso produrre un dataframe che contiene non solo una colonna con i coefficienti, ma anche una colonna con la variabile di raggruppamento.

Edit =====: Ho estendere l'esempio per cercare di rendere più chiaro il mio problema

Supponiamo che io voglio per estrarre i coefficienti del modello e un po 'di previsione. Posso fare questo:

by_cyl <- group_by(mtcars, cyl) 
getpars <- function(df){ 
    fit <- lm(mpg ~ disp, data = df) 
    data.frame(intercept=coef(fit)[1],slope=coef(fit)[2]) 
} 
getprediction <- function(df){ 
    fit <- lm(mpg ~ disp, data = df) 
    x <- df$disp 
    y <- predict(fit, data.frame(disp= x), type = "response") 
    data.frame(x,y) 
} 
pars <- by_cyl %>% do(getpars(.)) 
prediction <- by_cyl %>% do(getprediction(.)) 

Il problema è che il codice è ridondante perché sto montando il modello due volte. La mia idea era quella di costruire una funzione che restituisce una lista con tutte le informazioni:

getAll <- function(df){ 
    results<-list() 
    fit <- lm(mpg ~ disp, data = df) 
    x <- df$disp 
    y <- predict(fit, data.frame(disp= x), type = "response") 

    results$pars <- data.frame(intercept=coef(fit)[1],slope=coef(fit)[2]) 
    results$prediction <- data.frame(x,y) 

    results 
} 

Il problema è che non so come usare fare() con la funzione getAll per ottenere, ad esempio solo un dataframe con i parametri (come la pars dataframe).

+1

Non sono sicuro se questo aiuta. Puoi usare 'sumarise' invece del secondo' do'. riepilogare (modelli, coef = coef (summary (mod)) [[1]], group = cyl) – akrun

+3

È un bug, e lo aggiusterò non appena capirò come. – hadley

+1

@hadley È stato risolto? Potresti per favore indicare il problema del github? –

risposta

7

Ti piace?

coefficients <-models %>% do(data.frame(coef = coef(.$mod)[[1]], group = .[[1]])) 

cedendo

 coef group 
    1 40.87196  4 
    2 19.08199  6 
    3 22.03280  8 
+1

Grazie, qualcosa del genere. Mi chiedo se sia possibile avere qualcosa che usi automaticamente il raggruppamento in group_by. Quindi, se per esempio, group_by cambia in group_by (mtcar, cyl, am), allora non è necessario usare group =. [[1]] e group2 =. [[2]] all'interno di do(). – danilinares

+1

Penso che sia ancora più semplice; prova i coefficienti <- models %>% do (data.frame (coef = coef (. $ mod), group =. [[1]], var = nomi (coef (. $ mod)))) ' – gregmacfarlane

+1

So che questo è vecchio in questo punto, ma questo mi ha davvero aiutato. 'do (data.frame (group =. [[1]], a = coef (. $ mod) [1], b = coef (. $ mod) [2], r2 = riepilogo (. $ mod) $ r .squared)) 'Questo ottiene l'intera equazione per il tracciamento con la variabile group_by. – bhive01

2

Utilizzando l'approccio di Hadley Wickham in this video:

library(dplyr) 
library(purrr) 
library(broom) 

fitmodel <- function(d) lm(mpg ~ disp, data = d) 
by_cyl <- mtcars %>% 
    group_by(cyl) %>% 
    nest() %>% 
    mutate(mod = map(data, fitmodel), 
     pars = map(mod, tidy), 
     pred = map(mod, augment)) 

pars <- by_cyl %>% unnest(pars) 
prediction <- by_cyl %>% unnest(pred)