2016-06-29 3 views
0

Ich baue auf einer ähnlichen Frage auf, die vor einem Jahr auf SO gestellt und beantwortet wurde. Es bezieht sich auf diesen Beitrag: how to merge two linear regression prediction models (each per data frame's subset) into one column of the data frameZwei Regressionsvorhersagemodelle (mit Teilmengen eines Datenrahmens) in den Datenrahmen (eine Spalte) zusammenfügen

Ich werde die gleichen Daten verwenden, wie dort verwendet wurde, aber mit einer neuen Spalte. Ich schaffe die Daten:

dat = read.table(text = " cats birds wolfs  snakes  trees 
0  3  8   7  2 
1  3  8   7  3 
1  1  2   3  2 
0  1  2   3  1 
0  1  2   3  2 
1  6  1   1  3 
0  6  1   1  1 
1  6  1   1  1 " ,header = TRUE) 

Modell die Anzahl der Wölfe, zwei Teilmengen der Daten unter Verwendung von Bedingungen zu unterscheiden. Die Gleichungen sind für jede Teilmenge unterschiedlich.

f0 = lm(wolfs~snakes,data = dat,subset=dat$cats==0) 
f1 = lm(wolfs~snakes + trees,data = dat,subset=dat$cats==1) 

Vorhersage der Anzahl der Wölfe für jede Teilmenge.

Dann (wieder, per 2015 Post) teile ich die Daten durch die Katzen Variable.

dat.l = split(dat, dat$cats) 
dat.l 

... Hier wird es ein wenig schwierig. Der Beitrag von 2015 schlug vor, die beiden Sätze von Vorhersagen in den Datensatz zu integrieren. Aber hier würde die Funktion des Befragten nicht funktionieren, da angenommen wird, dass beide Regressionsgleichungen im Wesentlichen gleich sind. Hier ist mein Versuch (es ist nah an das Original, nur gezwickt):

dat.l = lapply(dat.l, function(x){ 
mod = 

ifelse(dat$cats==0,lm(wolfs~snakes,data=x),lm(wolfs~snakes+trees,data=x)) 
       x$full_prediction = predict(mod,data=x,type='response') 
       return(x) 
    }) 
    unsplit(dat.l, dat$cats) 

Irgendwelche Ideen über die letzten paar Schritte? Ich bin noch relativ neu in S. O. und bin ein Zwischenspieler mit R, also bitte gehe vorsichtig, wenn ich nicht genau gepostet habe, wie es die Community bevorzugt.

Antwort

0

Hier ist eine dplyr Lösung, von der früheren Post Sie zitiert den Bau aus:

library(dplyr) 

# create a new column defining the lm formula for each level of cats 
dat <- dat %>% mutate(formula = ifelse(cats==0, "wolfs ~ snakes", 
     "wolfs ~ snakes + trees")) 

# build model and find predicted values for each value of cats 
dat <- dat %>% group_by(cats) %>% 
    do({ 
     mod <- lm(as.formula(.$formula[1]), data = .) 
     pred <- predict(mod) 
     data.frame(., pred) 
    }) 

> dat 
Source: local data frame [8 x 7] 
Groups: cats [2] 
    cats birds wolfs snakes trees    formula  pred 
    (int) (int) (int) (int) (int)     (chr)  (dbl) 
1  0  3  8  7  2   wolfs ~ snakes 7.5789474 
2  0  1  2  3  1   wolfs ~ snakes 2.6315789 
3  0  1  2  3  2   wolfs ~ snakes 2.6315789 
4  0  6  1  1  1   wolfs ~ snakes 0.1578947 
5  1  3  8  7  3 wolfs ~ snakes + trees 7.6800000 
6  1  1  2  3  2 wolfs ~ snakes + trees 2.9600000 
7  1  6  1  1  3 wolfs ~ snakes + trees 0.8400000 
8  1  6  1  1  1 wolfs ~ snakes + trees 0.5200000 
+0

Wow - brilliant! Ich denke, dplyr wird mein heiliger Gral sein, sobald ich es herausgefunden habe - danke! – chriseshleman

+0

Es macht definitiv Reinigungs- und Split-Apply-Recombine-Anwendungen viel einfacher; Ein anderes Paket, das sehr nützlich ist, um Modelle zusammenzufassen, ist Besen, was in Kombination mit dplyr sehr wirkungsvoll ist. Siehe: https://cran.r-project.org/web/packages/broom/vignettes/broom_and_dplyr.html –

+0

Gute Sachen. Ich überprüfe Besen. – chriseshleman

Verwandte Themen