1

Rの動的時系列のローリング予測を取得しようとしています(次に、予測の二乗誤差を計算します)。私はこのコードの多くをこのStackOverflowの質問に基づいていますが、私はRに非常に慣れていないため、かなり苦労しています。どんな助けでも大歓迎です。

require(zoo)
require(dynlm)

set.seed(12345)
#create variables
x<-rnorm(mean=3,sd=2,100)
y<-rep(NA,100)
y[1]<-x[1]
for(i in 2:100) y[i]=1+x[i-1]+0.5*y[i-1]+rnorm(1,0,0.5)
int<-1:100
dummydata<-data.frame(int=int,x=x,y=y)

zoodata<-as.zoo(dummydata)

prediction<-function(series)
  {
  mod<-dynlm(formula = y ~ L(y) + L(x), data = series) #get model
   nextOb<-nrow(series)+1
   #make forecast
   predicted<-coef(mod)[1]+coef(mod)[2]*zoodata$y[nextOb-1]+coef(mod)[3]*zoodata$x[nextOb-1]

   #strip timeseries information
   attributes(predicted)<-NULL

   return(predicted)
  }                

rolling<-rollapply(zoodata,width=40,FUN=prediction,by.column=FALSE)

これは次を返します:

20          21      .....      80
10.18676  10.18676          10.18676

これには、私が予期していなかった2つの問題があります。

  1. 私が期待するように40->100ではなく、20-> 80から実行されます(幅が40であるため)
  2. それが与える予測は一定です:10.18676

私は何が間違っているのですか?そして、すべてを書き出すよりも簡単に予測を行う方法はありますか?ありがとう!

4

1 に答える 1

2

関数の主な問題は、へのdata引数dynlmです。調べて?dynlmみると、data引数はadata.frameまたはzooオブジェクトでなければならないことがわかります。残念ながら、私はあなたのオブジェクトをオブジェクトにrollapply分割することを学びました。これは、引数が正しい形式ではないことに気付いた後、グローバル環境で検索され、もちろんコードの先頭で定義されていることを意味します。解決策は、オブジェクトに変換することです。あなたのコードには他にもいくつか問題がありました。修正されたバージョンをここに投稿します。zooarraydynlmdataxyserieszoo

prediction<-function(series) {
   mod <- dynlm(formula = y ~ L(y) + L(x), data = as.zoo(series)) # get model
   # nextOb <- nrow(series)+1 # This will always be 21. I think you mean:
   nextOb <- max(series[,'int'])+1 # To get the first row that follows the window
   if (nextOb<=nrow(zoodata)) {   # You won't predict the last one
     # make forecast
     # predicted<-coef(mod)[1]+coef(mod)[2]*zoodata$y[nextOb-1]+coef(mod)[3]*zoodata$x[nextOb-1]
     # That would work, but there is a very nice function called predict
     predicted=predict(mod,newdata=data.frame(x=zoodata[nextOb,'x'],y=zoodata[nextOb,'y']))
     # I'm not sure why you used nextOb-1  
     attributes(predicted)<-NULL
     # I added the square error as well as the prediction.
     c(predicted=predicted,square.res=(predicted-zoodata[nextOb,'y'])^2)
   }
}    

rollapply(zoodata,width=20,FUN=prediction,by.column=F,align='right')

結果の番号付けに関する2番目の質問は、align引数によって制御できますrollapplyleftあなたに与えるだろう1..60center(デフォルト)はあなたに与えるだろうそしてあなた20..80right得るだろう40..100

于 2012-07-20T20:35:33.697 に答える