2016-06-01 5 views
0

dplyrでローリング回帰を実行しようとしています。私は回帰のベータだけに興味があるので、のパッケージzoolsfitを使用しています。ここで私が試したものです:私はこのエラーになっていますdplyrとlsfitによるローリング回帰

library(dplyr); library(zoo) 

df1 = expand.grid(site = seq(10), 
        year = 2000:2004, 
        day = 1:50) 

df1 %>% 
group_by(year) %>% 
mutate(beta1 = rollapplyr(data = site, 
          width = 5, 
          FUN = lsfit, 
          x=day)) 

Error: not all arguments have the same length

を私はrollapplyrが非動物園のオブジェクトを受け入れると思いますが、私は間違っている可能性があります。また、機能内にデータオブジェクトが必要なため、配管(%>%)がrollapplyrでうまく動かないこともあります。

EDIT私の質問は異なっている:rolling regression with dplyr私は複数のベクターを通じてgroup_by

答えて

2

機能するわけではないサイクルを使用するためにパイプを使用します。スライスされたsiteベクターは、フルベクターdayと比較されている。私たちは、ベクトルのグループを通過するMapで関数を適用我々自身のローリングを書き込むことができます。

rollapplydf <- function(xx, width) { 
    l <- length(xx) 
    sq <- Map(':', 1:(l-width+1), width:l) 
    lst <- lapply(sq, function(i) lm(xx[i] ~ seq(length(xx[i])))$coeff[2]) 
    do.call('rbind', c(rep(NA, width-1L), lst)) 
} 

だから我々は、パイプにこれを追加することができます。

library(dplyr) 
df1 %>% 
    group_by(year) %>% 
    mutate(beta1 = rollapplydf(xx = site, width = 5)) 

# Source: local data frame [2,500 x 4] 
# Groups: year [5] 
# 
#  site year day beta1 
# (int) (int) (int) (dbl) 
# 1  1 2000  1 NA 
# 2  2 2000  1 NA 
# 3  3 2000  1 NA 
# 4  4 2000  1 NA 
# 5  5 2000  1  1 
# 6  6 2000  1  1 
# 7  7 2000  1  1 
# 8  8 2000  1  1 
# 9  9 2000  1  1 
# 10 10 2000  1  1 
# .. ... ... ... ... 
関連する問題