web-dev-qa-db-ja.com

dplyrを使用したいくつかの回帰モデルの適合

Dplyrを使用して各時間(因子変数)のモデルを適合させたいのですが、エラーが発生し、何が間違っているのかよくわかりません。

df.h <- data.frame( 
  hour     = factor(rep(1:24, each = 21)),
  price    = runif(504, min = -10, max = 125),
  wind     = runif(504, min = 0, max = 2500),
  temp     = runif(504, min = - 10, max = 25)  
)

df.h <- tbl_df(df.h)
df.h <- group_by(df.h, hour)

group_size(df.h) # checks out, 21 obs. for each factor variable

# different attempts:
reg.models <- do(df.h, formula = price ~ wind + temp)

reg.models <- do(df.h, .f = lm(price ~ wind + temp, data = df.h))

さまざまなバリエーションを試してみましたが、うまくいきません。

60
Thorst

Dplyr 0.4では、次のことができます。

df.h %>% do(model = lm(price ~ wind + temp, data = .))
25
hadley

doのドキュメントから:

.f:各ピースに適用する関数。 .fに提供される最初の名前のない引数はデータフレームになります。

そう:

reg.models <- do(df.h, 
                 .f=function(data){
                     lm(price ~ wind + temp, data=data)
                 })

モデルが適合した時間を保存するのにもおそらく便利です:

reg.models <- do(df.h, 
                 .f=function(data){
                     m <- lm(price ~ wind + temp, data=data)
                     m$hour <- unique(data$hour)
                     m
                 })
9
fabians

@fabians anwserのように関数を定義する必要がない場合、dplyrをより適切な方法で使用できると思います。

results<-df.h %.% 
group_by(hour) %.% 
do(failwith(NULL, lm), formula = price ~ wind + temp)

または

results<-do(group_by(tbl_df(df.h), hour),
failwith(NULL, lm), formula = price ~ wind + temp)

編集:もちろんfailwithなしでも動作します

results<-df.h %.% 
    group_by(hour) %.% 
    do(lm, formula = price ~ wind + temp)


results<-do(group_by(tbl_df(df.h), hour),
lm, formula = price ~ wind + temp)
8
Maciej