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

3

我正在开发一个预测模型,其中我有从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 进行样本外预测的示例吗?我知道要实现这个目标,需要将 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
嗨@atiretoo,感谢您的回复。在这种情况下,我是否需要手动创建一个x值矩阵来推入,或者您知道一种将预测值推入的方法。例如,如果我预测我的xreg变量,我将获得类似的输出,包括点预测和置信区间。我能否将我的点预测推入模型而不是手动创建矩阵?再次感谢。 - Dana Hagist
嗯,我试图从链接的问题中张贴的数据中制作一个MWE,但我遇到了一些问题,这些问题可能与该数据有关,而不是您的问题。如果没有您的数据,我可能会解决一个非问题。 - atiretoo
我找到了我的问题... - atiretoo
谢谢@atiretoo...让我试一下,然后我会告诉你它的效果如何。我正在使用实际的公司数据进行分析,这就是为什么我不能发布它的原因。如果我无法使这种方法起作用,我将创建一些模拟数据来使用。 - Dana Hagist
2个回答

3

这里是一个用于未知协变量时间序列外样本预测的MWE。该方法依赖于提供的数据(链接)以及@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])

但是如果我们还不知道顾客的价值呢? 期望的目标是预测顾客,然后将这些预测值用于销售预测中。开放和促销活动都在经理的控制范围内,因此在预测中将被“固定”。

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

我将尝试预测未来两周的情况,并假设没有促销活动。
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包 (v0.2.0) 在2018-03-29创建的。


我已经成功地使用此方法来预测未来的时间段。非常感谢您的帮助。最后一个问题是,我们能否将这些未来的时间段表示为实际的时间参考?当我不使用xreg时,我的预测值将代表时间序列的未来,而现在我只看到(41、42、43等)? - Dana Hagist
是的,频率和单位将与原始拟合中的时间序列相同。 - atiretoo
1
我在面试中使用了这种方法,效果很好。如果我得到这份工作,我会请你喝很多咖啡的伙计。已经有一段时间没碰 TypeScript 了。 - ctde

0

再次感谢您的协助。

我能够结合以上建议来实现我想要的结果。

最终,我所做的是为我的外生变量创建时间序列对象并进行预测。然后,我取出predict$mean输出的结果,并为其创建时间序列对象(长度与我原始变量预测的长度相同),将其输入到原始预测模型中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接