2014-07-05 11 views
7

微微一變例爲DO():dplyr,做(),提取從模型參數,而不從R幫助丟失分組變量

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

在數據幀係數,存在的第一個係數線性模型爲每個cyl組。我的問題是如何生成一個數據幀,該數據幀不僅包含具有係數的列,還包含具有分組變量的列。

=====編輯:我延長例子,試圖讓更多的明確我的問題

讓我們假設我要提取的模型和一些預測的係數。我可以這樣做:

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(.)) 

問題是代碼是多餘的,因爲我適合模型兩次。我的想法是建立一個返回的所有信息列表的功能:

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 
} 

的問題是,我不知道如何使用做()的函數GETALL獲得例如只是一個數據幀參數(如dataframe pars)。

+1

不知道這會有所幫助。你可以使用'summarise'而不是第二個'do'。總結(模型,coef = coef(summary(mod))[[1]],group = cyl) – akrun

+3

這是一個錯誤,我會盡快解決它。 – hadley

+1

@hadley這個問題解決了嗎?你能指出github問題嗎? –

回答

7

是否這樣?

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

產生

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

謝謝,類似的東西。我想知道是否有可能自動使用group_by中的分組。因此,例如,如果group_by更改爲group_by(mtcar,cyl,am),則不需要在do()中使用group =。[[1]]和group2 = [[2]]。 – danilinares

+1

我認爲它更簡單;嘗試'係數<- models %>%do(data.frame(coef = coef(。$ mod),group =。[[1]],var = names(coef(。$ mod))))' – gregmacfarlane

+1

我知道這是舊的這一點,但這真的幫助了我。 (data.frame(group =。[[1]],a = coef(。$ mod)[1],b = coef(。$ mod)[2],r2 = summary(。$ mod)$ r .squared))'這會得到用group_by變量繪製出的整個方程。 – bhive01

2

使用哈德利韋翰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)