动态时间序列预测和rollapply

时间:2012-07-20 16:14:17

标签: r time-series

我正在尝试对R中的动态时间序列进行滚动预测(然后计算出预测的平方误差)。我在this StackOverflow question上建了很多代码,但我对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. 按照我的预期(宽度为40)运行20-> 80,而不是40-> 100
  2. 它给出的预测是不变的:10.18676
  3. 我做错了什么?是否有更简单的方法来进行预测而不是全部写出来?谢谢!

1 个答案:

答案 0 :(得分:2)

您的函数的主要问题是data的{​​{1}}参数。如果查看dynlm,您会看到?dynlm参数必须是datadata.frame对象。不幸的是,我刚刚了解到zoorollapply个对象拆分为zoo个对象。这意味着array在注意到您的dynlm参数形式不正确后,在全球环境中搜索了datax当然,这是在代码的顶部定义的。解决方案是将y转换为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控制。 rollapply会给你left1..60(默认)会给你center20..80会给你right