我有一个包含“时间,地区,销售”变量的数据集,我想使用library(forecast)
使用ARIMA或ETS(SES)预测每个地区的销售额。总共有70个区域,每个区域都有152个观测值(3年的数据)。像这样:
Week Region Sales
01/1/2011 A 129
07/1/2011 A 140
14/1/2011 A 133
21/1/2011 A 189
... ... ...
01/12/2013 Z 324
07/12/2013 Z 210
14/12/2013 Z 155
21/12/2013 Z 386
28/12/2013 Z 266
所以,我希望R将每个区域视为不同的数据集并执行auto.arima
。我猜一个for循环应该是一个理想的契合,但我很失败。
理想情况下我希望它做的是一个for循环来运行这样的事情(每152次观察一次自动arima):
fit.A <- auto.arima(data$Sales[1:152])
fit.B <- auto.arima(data$Sales[153:304])
....
fit.Z <- auto.arima(data$Sales[10490:10640])
我遇到this但是在将数据帧转换为时间序列时,我得到的只是NAs。
任何帮助表示赞赏!谢谢。
答案 0 :(得分:7)
尝试非常高效的data.table
包(假设您的数据集名为temp
)
library(data.table)
library(forecast)
temp <- setDT(temp)[, list(AR = list(auto.arima(Sales))), by = Region]
最后一步将以temp
格式将结果保存在list
中(因为这是您可以存储此类对象的唯一格式)。
后记您可以在这些列表上执行任何操作,例如,检查它们:
temp$AR
#[[1]]
# Series: Sales
# ARIMA(0,0,0) with non-zero mean
#
# Coefficients:
# intercept
# 147.7500
# s.e. 12.0697
#
# sigma^2 estimated as 582.7: log likelihood=-18.41
# AIC=40.82 AICc=52.82 BIC=39.59
#
#[[2]]
# Series: Sales
# ARIMA(0,0,0) with non-zero mean
#
# Coefficients:
# intercept
# 268.2000
# s.e. 36.4404
#
# sigma^2 estimated as 6639: log likelihood=-29.1
# AIC=62.19 AICc=68.19 BIC=61.41
或绘制预测(等)
temp[, sapply(AR, function(x) plot(forecast(x, 10)))]
答案 1 :(得分:7)
您可以使用dplyr
轻松完成此操作。假设您的数据框名为df
,请运行:
library(dplyr)
library(forecast)
model_fits <- group_by(df, Region) %>% do(fit=auto.arima(.$Sales))
结果是包含适合每个区域的模型的数据框:
> head(model_fits)
Source: local data frame [6 x 2]
Groups: <by row>
Region fit
1 A <S3:Arima>
2 B <S3:Arima>
3 C <S3:Arima>
4 D <S3:Arima>
5 E <S3:Arima>
6 F <S3:Arima>
您可以获得每个模型的列表,如下所示:
> model_fits$fit
[[1]]
Series: .$Sales
ARIMA(0,0,0) with non-zero mean
Coefficients:
intercept
196.0000
s.e. 14.4486
sigma^2 estimated as 2088: log likelihood=-52.41
AIC=108.82 AICc=110.53 BIC=109.42
[[2]]
Series: .$Sales
ARIMA(0,0,0) with non-zero mean
Coefficients:
intercept
179.2000
s.e. 14.3561
sigma^2 estimated as 2061: log likelihood=-52.34
AIC=108.69 AICc=110.4 BIC=109.29