2014-07-05 6 views
7

एक थोड़ा बदल उदाहरण खोने के बिना करते हैं),: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]])) 

dataframe में गुणांक, वहाँ के पहले गुणांक है प्रत्येक 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 
} 

समस्या यह है कि मैं कैसे उदाहरण सिर्फ एक साथ dataframe के लिए प्राप्त करने के लिए समारोह getAll के साथ क्या उपयोग करने के लिए() नहीं जानता है पैरामीटर (डेटाफ्रेम पार्स की तरह)।

+1

सुनिश्चित नहीं हैं कि अगर यह मदद करता है। आप दूसरे 'do' के बजाय 'सारांश' का उपयोग कर सकते हैं। संक्षेप में (मॉडल, कोफ = कोफ (सारांश (मॉड)) [[1]], समूह = सीआईएल) – akrun

+3

यह एक बग है, और जैसे ही मैं समझता हूं कि मैं इसे ठीक कर दूंगा। – hadley

+1

@ हैडली क्या यह तय किया गया है? क्या आप कृपया जिथब मुद्दे को इंगित कर सकते हैं? –

उत्तर

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 (mtcar, cyl, am) में बदलता है, तो समूह = [[1]] और group2 =। [[2]] का उपयोग करना आवश्यक नहीं है()। – danilinares

+1

मुझे लगता है कि यह भी आसान है; 'गुणांक <- models %>% करने की कोशिश करें (डेटा.फ्रेम (coef = coef (। $ mod), समूह =। [[1]], var = names (coef (। $ mod)))' – gregmacfarlane

+1

मुझे पता है कि यह पुराना है इस बिंदु पर, लेकिन यह वास्तव में मेरी मदद की। 'करें (data.frame (समूह =। [[1]], ए = कोफ (। $ mod) [1], बी = कोफ (। $ mod) [2], आर 2 = सारांश (। $ mod) $ r .squared)) 'समूह_बी चर के साथ साजिश के लिए यह समीकरण समीकरण मिलता है। – 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) 
संबंधित मुद्दे