使用 auto.Arima() 和 xreg 进行 ARIMA 预测

Posted

技术标签:

【中文标题】使用 auto.Arima() 和 xreg 进行 ARIMA 预测【英文标题】:ARIMA forecasting with auto.Arima() and xreg 【发布时间】:2021-10-18 13:13:59 【问题描述】:

我正在研究预测商店销售的项目以学习预测。到目前为止,我已经成功使用简单的 auto.Arima() 函数进行预测。但是为了使这些预测更准确,我可以使用协变量。我已经定义在这篇文章的帮助下,使用 xreg 运算符影响商店销售的假期、促销等协变量: 如何在 R 的 auto.arima() 中设置 xreg 参数?

但是我的代码失败了:

ARIMAfit

并给出错误提示:

model.frame.default(formula = x ~ xreg, drop.unused.levels = TRUE) 中的错误:可变长度不同(为 'xreg' 找到)另外:警告消息:在 !is.na(x) & !is.na(rowSums(xreg)) : 较长的对象长度不是较短对象长度的倍数

以下是我的数据集的链接:https://drive.google.com/file/d/0B-KJYBgmb044blZGSWhHNEoxaHM/view?usp=sharing

这是我的代码:

data = read.csv("xdata.csv")[1:96,]
View(data)

saledata <- ts(data[1:96,4],start=1)
View(saledata)

saledata[saledata == 0] <- 1
View(saledata)

covariates = cbind(DayOfWeek=model.matrix(~as.factor(data$DayOfWeek)),
                 Customers=data$Customers,
             Open=data$Open,
                 Promo=data$Promo,
             SchoolHoliday=data$SchoolHoliday)
View(head(covariates))


# Remove intercept
covariates <- covariates[,-1]
View(covariates)

require(forecast)
ARIMAfit <- auto.arima(saledata, xreg=covariates)//HERE IS ERROR LINE
summary(ARIMAfit)

还告诉我如何预测接下来的 48 天。我知道如何使用简单的 auto.Arima() 和 n.ahead 进行预测,但不知道在使用 xreg 时如何进行。

【问题讨论】:

【参考方案1】:

几点。一,您可以将整个矩阵转换为 ts 对象,然后稍后隔离变量。其次,如果您在 arima 模型中使用协变量,那么您需要在预测样本外时提供它们。这可能意味着在为您感兴趣的变量生成预测之前预测每个协变量。在下面的示例中,为简单起见,我将数据分成两个样本。

dta = read.csv("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("DayOfWeek", "Customers", "Open", "Promo", "SchoolHoliday")
fit <- auto.arima(train[,"Sales"], xreg = train[, covariates])

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

【讨论】:

Hii NBATrends 我不理解您编写的第二个代码,用于说明使用协变量进行样本预测的方法让我们拆分数据。窗口函数的作用以及此处指定的 end=90 和 start=91 的作用在窗口函数中 就像我说的那样,当您的 arima 模型中有协变量时,为了预测样本外的样本,您需要提供它们的值。在上面的示例中,我只是将数据分成两部分以进行说明。第一个样本用于拟合模型,第二个样本使用协变量进行预测。窗口函数可用于对数据进行子集化。 好的,因此从 1 到 90 的数据将用于训练模型,而 91 到 96(6 天)将用于预测这 6 天,并使用这 6 天的协变量。对吧?? 注意到我犯了一个错误,请参阅上面的编辑。我们使用前 90 周或 624 天进行训练,然后使用剩余 42 天的协变量进行预测。 但我的数据是每天观察 96 次的数据。怎么可能有 90 周?我很困惑。告诉我是否必须使用前 48 次观察来训练模型并预测接下来的 48 天使用在上面的数据集中,他们可用的协变量对于火车结束将是 48,对于测试开始将是 49。对吗??

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

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

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

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

SAS中的“Auto.arima”?

auto.arima() 函数中的错误

等价于 python 的 auto.arima()