我想获得一个动态的时间序列的滚动预测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
其中有两个问题我没想到:
- 从20-> 80,不40-> 100运行作为我期望(如宽度为40)
- 它给出的预测是不变的:10.18676
我究竟做错了什么? 而且是有更简单的方式做预测,而不是它全部写出来? 谢谢!
与功能的主要问题是data
参数dynlm
。 如果你在看?dynlm
你将看到data
参数必须是一个data.frame
或zoo
的对象。 不幸的是,我刚刚得知rollapply
将您的zoo
对象为array
对象。 这意味着dynlm
,指出你的后data
的说法是正确的表格不是,搜索x
和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
。 left
会给你1..60
, center
(默认值)会给你20..80
和right
让你40..100
。