用于在R中一次预测多个数据集的循环

时间:2014-07-23 12:26:20

标签: r for-loop forecasting

我有一个包含“时间,地区,销售”变量的数据集,我想使用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。

任何帮助表示赞赏!谢谢。

2 个答案:

答案 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