2017-06-24 10 views
0

におけるLM機能は、私がDFを持っている:lapply使用し、次のように一緒にR

t   r 
1 0 100.00000 
2 1 135.86780 
3 2 149.97868 
4 3 133.77316 
5 4 97.08129 
6 5 62.15988 
7 6 50.19177 

のように...

私はlm(r~t)を使用してローリング回帰を適用したいが。

ただし、反復が設定された時間ウィンドウt+kに発生する各反復に対して1つのモデルを推定したいと思います。基本的には、最初のモデルはt=0,t=1,...t=5k = 5と推定され、2番目のモデルはt=1, t=2,...,t=6と推定されます。

つまり、セットウィンドウt + kで始点から反復します。ここで、kはあらかじめ指定されたウィンドウ長であり、その特定のウィンドウ長にわたってlm関数を繰り返し適用します。

は、私はこのようなlapply使用して試してみました。しかし

mdls = lapply(df, function(x) lm(r[x,]~t)) 

、私は次のエラーを得た:

Error in r[x, ] : incorrect number of dimensions

私が削除した場合、[xは、]は、各反復は私に同じモデルを提供します言い換えれば、すべての観測値を使用します。

私がrollapply使用する場合:

coefs = rollapply(df, 3, FUN = function(x) coef(lm(r~t, data = 
as.data.frame(x))), by.column = FALSE, align = "right") 

res = rollapply(df, 3, FUN = function(z) residuals(lm(r~t, data = 
as.data.frame(z))), by.column = FALSE, align = "right") 

t = seq(0,15,1) 
r = (100+50*sin(0.8*t)) 
df = as.data.frame(t,r) 

を私は15のモデルを得るが、それらはすべて同じインターセプトした係数を提供し、データセット全体にわたり推定されています。これは、私が新しいスクリプトでテストする直前にrollapplyの仕事をすることができたので、奇妙です。何らかの理由でそれが再び働かないので、Rが私の上でトリックをしているのかどうか、または私のコードに何か問題があるかどうかについて、私は困惑しています。

これらのメソッドを調整して、自分の望む通りに反復されるようにするにはどうすればよいですか?

答えて

0

可能な解決策を記載しています。この考え方は、rollapply関数でベクトル1:nrow(df)を使用して、どの行を選択するのかを示すことです。

df = data.frame(t = 0:6, r = c(100.00000, 135.86780, 149.97868, 133.77316, 97.08129, 62.15988, 50.19177)) 
N = nrow(df) 

require(zoo) 

# Coefficients 
coefs <- rollapply(data = 1:N, width = 3, FUN = function(x){ 

    r = df$r[x] 
    t = df$t[x] 

    out <- coef(lm(r~t)) 

    return(out) 

}) 

# Residuals 
res <- rollapply(data = 1:N, width = 3, FUN = function(x){ 

    r = df$r[x] 
    t = df$t[x] 

    out <- residuals(lm(r~t)) 

    return(out) 

}) 
+0

ありがとうございました! また、FYI、私は私の質問で重要な(しかしばかげた)エラーがあることに気づいた。本質的に、私はdata.frame(t、r)ではなくas.data.frame(t、r)を書いていたので、いくつかの観測ではなくrのベクトルが1つしかありませんでした。 このエラーを変更することによって、私は異なる係数と残差を得ることができました。 ソリューションに感謝していますが、非常にきれいに見え、従うのも簡単です。 =) – Mattia

+0

コメントありがとうございました:) –

関連する問題