使用 auto.arima() 和 xreg 进行样本外预测

Posted

技术标签:

【中文标题】使用 auto.arima() 和 xreg 进行样本外预测【英文标题】:Out of Sample forecast with auto.arima() and xreg 【发布时间】:2018-09-08 18:17:13 【问题描述】:

我正在研究一个预测模型,其中我有从 2014 年到当月(2018 年 3 月)的月度数据。

我的部分数据是帐单列和报价金额列,例如 (为格式化道歉)

年 - 季度 - 月 - 账单 - 报价 2014- 2014Q1-- 201401- 100-------------500 2014- 2014Q1-- 201402- 150-------------600 2014- 2014Q1-- 201403- 200-------------700

我正在使用它来预测每月的销售额,并尝试使用 xreg 来计算每月的报价数量。

我查看了下面的文章,但缺少一些东西来完成我想要做的事情: ARIMA forecasting with auto.Arima() and xreg

问题:有人可以展示一个使用 xreg 预测 OUT OF SAMPLE 的示例吗?我知道为了实现这一点,您需要从样本中预测您的 xreg 变量,但我不知道如何将这些未来值传递进去。

我在预测值后尝试使用类似 futurevalues$mean 的东西,但这不起作用。

这是我的代码:

sales = read.csv('sales.csv')

# Below, I'm creating a training set for the models through 
#  December 2017 (48 months).
train = sales[sales$TRX_MON<=201712,]

# I will also create a test set for our data from January 2018 (3 months)
test = sales[sales$TRX_MON>201712,]

dtstr2 <- ts(train2, start=2014, frequency=12)
dtste2 <- ts(test2, start=2018, frequency=12)

fit2 <- auto.arima(dtstr2[,"BILLINGS"], xreg=dtstr2[,"QUOTES"])
fcast2 <- forecast(fit2, xreg=dtste2[,"QUOTES"], h=24)
fcast2

上面的代码有效,但只能给出 3 个月的预测,例如

                  Point Forecast    Lo 80    Hi 80    Lo 95    Hi 95
Jan 2018          70                60       100      50       130
Feb 2018          80                70       110      60       140
Mar 2018          90                80       120      70       150

我搜索了尽可能多的博客和主题,寻找一个使用 auto.arima 和 xreg 变量的样本外预测的示例,但找不到任何这样做的。

有人可以帮忙吗?

非常感谢。

【问题讨论】:

您只会获得与您提供协变量一样多的预测。所以在这里你提供 3 并得到 3。如果你想要更多,你必须提供一个 x 值矩阵,其中包含你想要的预测行数。 嗨@atiretoo,谢谢你的回复。在这种情况下,我是否必须手动创建一个包含 x 值的矩阵才能推入,或者您是否知道将预测值推入的方法。例如,如果我预测我的 xreg 变量,我会得到一个类似的输出包括点预测和置信区间。我可以将我的点预测推送到模型中,而不是手动创建矩阵吗?再次感谢。 好吧,我尝试根据链接问题中发布的数据来制作 MWE,但我遇到的问题可能与该数据有关,而不是您的问题。如果没有您的数据,我可能无法解决问题。 我发现了我的问题... 谢谢@atiretoo...让我试一试,我会告诉你它是如何工作的。我正在使用实际的公司数据进行分析,这就是我无法发布它的原因。如果我不能让这种方法发挥作用,我会启动一些模拟数据来使用。 【参考方案1】:

这是一个 MWE,用于对未知协变量的时间序列进行样本外预测。 这依赖于for this question提供的数据 以及@Raad 的出色回答。

library("forecast")

dta = read.csv("~/stackexchange/data/xdata.csv")[1:96,]
dta <- ts(dta, start = 1)

# to illustrate out of sample forecasting with covariates lets split the data
train <- window(dta, end = 90)
test <- window(dta, start = 91)

# fit model
covariates <- c("Customers", "Open", "Promo")
fit <- auto.arima(train[,"Sales"], xreg = train[, covariates])

根据测试数据预测

fcast <- forecast(fit, xreg = test[, covariates])

但是如果我们还不知道客户的价值怎么办? 期望的目标是预测客户,然后使用这些预测 销售预测中的值。 Open 和 Promo 尽在掌控 经理,因此将在预测中“固定”。

customerfit <- auto.arima(train[,"Customers"], xreg = train[, c("Open","Promo")])

我将尝试预测 2 周后,并假设没有促销活动。

newdata <- data.frame(Open = rep(c(1,1,1,1,1,1,0), times = 2),
                          Promo = 0)

customer_fcast <- forecast(customerfit, xreg = newdata)

# the values of customer are in `customer_fcast$mean`

newdata$Customers <- as.vector(customer_fcast$mean)

以与原始数据相同的顺序获取新数据列至关重要! forecast()位置

匹配回归器
sales_fcast <- forecast(fit, xreg = as.matrix(newdata)[,c(3,1,2)])
plot(sales_fcast)

由reprex package (v0.2.0) 于 2018 年 3 月 29 日创建。

【讨论】:

我已经能够使用这种方法来预测未来的时期。非常感谢你的帮助。关于这个的最后一个问题,我们是否能够将这些未来时期表示为实际的时间参考?当我不使用 xreg 时,我的预测值将代表时间序列的未来,而现在我只是看到(41、42、43 等)? 是的,频率和单位将与原始拟合中的时间序列相同。【参考方案2】:

再次感谢您的协助。

我能够结合使用上述建议来获得我正在寻找的东西。

最终,我最终要做的是为我的外生变量创建时间序列对象并对其进行预测。然后,我获取 predict$mean 输出并为那些(我想预测原始变量的长度)创建时间序列对象,然后将它们输入到我的原始预测模型中。

【讨论】:

以上是关于使用 auto.arima() 和 xreg 进行样本外预测的主要内容,如果未能解决你的问题,请参考以下文章

使用 auto.arima 和 xreg=解释变量进行 R 时间序列预测

Auto.arima() 函数不会产生白噪声。我还应该如何对数据进行建模

为啥 knitr 使用 auto.arima 显示警告?

SAS中的“Auto.arima”?

auto.arima() 函数中的错误

等价于 python 的 auto.arima()