问题描述
我的数据集如下所示。我正在尝试使用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
表示对单个组执行计算的功能。用您的功能替换它。它的第一个参数应该是具有Date
和Amount
列的数据框。附加参数是可选的,只有在希望传递不随组变化的固定参数时才需要。在下面的示例中,我们将字符串"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")