如何在R中预测多个时间序列

Posted

技术标签:

【中文标题】如何在R中预测多个时间序列【英文标题】:How to forecast multiple time series in R 【发布时间】:2021-10-10 00:52:34 【问题描述】:

我有这个包含多个系列(50 个产品)的数据集。我的数据集有 50 个产品(50 列)。每列都有一个产品的每日销售额。 我想使用 ets 预测这些产品。所以我在下面创建了这段代码,当我运行它时,我只得到一个时间序列和一些我不理解的信息。在此先感谢:)

y<- read.csv("QAO2.csv", header=FALSE, fileEncoding = "latin1")
y <- ts(y[,-1],f=12,s=c(2007, 1))

ns <- ncol(y)
for(i in 1:ns)
fit.ets <- ets(y[,i])
print(fit.ets)

f.ets <- forecast(fit.ets,h=12)

print(f.ets)

plot(f.ets)

【问题讨论】:

如果您在 R for 循环中有多行,那么您必须将这些行包含在 ... 括号内。 【参考方案1】:

这就是 fable 包的设计目的。这是一个使用 2007 年的 50 系列月度数据的示例。虽然您说您有每日数据,但您提供的代码假定为月度数据(频率 12)。

library(fable)
library(dplyr)
library(tidyr)
library(ggplot2)

y <- ts(matrix(rnorm(175*50), ncol=50), frequency=12, start=c(2007,1)) %>%
  as_tsibble() %>%
  rename(Month = index, Sales=value)
y
#> # A tsibble: 8,750 x 3 [1M]
#> # Key:       key [50]
#>       Month key        Sales
#>       <mth> <chr>      <dbl>
#>  1 2007 Jan Series 1  1.06  
#>  2 2007 Feb Series 1  0.495 
#>  3 2007 Mar Series 1  0.332 
#>  4 2007 Apr Series 1  0.157 
#>  5 2007 May Series 1 -0.120 
#>  6 2007 Jun Series 1 -0.0846
#>  7 2007 Jul Series 1 -0.743 
#>  8 2007 Aug Series 1  0.714 
#>  9 2007 Sep Series 1  1.73  
#> 10 2007 Oct Series 1 -0.212 
#> # … with 8,740 more rows
fit.ets <- y %>% model(ETS(Sales))  
fit.ets
#> # A mable: 50 x 2
#> # Key:     key [50]
#>    key       `ETS(Sales)`
#>    <chr>          <model>
#>  1 Series 1  <ETS(A,N,N)>
#>  2 Series 10 <ETS(A,N,N)>
#>  3 Series 11 <ETS(A,N,N)>
#>  4 Series 12 <ETS(A,N,N)>
#>  5 Series 13 <ETS(A,N,N)>
#>  6 Series 14 <ETS(A,N,N)>
#>  7 Series 15 <ETS(A,N,N)>
#>  8 Series 16 <ETS(A,N,N)>
#>  9 Series 17 <ETS(A,N,N)>
#> 10 Series 18 <ETS(A,N,N)>
#> # … with 40 more rows
f.ets <- forecast(fit.ets, h=12)
f.ets
#> # A fable: 600 x 5 [1M]
#> # Key:     key, .model [50]
#>    key      .model        Month          Sales   .mean
#>    <chr>    <chr>         <mth>         <dist>   <dbl>
#>  1 Series 1 ETS(Sales) 2021 Aug N(-0.028, 1.1) -0.0279
#>  2 Series 1 ETS(Sales) 2021 Sep N(-0.028, 1.1) -0.0279
#>  3 Series 1 ETS(Sales) 2021 Oct N(-0.028, 1.1) -0.0279
#>  4 Series 1 ETS(Sales) 2021 Nov N(-0.028, 1.1) -0.0279
#>  5 Series 1 ETS(Sales) 2021 Dec N(-0.028, 1.1) -0.0279
#>  6 Series 1 ETS(Sales) 2022 Jan N(-0.028, 1.1) -0.0279
#>  7 Series 1 ETS(Sales) 2022 Feb N(-0.028, 1.1) -0.0279
#>  8 Series 1 ETS(Sales) 2022 Mar N(-0.028, 1.1) -0.0279
#>  9 Series 1 ETS(Sales) 2022 Apr N(-0.028, 1.1) -0.0279
#> 10 Series 1 ETS(Sales) 2022 May N(-0.028, 1.1) -0.0279
#> # … with 590 more rows
f.ets %>% 
  filter(key == "Series 1") %>%
  autoplot(y) +
  labs(title = "Series 1")

由reprex package (v2.0.0) 于 2021-08-05 创建

【讨论】:

非常感谢 Rob,非常感谢您的帮助。还有一个问题,这对 auto.arima 是否同样有效?并根据什么确定最佳预测方法?非常感谢 我已经更改了我的 df 格式,看起来与您使用的格式相似,但是当我使用提供的代码时,我遇到了一些我不知道如何解决的错误。你能帮忙吗?谢谢!! 发生的情况是,在键列中,我没有产品,而是每列的名称。 如果您想要 ARIMA 模型,请使用 ARIMA() 而不是 ETS()。该算法与预测包中的 auto.arima() 相同。确保您使用的是最新版本的软件包。 @Abdel_DAS 请在 cmets 中提出后续问题,并在此处发布代码 - 它实际上是不可读的;而是打开一个新问题。如果答案解决了您最初的问题,请接受 - 请参阅What should I do when someone answers my question?

以上是关于如何在R中预测多个时间序列的主要内容,如果未能解决你的问题,请参考以下文章

使用 R 中的 Apriori 算法预测多个输出

如何在 R 中对多个分类变量进行一次热编码

R语言中如何使用排队论预测等待时间?

鉴于我可以访问 R 的“摘要”输出,如何在 Excel 中复制 R 的预测函数

如何在 R 中使用 pmml 文件进行预测

如何使用 R 中经过训练的分类器预测新数据集?