如何在R中使用可配置的移动平均线进行预测

时间:2020-07-06 15:15:56

标签: r time-series

我有36个月的需求数据

dput(RawData)
structure(list(ModelNo = c("a", "a", "a", "a", "a", "a", "a", 
"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", 
"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", 
"a", "a", "a"), Month_Year = structure(c(1498867200, 1501545600, 
1504224000, 1506816000, 1509494400, 1512086400, 1514764800, 1517443200, 
1519862400, 1522540800, 1525132800, 1527811200, 1530403200, 1533081600, 
1535760000, 1538352000, 1541030400, 1543622400, 1546300800, 1548979200, 
1551398400, 1554076800, 1556668800, 1559347200, 1561939200, 1564617600, 
1567296000, 1569888000, 1572566400, 1575158400, 1577836800, 1580515200, 
1583020800, 1585699200, 1588291200, 1590969600), class = c("POSIXct", 
"POSIXt"), tzone = "UTC"), Quantity = c(9, 3, 4, 0, 2, 0, 0, 
7, 1, 4, 1, 2, 4, 2, 2, 0, 4, 1, 2, 0, 0, 0, 4, 0, 0, 0, 0, 0, 
1, 0, 0, 0, 2, 0, 2, 0)), row.names = c(NA, 36L), class = "data.frame")

我使用以下代码创建了时间序列

    y_ts <- ts(RawData$Quantity,
                 start=c(year(min(Data_sort$Month_Year)), 
month(max(Data_sort$Month_Year))+1), frequency=12)

我想将需求数据的前24个月用作训练集,而将最后12个月用作测试集。 使用移动平均法(前24个月),我使用以下代码预测了12个月的值:

test<-rollapply(y_ts, list(-seq(24)), FUN = mean, fill = NA)
  cbind(RawData, data.frame(test))

输出如下:

 ModelNo Month_Year Quantity     test
1        a 2017-07-01        9       NA
2        a 2017-08-01        3       NA
3        a 2017-09-01        4       NA
4        a 2017-10-01        0       NA
5        a 2017-11-01        2       NA
6        a 2017-12-01        0       NA
7        a 2018-01-01        0       NA
8        a 2018-02-01        7       NA
9        a 2018-03-01        1       NA
10       a 2018-04-01        4       NA
11       a 2018-05-01        1       NA
12       a 2018-06-01        2       NA
13       a 2018-07-01        4       NA
14       a 2018-08-01        2       NA
15       a 2018-09-01        2       NA
16       a 2018-10-01        0       NA
17       a 2018-11-01        4       NA
18       a 2018-12-01        1       NA
19       a 2019-01-01        2       NA
20       a 2019-02-01        0       NA
21       a 2019-03-01        0       NA
22       a 2019-04-01        0       NA
23       a 2019-05-01        4       NA
24       a 2019-06-01        0       NA
25       a 2019-07-01        0 2.166667
26       a 2019-08-01        0 1.791667
27       a 2019-09-01        0 1.666667
28       a 2019-10-01        0 1.500000
29       a 2019-11-01        1 1.500000
30       a 2019-12-01        0 1.458333
31       a 2020-01-01        0 1.458333
32       a 2020-02-01        0 1.458333
33       a 2020-03-01        2 1.166667
34       a 2020-04-01        0 1.208333
35       a 2020-05-01        2 1.041667
36       a 2020-06-01        0 1.083333

当我使用所有24个月的历史数据来预测从25个月到36个月的天气预报时,这正是我想要的。但是,我的问题1 是如何从24个月的训练期中使用最近15个月的移动平均线来预测从25个月到36个月的滚动移动平均线(如上测试期)。我想保留用于预测可配置的历史记录,它可以是 15个月 18个月 24个月(如当前示例)。例如,为了进一步说明我是否使用 15个月移动平均值,则第25个月的预测值应为第10值至第24值的平均值,第26个月的预测值应为第11值至第25值的平均值,依此类推。 .. 我的问题2 ,在比较测试数据的实际值和预测值之后,我应该编写单独的代码来创建一个数据框来预测/预测未来12个月的实际值(即预测范围)吗?如果有人可以帮助的话。谢谢。

1 个答案:

答案 0 :(得分:0)

幸运的是,我可以使用以下社区中的其他R代码来破解自己。

MA_Horizon_FC<-data.frame(ModelNumber = character(), Month_Year = Date(), HorizonFC_12m_Quantity = numeric())
train_test_FC_1<-NULL


history_slices=15 #####configurable historical slices, 15 or 24 or anything else
    listofdfs <- list()
      
      for (i in unique(MiniData$ModelNumber))
      {
        Selected_data<-subset(MiniData, ModelNumber==i)
        Data_sort<-Selected_data[order(Selected_data$Month_Year),]
        rownames(Data_sort) <- 1:36
      
        y_ts <- ts(Data_sort$Quantity,
                 start=c(year(min(Data_sort$Month_Year)), month(min(Data_sort$Month_Year))), frequency=12)
      
     
      test_FC<-rollapply(y_ts, list(-seq(history_slices)), FUN = mean, fill = NA)
      
      test_FC[1:24]<-NA
      listofdfs[[i]]<-cbind(Data_sort, data.frame(test_FC))
    
      
      ##############   Picking up the 37th month forecast  #####################
      forecast_only<-rollapply(y_ts ,history_slices, FUN = mean, align = "right") 
      FC_Value<-as.numeric(tail(as.zoo(forecast_only),1))
      
      ##############   calculating the month-year for the forecast   ###########
      date_1m_fwd <- as.POSIXlt(max(Data_sort$Month_Year))
      date_1m_fwd$mon <- date_1m_fwd$mon +1
      next_month_year<-date_1m_fwd
      
      #############creating a new data frame with parts and their forecasted value####
      MA_Horizon_FC <- rbind(MA_Horizon_FC, data.frame(ModelNumber=i, Month_Year=next_month_year, HorizonFC_12m_Quantity=FC_Value))
      }  
      
      ##########   Melting the list to create a dataframe for Test-Train Values
    MA_Train_Test_FC <- listofdfs %>% reduce(bind_rows)
相关问题