2016-03-24 13 views
2

Merhabalar: Bir veri çerçevesinde tidyr ve dplyr kullanılarak oluşturulan bir dizi doğrusal modelim var. Aşağıdakine benziyor. Her modelden, sabit bir newdata kümesiyle tahmin edilen değerler üretmeye nasıl başlarım? Gerçekte ben 10 bağımlı değişkenleri, ama sadece iki bağımsız değişkenleriBir dizi doğrusal modelden tahmin edilen değerler

#random data 
x1<-rnorm(100, mean=10, sd=5) 
x2<-rnorm(100, mean=5, sd=2) 
y1<-rnorm(100, mean=5, sd=1) 
y2<-rnorm(100, mean=3, sd=1) 
#create test data farame 
df<-data.frame(y1, y2, x1, x2) 
#create models 
df%>% 
    gather(dv, value, y1, y2, -x1,-x2) %>% 
    group_by(dv)%>% 
    do(mod=lm(value~x1+x2, data=.)) 

cevap

2

Bir seçenek do kullanarak data.frame bir sütun olarak tahminler almak olacaktır sahiptir. Diğer cevaptan fark, bir sütunda tahminleri almak için data.frame kullanımıdır. İşleri düz tutmak için dv değişkenini bu veri kümesine ekleyebilirsiniz.

df %>% 
    gather(dv, value, y1, y2, -x1,-x2) %>% 
    group_by(dv)%>% 
    do(mod=lm(value ~ x1 + x2, data=.)) %>% 
     do(data.frame(dv = .$dv, pred = predict(.$mod, newdata = df))) 

Source: local data frame [200 x 2] 
Groups: <by row> 

     dv  pred 
    (chr) (dbl) 
1  y1 4.936012 
2  y1 4.948939 
3  y1 4.992472 
4  y1 4.733290 
5  y1 4.921581 
6  y1 5.115699 
7  y1 4.981135 
8  y1 4.837326 
9  y1 4.641484 
10 y1 4.739197 
.. ...  ... 

(bana) Bunun aşağı tarafı gerçek tahmin edilen değerlerle tahminler için kullanılan verileri yok olmasıdır. Tahmin veri kümesine kesinlikle cbind olabilir, ancak augmentsüpürgeyido içinde kullanabilirsiniz. Bu ikinci alternatifte,numaralı telefonu ilk kez do numaralı telefona kullanıyorum, ancak gerekli değil. Öngörmek istediğiniz veri kümesini/augment içindeki newdata bağımsız değişkenini kullanarak tahminleri ekleyebilirsiniz. Bu örnekte df2 veri kümesini kullandım (yalnızca df veri kümenizin bağımlı değişken sütunları).

library(broom) 
df2 = df[ , 3:4] # Dataset for predictions 
df %>% 
    gather(dv, value, y1, y2, -x1,-x2) %>% 
    group_by(dv)%>% 
    do(augment(lm(value ~ x1 + x2, data=.), newdata = df2)) 

Source: local data frame [200 x 5] 
Groups: dv [2] 

     dv  x1  x2 .fitted .se.fit 
    (chr)  (dbl) (dbl) (dbl)  (dbl) 
1  y1 5.863764 6.201406 4.936012 0.1521102 
2  y1 4.419014 7.028888 4.948939 0.1936563 
3  y1 7.917369 6.081930 4.992472 0.1255001 
4  y1 4.338864 4.019565 4.733290 0.1842635 
5  y1 13.307611 2.674705 4.921581 0.1757911 
6  y1 14.986879 4.666154 5.115699 0.1614377 
7  y1 12.941636 3.679022 4.981135 0.1409247 
8  y1 7.474526 4.088868 4.837326 0.1310659 
9  y1 2.136858 3.706184 4.641484 0.2357699 
10 y1 9.307190 1.885127 4.739197 0.2008851 
.. ...  ...  ...  ...  ... 
+0

Benimkinden daha iyi yanıt. Teşekkürler, hala dplyr öğreniyorum ve bu yararlıdır. (Seninki daha zarif ve daha iyi yazıldığından beri cevabımı sildi) –

+0

Bu harika. Verilerin ve yeni veri argümanlarının neden belirtilmesi gerektiğini açıklayabilir misiniz? Bana göre, model orijinal veri çerçevesine (df) uygun olmalı, ancak tahmin edilen değerler newdata (df2) – spindoctor

+0

@ spindoctor ile üretilmelidir. Öngörü için “augment” kullanırken sadece 'newdata' argümanına ihtiyacınız var. – aosmith

İlgili konular