2011-01-31 62 views
3

我已经编写了一个函数来迭代地预测使用包dyn构建的模型,并且我希望得到一些反馈。有一个更好的方法吗?有人为dyn类(或dynlm类)编写了规范的“预测”方法,还是我冒险进入这个未知领域?迭代式预测dyn模型

ipredict <-function(model, newdata, interval = "none", 
     level = 0.95, na.action = na.pass, weights = 1) { 
P<-predict(model,newdata=newdata,interval=interval, 
    level=level,na.action=na.action,weights=weights) 
for (i in seq(1,dim(newdata)[1])) { 
    if (is.na(newdata[i])) { 
    if (interval=="none") { 
    P[i]<-predict(model,newdata=newdata,interval=interval, 
    level=level,na.action=na.action,weights=weights)[i] 
    newdata[i]<-P[i] 
    } 
    else{ 
    P[i,]<-predict(model,newdata=newdata,interval=interval, 
    level=level,na.action=na.action,weights=weights)[i,] 
    newdata[i]<-P[i,1] 
    } 
    } 
} 
P_end<-end(P)[1]*frequency(P)+(end(P)[2]-1) #Convert (time,period) to decimal time 
P<-window(P,end=P_end-1*frequency(P)) #Drop last observation, which is NA 
return(P) 
} 

用法示例:

library(dyn) 
y<-arima.sim(model=list(ar=c(.9)),n=10) #Create AR(1) dependant variable 
A<-rnorm(10) #Create independant variables 
B<-rnorm(10) 
C<-rnorm(10) 
Error<-rnorm(10) 
y<-y+.5*A+.2*B-.3*C+.1*Error #Add relationship to independant variables 
data=cbind(y,A,B,C) 

#Fit linear model 
model.dyn<-dyn$lm(y~A+B+C+lag(y,-1),data=data) 
summary(model.dyn) 

#Forecast linear model 
A<-c(A,rnorm(5)) 
B<-c(B,rnorm(5)) 
C<-c(C,rnorm(5)) 
y=window(y,end=end(y)+c(5,0),extend=TRUE) 
newdata<-cbind(y,A,B,C) 
P1<-ipredict(model.dyn,newdata) 
P2<-ipredict(model.dyn,newdata,interval="prediction") 

#Plot 
plot(y) 
lines(P1,col=2) 

回答

3

predict.Arima在R的核心有n.ahead参数来预测未来n步骤,似乎这就是你连同DYN但predict.dyn确实找目前不支持该功能。为了达到这个效果,你必须像你一样迭代地调用dyn$whatever