建立滚动平均预测

时间:2018-02-12 20:21:30

标签: r time-series zoo rollapply rolling-computation

我有一系列间歇性需求称为零件(下面的示例),我想开发一个训练集和测试集的滚动平均预测。我的代码也在下面。 fitmean系列计算滚动平均值,但有两个问题:

  1. 当我真正想要的是达到12的滚动平均值时,它增加了第13个元素;和,
  2. 日期从2016年6月到2017年6月,所以当我减去测试部分时,我只获得2017年1月至6月的6个值。
  3. 有没有办法(1)删除fitmean末尾的第13个元素,(2)更改日期以便它们与testparts匹配?

    谢谢。

    library(forecast,zoo)
    parts<-matrix(c(0,0,0,0,0,0,2,0,0,0,0,0,3,0,0,0,0,0,1,0,0,7,0,0),nrow=24,ncol=1)
    parts<-ts(parts,f=12,start=c(2016,1))
    maemean<-matrix(NA,nrow=12,ncol=1)
      trainparts<-window(parts,end=c(2016,12))
      testparts<-window(parts,start=c(2017,1),end=c(2017,12))
      fitmean<-round(rollapply(parts, width=12, by = 1, FUN = mean))
      maemean<-abs(fitmean-testparts)
    
    Jan-16  0
    Feb-16  0
    Mar-16  0
    Apr-16  0
    May-16  0
    Jun-16  0
    Jul-16  2
    Aug-16  0
    Sep-16  0
    Oct-16  0
    Nov-16  0
    Dec-16  0
    Jan-17  3
    Feb-17  0
    Mar-17  0
    Apr-17  0
    May-17  0
    Jun-17  0
    Jul-17  1
    Aug-17  0
    Sep-17  0
    Oct-17  7
    Nov-17  0
    Dec-17  0
    

    澄清:

    以上列表应分为1月16日至12月16日的训练集以及1月17日至12月17日的测试集。我想要做的是使用滚动均值,所以1月16日到12月16日的平均值(四舍五入为0)成为1月17日的预测,依此类推,即2月16日到1月17日,输出应该如下所示

    Jan-17  0
    Feb-17  0
    Mar-17  0
    Apr-17  0
    May-17  0
    Jun-17  0
    Jul-17  0
    Aug-17  0
    Sep-17  0
    Oct-17  0
    Nov-17  1
    Dec-17  1
    

    不幸的是,我得到13副12个元素。

         Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
    2016                       0   0   0   0   0   0   0
    2017   0   0   0   1   1   1                        
    

1 个答案:

答案 0 :(得分:1)

1)width = list(...)从问题中删除所有不相关的代码并更改rollapply行,-seq(12)rollapply的向量偏移指示library(zoo) # test data parts <- matrix(c(0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 1, 0, 0, 7, 0, 0), nrow = 24, ncol = 1) parts <- ts(parts, freq = 12, start = c(2016, 1)) round(rollapply(parts, list(-seq(12)), FUN = mean)) 传递第一个先前,第二个先前,......第十二个先前值,表示每个点。

     Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
2017   0   0   0   0   0   0   0   0   0   0   1   1

,并提供:

round((rollsumr(parts, 13) - parts) / 12)
##      Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
## 2017   0   0   0   0   0   0   0   0   0   0   1   1

2)rollumr 另一种方法是采用宽度为13的滚动总和,然后减去当前值并除以12:

{{1}}