如何使用purrr / tidyverse将几个时间序列模型如ets,auto.arima等应用于R中的数据组?

问题描述

我的数据集如下所示。我正在尝试使用ets,auto.arima,Prophet或任何其他模型来预测未来2个月的“金额”。但是我的问题是,我想根据每个组(即A,B,C)来预测接下来两个月的金额。我不确定如何在R中执行此操作?

    data = data.frame(Date=c('2017-01-01','2017-02-01','2017-03-01','2017-04-01','2017-05-01','2017-06-01','2017-01-01','2017-06-01'),Group=c('A','A','B','C','C'),Amount=c('12.1','13','15','10','12','9.0','12.5','13.3','14.8','11','12.1','12.2','10.9','13.4','11.1'))

data

         Date Group Amount
1  2017-01-01     A   12.1
2  2017-02-01     A     13
3  2017-03-01     A     15
4  2017-04-01     A     10
5  2017-05-01     A     12
6  2017-06-01     A    9.0
7  2017-01-01     B   12.5
8  2017-02-01     B   13.3
9  2017-03-01     B   14.8
10 2017-04-01     B     11
11 2017-05-01     B     10
12 2017-06-01     B   12.1
13 2017-01-01     C     13
14 2017-02-01     C   12.2
15 2017-03-01     C     11
16 2017-04-01     C   10.9
17 2017-05-01     C   13.4
18 2017-06-01     C   11.1

我需要按组(A,B,C)预测多个单变量时间序列模型(集合,auto.arima和先知)。假设各组彼此独立。此外,我们如何提取误差指标并在2个周期前(在数据框中)指出预测并绘制预测,然后再按组进行分组。在这里需要帮助!

诸如使用tidyverse / purrr或sweep等软件包的迭代方法可能是解决方案。 ?

解决方法

首先将日期转换为yearmon类,以使月份有规律地间隔,因为日期不是由于每月的天数不同而引起的。 yearmon内部将日期表示为年份+ 1月的年份+ 0 + 2月,...的年份的1 / 12,12月的年份+ 11/12。如果需要,日期可以随后从yearmon转换为使用as.numeric进行数字表示以获取内部表示。

calc表示对单个组执行计算的功能。用您的功能替换它。它的第一个参数应该是具有DateAmount列的数据框。附加参数是可选的,只有在希望传递不随组变化的固定参数时才需要。在下面的示例中,我们将字符串"Hello"传递给msg参数。该函数可以返回任何类型的对象,例如纯矢量,列表或其他对象。

在最后一行,by将每组一次调用calc,并从calc返回一组返回值的列表,每组一个组件。

library(zoo)

data2 <- transform(data,Date = as.yearmon(Date),Amount = as.numeric(Amount)
)

calc <- function(dat,msg) {
  print(msg)
  fm <- lm(Amount ~ Date,dat)
  predict(fm,list(Date = tail(dat$Date,1) + 2/12))
}
by(data2[-2],data2[[2]],calc,msg = "Hello")

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...