我有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个月的实际值(即预测范围)吗?如果有人可以帮助的话。谢谢。
答案 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)