动态时间序列预测和rollapply(Dynamic time-series prediction

2019-10-17 01:06发布

我想获得一个动态的时间序列的滚动预测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

其中有两个问题我没想到:

  1. 从20-> 80,不40-> 100运行作为我期望(如宽度为40)
  2. 它给出的预测是不变的:10.18676

我究竟做错了什么? 而且是有更简单的方式做预测,而不是它全部写出来? 谢谢!

Answer 1:

与功能的主要问题是data参数dynlm 。 如果你在看?dynlm你将看到data参数必须是一个data.framezoo的对象。 不幸的是,我刚刚得知rollapply将您的zoo对象为array对象。 这意味着dynlm ,指出你的后data的说法是正确的表格不是,搜索xy全球环境中,这当然在你的代码的顶部被定义。 解决的办法是转换series成为zoo的对象。 有一对夫妇与你的代码的其他问题,我在这里发布修正版本:

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')

你的第二个问题,关于你的结果的编号,可以通过控制align参数是rollapplyleft会给你1..60center (默认值)会给你20..80right让你40..100



文章来源: Dynamic time-series prediction and rollapply
标签: r time-series