2016-03-24 2 views
2

Ich beabsichtige, eine separate Regression für jede Ebene eines Faktors in einem data.frame durchzuführen. Ich konnte es mit plyr::ddply tun. Als ich jedoch versuchte, den Leitungsfluss der Analyse zu verwenden, stieß ich auf die folgenden Fehler. Bitte geben Sie an, wie Sie es überwinden können, oder ich muss zu plyr::ddply, etc. zurückkehren. Danke.Führen Sie lm() in einem Pipe (%>%) -Fluss aus: Fehler des ungültigen Ausdrucks in der Modellformel

d = data.frame(
Gender = c("M","F"), 
Age = rnorm(20, mean = 40, sd = 3), 
Weight = rnorm(20, mean=70, sd=5) 
) 


fit <- d %>% group_by(Gender) %>% 
summarise(
    Intercept = coef(lm(Weight ~ Age))[1], 
    Slope = coef(lm(Weight ~ Age))[2] 
) 

Error: invalid term in model formula

+0

Auch für ein komplexes Modell wäre es schön, die Regression nur einmal auszuführen. Wie erreiche ich es in einem solchen Pipe Flow? – Shawn

+1

Probieren Sie 'do' anstatt' summarise' aus. – coffeinjunky

+0

Danke an coffininjunky für Ratschläge zu Best Practices. Ich habe die Antwort meiner Vorliebe markiert, aber beide funktionierten perfekt. – Shawn

Antwort

3

do mit helfen und das Modell (e) wird nur einmal berechnet werden:

fit <- d %>% group_by(Gender) %>% 
     do(model = lm(Weight ~ Age, data=.)) %>% 
     mutate(Intercept=coef(model)[1], Slope=coef(model)[2]) %>% 
     select(-model) 

lassen Sie den letzten select(-model) Ihre lm Modelle innerhalb ihrer eigenen Spalte zu halten.

4

Eine einfachere Lösung wäre sogar broom zu verwenden. broom::tidy ordnet die Modellausgabe in schöne und saubere Datenrahmen um und Sie müssen nicht manuell auf einzelne Koeffizienten zugreifen. Weitere Informationen finden Sie unter vignette(broom).

library(dplyr) 
library(broom) 

fit <- d %>% group_by(Gender) %>% do(data.frame(tidy(lm(Weight ~ Age, data=.)))) 
fit 
Source: local data frame [4 x 6] 
Groups: Gender [2] 

    Gender  term estimate std.error statistic  p.value 
    (fctr)  (chr)  (dbl)  (dbl)  (dbl)  (dbl) 
1  F (Intercept) 92.5751034 37.6736331 2.4572916 0.039485169 
2  F   Age -0.5132374 0.9098960 -0.5640616 0.588172020 
3  M (Intercept) 41.4985927 10.4958042 3.9538269 0.004213341 
4  M   Age 0.7346306 0.2691001 2.7299529 0.025847680 

Hier wird die Modellausgabe entsprechend der Gruppenvariablen gespeichert sind, und jeder Koeffizient wird in einer einzelnen Zeile gespeichert, die man leicht Subset kann.

+0

Nur eine Frage zum Rohr hier. Warum mischt man Piping mit traditionellen 'function1 (function2 (function3 (x)))' styles? Ist es nicht möglich, den ganzen Weg durchzuziehen? – cory

+0

Gute Frage. So wie ich es verstehe, ist 'do' ähnlich wie' summarise' oder 'mutate', wo Sie auch die traditionellen Funktionsaufrufe verwenden. Zum Beispiel würden Sie nicht 'group_by (Geschlecht)%>% mean (var)%>% summarise 'schreiben, anstatt' group_by (Geschlecht)%>% summarize (mean (var)) '. – coffeinjunky

Verwandte Themen