使用 R 中的平均方法对多个组的时间序列数据进行简单预测

Simple Forecasting using Average method in R for Time series data for multiple groups

我已经对单个值进行了预测和时间序列分析,但没有一次性对一组值进行预测和时间序列分析。我在数据框中有多个组(型号)的历史数据(36 个月 - 每个月的第一天,我根据时间序列的要求创建)如下所示:

ModelNo.       Month_Year      Quantity
a               2017-06-01         0
a               2017-07-01         5
a               2017-08-01         3
..              ..........         ....
..              ..........         ....
a               2020-05-01         6

b               2017-06-01         9
b               2017-07-01         0
b               2017-08-01         1
..              ..........         ....
..              ..........         ....         
b               2020-05-01         4

c               2020-05-01         3
c               2017-06-01         1
c               2017-07-01         1
c               2017-08-01         0
..              ..........         ....
..              ..........         ....         
c               2020-05-01         4 

然后我使用下面的代码将我的数据框子集化为“一组”,以使用简单的平均函数生成预测

Selected_data<-subset(data, ModelNo.=='a')

currentMonth<-month(Sys.Date())
currentYear<-year(Sys.Date())

然后我创建了 24 个月的时间序列对象,然后将其输入到我的预测函数中。

y_ts = ts(Selected_data$Quantity, start=c(currentYear-3, currentMonth), end=c(currentYear-1, currentMonth-1), frequency=12)

然后我使用简单的均值函数来预测 12 个月的值(我已经有 2019 年 6 月至 2020 年 5 月的“数量”值)

 meanf(y_ts, 12, level = c(95))

我得到了与我的数据类似的输出(不是 link 以上数据提供的输出,只是我原始数据的快照)

         Point Forecast     Lo 95    Hi 95
Jun 2019          1.875 -3.117887 6.867887
Jul 2019          1.875 -3.117887 6.867887
Aug 2019          1.875 -3.117887 6.867887
Sep 2019          1.875 -3.117887 6.867887
Oct 2019          1.875 -3.117887 6.867887
Nov 2019          1.875 -3.117887 6.867887
Dec 2019          1.875 -3.117887 6.867887
Jan 2020          1.875 -3.117887 6.867887
Feb 2020          1.875 -3.117887 6.867887
Mar 2020          1.875 -3.117887 6.867887
Apr 2020          1.875 -3.117887 6.867887
May 2020          1.875 -3.117887 6.867887

所以我能够在这里成功生成“一个”型号的预测。但是,我的问题是:

  1. 我必须为数据框中的所有组生成此预测,例如 a、b、c 等。所以我不知道如何做到这一点并将结果存储在一个新的数据框中以获取预测值以及每个 ModelNo 的日期。

我知道如果我在下面使用,那将 return 我的预测值 R 函数意味着输出显示

meanf(y_ts, 12, level = c(95))$mean

但是如何针对数据框中的日期针对每个组类型存储它,我尝试了 mutate() 它没有用。

  1. 在问题 1 之后,我应该如何将预测值与实际值进行比较(如您所见,我只将 24 个月的数据切片以预测 12 个月的值)。我知道 R 和时间序列分析中有一些方法,我可以使用多个历史切片测试和训练 window,然后检查并与实际值进行比较以衡量预测 results/accuracy 等。我计划将其扩展到使用并尝试多种预测方法。

如果有人能帮我解决以上两个问题,请。

我相信需要一个学习曲线,我知道部分过程,但我不确定如何系统地填补这个知识空白,为多个组使用预测方法并根据实际值测试它们。除了上述两个问题的答案之外,任何 link 教程都可以帮助我提高学习效果。非常感谢。

你的问题比较宽泛,你可以从这样的事情开始思考如何进行。首先,您没有提供一些可重现的数据,所以我使用了您发布的内容,并对您的代码进行了一些调整以使其正常工作。这个想法是为每个模型做一个火车和一个测试时间序列,创建预测并将其存储在 data.frame 中。然后您可以计算例如 RMSE 以查看测试的拟合优度。

library(forecast)
library(lubridate)

# set date limits to train and test
 train_start <- ymd("2017-06-01")
 train_end <- ymd("2019-05-01")

 test_start <- ymd("2019-06-01") # end not necessary

# create an empty list
listed <- list()

for (i in unique(data$ModelNo.))
                   {
                    # subset one group
                      Selected_data<-subset(data, ModelNo.==i)
                    # as ts
                      y_ts <- ts(Selected_data$Quantity,
                                 start=c(year(min(data$Month_Year)),
                                         month(max(data$Month_Year))),
                                 frequency=12)

                    # create train
                      train_ts <- window(y_ts, 
                                        start=c(year(train_start), month(train_start)), 
                                         end=c(year(train_end), month(train_end)), frequency = 12)
                    # create test (note: using parameters ok to your sample data)
                       test_ts <- window(y_ts, 
                                         start=c(year(test_start), month(test_start)), frequency = 12)

                    listed[[i]] <- cbind(
                        data.frame(meanf(train_ts,length(test_ts),level = c(95))),
                        real =as.vector(test_ts)) 
                  }

现在对于第 1 部分,您可以创建一个 data.frame 结果:

res <- do.call(rbind,listed)
head(res) # only head to simplify output
           Point.Forecast     Lo.95    Hi.95 real
a.Jun 2019       49.29167 -22.57528 121.1586   95
a.Jul 2019       49.29167 -22.57528 121.1586   93
a.Aug 2019       49.29167 -22.57528 121.1586    5
a.Sep 2019       49.29167 -22.57528 121.1586   66
a.Oct 2019       49.29167 -22.57528 121.1586   47
a.Nov 2019       49.29167 -22.57528 121.1586   40

对于第 2 点,您可以计算每个时间序列的 RMSE(Metrics 包中有一个方便的函数):

library(Metrics)
goodness <- lapply(listed, function(x)rmse(x$real, x$Point.Forecast))
goodness 
    $$a
[1] 31.8692

$b
[1] 30.69859

$c
[1] 30.28037

有数据:

   set.seed(1234)
data <- data.frame(ModelNo. = c(rep("a",36),rep("b",36),rep("c",36)),
           Month_Year = lubridate::ymd(rep(seq(as.Date("2017/6/1"), by = "month", length.out = 36),3)),
           Quantity =sample(1:100,108, replace = T)
           )