1

ローリング ウィンドウ線形回帰を実行するいくつかのグループ化変数を含むデータ セットがあります。最終的な目標は、勾配が最も小さい 10 個の線形回帰を抽出し、それらを平均して平均最小変化率を提供することです。rollapply を使用してローリング ウィンドウの線形回帰を計算する例を見つけましたが、これらの線形回帰をデータ セット内のグループに適用したいという複雑さが追加されています。

これはサンプルデータセットと私の現在のコードです。

dat<-data.frame(w=c(rep(1,27), rep(2,27),rep(3,27)), z=c(rep(c(1,2,3),27)), 
x=c(rep(seq(1,27),3)), y=c(rnorm(27,10,3), rnorm(27,3,2.2), rnorm(27, 6,1.3)))

ここで、w と z は 2 つのグループ化変数で、x と y は回帰項です。

私のインターネット検索からここにあるのは、ウィンドウ サイズが 6 の R の基本的なローリング ウィンドウ線形回帰コードです。逐次回帰は 3 つのデータ ポイントで区切られており、勾配係数 (lm...) のみを抽出しています [2]。

library(zoo)    
slopeData<-rollapply(zoo(dat), width=6, function(Z) { 
coef(lm(formula=y~x, data = as.data.frame(Z), na.rm=T))[2]
}, by = 3, by.column=FALSE, align="right")

ここで、このローリング ウィンドウ回帰を 2 つのグループ化変数 w と z で指定されたグループに適用したいと考えています。そこで、plyr パッケージの ddply を使用して、このようなことを試しました。まず、上記のコードを関数として書き直してみます。

rolled<-function(df) {
    rollapply(zoo(df), width=6, function(Z) { 
    coef(lm(formula=y~x, data = as.data.frame(Z), na.rm=T))[2]
    }, by = 3, by.column=FALSE, align="right")
}

そして、ddply を使用してその関数を適用します。

groupedSlope <- ddply(dat, .(w,z), function(d) rolled(d))

ただし、一連の警告とエラーが発生するため、これは機能しません。一部のエラーは、Zoo フォーマットとデータ フレームの組み合わせに関連している可能性があり、これは非常に複雑になると思います。それは私がこれまで取り組んできたことですが、この方法よりも簡単な、グループ化されたローリングウィンドウの線形回帰を取得する方法を知っている人はいますか?

助けてくれてありがとう、ネイト

4

1 に答える 1

2

1)データ フレームでも機能するため、zoo rollapplyに変換する必要はありません。df

2)lmna.actionではなくna.rmを使用し、そのデフォルトは であるna.omitため、この引数を削除するだけです。

3)rollapplyrはより簡潔な書き方rollapply(..., align = "right")です。

rolledそれ以外の場合はあなたが望むことを行い、これらの変更を に組み込むと仮定すると、質問rolledのステートメントが機能するか、以下に示す R のベースからddply使用できます。by

rolled <- function(df) {
    rollapplyr(df, width = 6, function(m) { 
          coef(lm(formula = y ~ x, data = as.data.frame(m)))[2]
       }, by = 3, by.column = FALSE
   )
}
do.call("rbind", by(dat, dat[c("w", "z")], rolled))
于 2015-02-04T10:04:57.987 に答える