如何使用purrr/tidyverse将ets、auto.arima等多个时间序列模型应用于R数据中的组?
我的数据集如下所示。我试图使用ets、auto.arima、Prophet或任何其他模型预测未来2个月的“金额”。但我的问题是,我想根据A、B、C三组预测未来2个月的金额。我不知道在R里怎么做如何使用purrr/tidyverse将ets、auto.arima等多个时间序列模型应用于R数据中的组?,r,tidyverse,purrr,forecast,facebook-prophet,R,Tidyverse,Purrr,Forecast,Facebook Prophet,我的数据集如下所示。我试图使用ets、auto.arima、Prophet或任何其他模型预测未来2个月的“金额”。但我的问题是,我想根据A、B、C三组预测未来2个月的金额。我不知道在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-02-01', '2017-03-01', '
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-02-01', '2017-03-01', '2017-04-01','2017-05-01','2017-06-01','2017-01-01', '2017-02-01', '2017-03-01', '2017-04-01','2017-05-01','2017-06-01'),
Group=c('A','A','A','A','A','A','B','B','B','B','B','B','C','C','C','C','C','C'),
Amount=c('12.1','13','15','10','12','9.0','12.5','13.3','14.8','11','10','12.1','13','12.2','11','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)预测多个单变量时间序列模型(ets、auto.arima和prophet)。假设各组相互独立。另外,我们如何提取误差指标和预测点(如前2个周期)(在数据框中)并绘制预测图,再次按组分组。此处需要帮助
迭代方法,如使用tidyverse/purrr或sweep等包,可能是一种解决方案 首先将日期转换为
yearmon
类,以使月份间隔规则,因为日期不是由于每个月的天数不同造成的yearmon
在内部表示日期,1月为+0年,2月为+1/12年,…,12月为+11/12年。如果需要,随后可以使用as.numeric
将日期从yearmon>转换为数字,以获得内部表示
calc
表示对单个组执行计算的函数。用你的函数替换它。它的第一个参数应该是带有日期
和金额
列的数据框。附加参数是可选的,仅当需要传递不随组变化的固定参数时才需要。在下面的示例中,我们将一个字符串,“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")
图书馆(动物园)
数据2