2016-03-19 11 views
0

Hallo zu trennen. Ich würde gerne sehen, was der Koeffizient für y1 bis y6 ~ x1 für jedes Land ist. Gibt es eine Möglichkeit, dies sauber mit dplyr und Besen zu tun? Ich weiß dplyr ziemlich gut, aber bin neu in Besen.Fit Reihe von linearen Modellen abhängige Variablen für eine andere Gruppierung Variable

#one random independent variable 
x1<-rnorm(100, mean=5, sd=1) 
#one random dependent variable 
y1<-rnorm(100, mean=2, sd=2) 
#two random dependent variables, in reality I have six 
y2<-rnorm(100, mean=3, sd=1) 
#Grouping variable. 
country<-sample(seq(1,3,1), size=100, replace=T) 
#data frame 
df<-data.frame(x1, y1, y2, country) 
#I would like to see what the coefficients are for y1~x1 
and then y2 ~x2 for country 1, country 2, country 3, etc. 
library(dplyr) 
#Fit one model for each of three countries 
test<-df%>% 
group_by(country) %>% 
    do(mod.y1=lm(y1~x1, data=.)) 
#print results 
test$mod.y1 

Antwort

0

Sie können eine Kombination von gather aus tidyr und tidy von Besen verwenden. Erstens, anstatt ein Sitz für jedes Land zu tun, führen Sie einen Sitz für jede Kombination von y1/y2 und Land:

library(tidyr) 
library(broom) 

fits <- df %>% 
    gather(variable, value, y1, y2) %>% 
    group_by(country, variable) %>% 
    do(mod = lm(value ~ x1, .)) 

Dann können Sie sie ordentlich (mit Besen) und den Schnitt Begriff herauszufiltern:

td <- tidy(fits, mod) %>% 
    filter(term != "(Intecept)") 

Dies gibt Ihnen einen Datenrahmen td, die wie folgt aussieht:

Source: local data frame [6 x 7] 
Groups: country, variable [6] 

    country variable term  estimate std.error statistic p.value 
    (dbl) (chr) (chr)  (dbl)  (dbl)  (dbl)  (dbl) 
1  1  y1 x1 0.106140467 0.3835857 0.27670599 0.7835458 
2  1  y2 x1 -0.004725751 0.1837192 -0.02572268 0.9796168 
3  2  y1 x1 -0.193700062 0.4690913 -0.41292614 0.6826979 
4  2  y2 x1 0.094083592 0.2024151 0.46480518 0.6455421 
5  3  y1 x1 -0.223523980 0.3820297 -0.58509584 0.5631692 
6  3  y2 x1 -0.029720338 0.2116219 -0.14044074 0.8893172 

Ihre estimate Spalte ist die es timierte Koeffizienten.

+0

OK, das ist perfekt, aber ich verstehe nicht ganz die Syntax der Argumente ordentlich. Wie verhält sich Tidy (test, mod.y1) zu anderen Variablennamen in anderen Modellen? – spindoctor

+0

@spindoctor Es gab einen Tippfehler in meiner Antwort (jetzt behoben), sollte "ordentlich (passt, mod)" sein. Das Argument 'mod' besagt, dass die Modelle, die wir aufräumen wollen, in der Spalte' mod' liegen (wie in 'do (mod =' oben) definiert. Versuchen Sie 'help (rowwise_df_tidiers)' in R für mehr (oder sehen Sie [hier ] (http://www.inside-r.org/node/355600)) –

+0

Die Antwort ist, dass das Argument y in Tidy (x, y) der Name des Modells ist, das in der vorherigen do angepasst wurde() Befehl. – spindoctor