【问题标题】:For Loop with Append issue带有附加问题的循环
【发布时间】:2017-02-16 21:07:10
【问题描述】:

我在 for 循环中使用 append 时遇到问题。下面 for 循环的目标是获取 ModelCast$mean 并在其上附加 3 个 predict$mean。所以最后长度(append_cast)= 40。相反,我得到了一个长度(append_cast)= 20。我认为问题是append只运行一次。

for 循环之外的早期代码训练和预测模型。 for 循环中的其余代码是将该模型拟合到 3 个新数据块。

这是受 Rob Hyndman 的博文启发的: http://robjhyndman.com/hyndsight/rolling-forecasts/

特别是关于无需重新估计的多步预测的部分

非常感谢任何提示。

代码:

library("forecast")
library("tseries")
library("sqldf")
library("manipulate")
library("caret")
library("qdapTools")
library("RODBC")
library("dplyr")
library("yts")


##Partitioning Time Series
EndLearn1<-length(tsData-3*10)
data_tsLearn1 <-tsData[1:EndLearn1] 

##Fit Model 
fit_Model <- auto.arima(data_tsLearn1)

##Forecast Model 1st time
ModelCast<-forecast(fit_Model, h=10)

for(i in 1:3)
{  
  startLearn2<-1+i*10
  EndLearn2<-EndLearn1+i*10

  y <- tsData[startLearn2:EndLearn2] 
  fit_new <- Arima(y, model=fit_Model )

  append_cast <- append(ModelCast$mean,forecast(fit_new, h=10)$mean, after=i*10) ## Only seems to append one forecast instead of 3
}


Update: The change to the code below works
append_cast <- ts()


for(i in 1:3)
{  
 startLearn2<-1+i*10
 EndLearn2<-EndLearn1+i*10-1

 y <- tsData[startLearn2:EndLearn2] 
 fit_new <- Arima(y, model=fit_Model )

 append_cast <- append(append_cast, forecast(fit_new, h=10)$mean,   after=i*10)
 append_final<-ts(append(ModelCast$mean,append_cast[2:length(append_cast)]))    ## First value in append_cast is na because ts() starts that way
}

Data:
dput(tsData[1:300])
c(7.6, 0.6, 2.2, 1.8, NA, 6.6, 12.8, 0.2, 5.6, 2, NA, 0.4, NA, 
1.6, 0.8, 2, 0.4, NA, NA, 2, 4.8, NA, 0.2, NA, NA, NA, NA, 0.2, 
0.2, 0.2, 0.2, 0.2, NA, 0.4, 0.8, 0.6, 20, 27.4, 0.4, 29.2, 30.4, 
0.2, 42.2, NA, 0.8, 0.2, 2, 32.2, 2.4, 7, 2.2, 30.8, 26.6, 15.2, 
12, 10.2, 27, 15.8, 22.2, 20, 23.8, 1, 18.2, 6, 23, 16.2, 17, 
1.8, 17.8, 8.8, 0.2, 7.8, 2.6, 0.2, 17.8, 2.4, 15.4, 3.2, 8, 
12.4, 3.2, NA, 3.2, 2.2, 5.6, NA, 0.4, 2.6, 1.8, 2.4, NA, 2.2, 
NA, 1.6, NA, NA, NA, 1.4, 1.8, 0.2, NA, 1.8, NA, 1.4, 1.6, 5, 
0.2, NA, NA, 1.4, 0.4, NA, NA, NA, NA, NA, NA, NA, NA, NA, 2.8, 
3, 0.2, 11.4, 13.2, 15, 13.2, 5.8, 6.8, 24.6, 17, 21.6, 5, 11.4, 
23, 9.2, 7.2, 12, 31.6, 43, 1.2, 38.2, 38.4, 15.2, 43.6, 29.6, 
20, 3.8, 23, 3.2, 15.4, 14.6, 17.4, 27.6, 24, 27.8, 35.4, 2.4, 
12.4, 36, NA, 0.2, 15.6, 0.4, 20.8, 3.4, 22.8, 23.8, 25.6, 34, 
NA, 0.6, 5.6, 1.8, NA, NA, 28.6, NA, NA, 40.4, NA, 16.2, 13, 
4, NA, NA, 1.6, 1.2, 6, NA, 1.6, 1.2, NA, 1.8, NA, NA, 0.4, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 0.4, NA, NA, 0.8, 3.4, 
3.2, 3.2, 3.8, 4.4, 2.8, 5.2, 11, 10.8, 0.2, 1.8, 2.4, 4.4, 2, 
1.2, 1.8, 4.6, 6, 5, 8.6, 10.6, 10.4, 10, 7.2, 7.6, 0.2, 17, 
3, 2.6, 1.4, 2.8, 0.2, NA, 7.4, 17.4, 7.4, 0.6, NA, 5.2, 1.6, 
NA, 7.2, 2.6, 7.2, 7.6, 15, 21.8, NA, 2, NA, 10.4, 4, 2.4, 4.8, 
1.4, NA, NA, 0.6, NA, 1.2, 0.2, NA, 1.4, 3, 0.4, 1, NA, 1.6, 
38.8, NA, NA, NA, 0.2, NA, NA, NA, NA, NA, NA, 0.2, 1.8, 2.8, 
4.2, 1.6, 7.4, 2, 6, 8)

【问题讨论】:

    标签: r for-loop append time-series


    【解决方案1】:

    append 函数希望您将要附加的内容传递给它到以及要附加到它的内容。你只是通过了后者。我通过阅读附加文档(不要告诉任何人)来解决这个问题。

    您需要做的其他事情是初始化向量append_Cast,以便它可以在第一个循环中附加。您需要将要附加的值包装到 c() 包装器中,以便它们成为向量。像这样的:

     append_cast <- {}
    
      for(i in 1:3)
      {  
        i<-1
        startLearn2<-1+i*10
        EndLearn2<-EndLearn1+i*10
    
        y <- tsData[startLearn2:EndLearn2] 
        fit_new <- Arima(y, model=fit_Model )
    
        append_cast <- append(append_cast, c(ModelCast$mean,forecast(fit_new, h=10)$mean, after=i*10)) ## Only seems to append one forecast instead of 3
      }
    

    【讨论】:

    • 感谢您的提示让我非常接近。我不得不进行一些更改,它们在上面代码的更新中。在您的代码版本中,您最终会使用长度为 60 的 append_cast ,因为您每次还要附加 ModelCast$mean 。我还将 append_cast 初始化为时间序列而不是向量。
    猜你喜欢
    • 2019-07-12
    • 1970-01-01
    • 2021-05-19
    • 2016-02-21
    • 2022-10-05
    • 2017-08-15
    • 2011-07-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多