无法将 xreg 值传递给 hts ARIMA 预测

Unable to pass xreg values to hts ARIMA forecast

我试图在我的预测中传递 xreg 参数,但将 运行 保留为一个错误,其中显示:

fc=forecast(gy,fmethod="arima",h=days,method="bu",xreg=z,newxreg=fz)

Error in as.matrix(newxreg) %*% coefs : non-conformable arguments
In addition: Warning message:
In cbind(intercept = rep(1, n), xreg) :
  number of rows of result is not a multiple of vector length (arg 1)

我不明白错误信息。由于我无法 post 原始数据,我在下面的代码中创建了一组模拟数据。出于某种原因,模拟数据工作正常。当我注释掉临时行并改用我的 csv 文件时,出现上述错误。

library(hts)

#Get data from file
#data=read.csv("C:/mydatafile.csv")

#TEMP: Create mock data
temp.dates=rep(seq(1,60),times=5)
temp.pl2=c(paste("A",rep(seq(1,3),each=60),sep=""),rep("A4",120))
temp.pl3=paste("B",rep(seq(1,5),each=60),sep="")

data=data.frame(DateId=temp.dates,
                ProductLevel2Code=temp.pl2,
                ProductLevel3Code=temp.pl3,
                SalesNetAmount=rnorm(300,mean=15000,sd=2000),
                TotalViews=rnorm(300,mean=50000,sd=3000))


#Create time series using sales dollars
r = length(unique(data$DateId))
c = length(unique(data$ProductLevel3Code))
myts=ts(matrix(data$SalesNetAmount,ncol=c,nrow=r),frequency=7)

#Assign column names to matrix
clnames <- unique(paste(data$ProductLevel2Code, # PL2
                        data$ProductLevel3Code, # PL3
                        sep=""))
colnames(myts)=clnames

#Create heirarchial time series based on 4 character codes
gy=hts(myts,characters=c(2,2))

#Get total views for site by day
data.views=aggregate(data[,c("TotalViews")],by=list(data$DateId),FUN=sum)$x

#Get xreg values
z= matrix(data.views,nrow=60)

#Create newxreg values
days=14
fz = matrix(rep(mean(data.views),days),nrow=days)

fc=forecast(gy,fmethod="arima",h=days,method="bu",xreg=z,newxreg=fz)
plot(fc)

我查看了原始数据,有42个ProductLevel3代码,每个代码有60个日期值。没有 NA 或缺失数据。 CSV 有 2,520 个数据行,等于 60x42。 CSV 文件结构与上述代码创建的数据框相同。

我错过了什么??

更新

只是为了在 Excel 中进行尝试,我用随机数替换了 SalesNetAmount 和 TotalViews,重新保存了 CSV,运行 R 脚本没有任何问题。我尝试按原样重新保存原始 CSV,但再次遇到错误。让我相信这些数字是我问题的根源。有些产品线很少 sales/traffic 所以有很多 0,但我尝试在整个数据集中为非零值添加 1,但错误仍然存​​在。

检查 zfz 的 类。您的模拟数据使用可以正常工作的矩阵。

同时检查 zfz 的维度。它们应该具有相同的列数,并且 fz 应该具有与 days.

相同的行数

我解决了直接问题,所以这在技术上是答案,但我不完全明白为什么。

我通读了有关使用 trace() 函数的 HTS 代码,发现了导致问题的行:

else if (fmethod == "arima") {
                models <- auto.arima(x, lambda = lambda, xreg = xreg, 
                  parallel = FALSE, ...)
                out$pfcasts <- forecast(models, h = h, xreg = newxreg)$mean
            }

经过一些调试后,发现 HTS 在特定系列上失败了。当我检查该系列时,它针对的是一个产品类别,该类别恰好在整个 60 天内的销售额为 0。当时间序列完全静态时,显然 auto.arima 无法处理外部回归变量。

你可以通过

复制这个
test.data=rep(1,60)
z=as.matrix(rnorm(60,100,20),nrow=60)
fz=as.matrix(rnorm(14,100,20),nrow=14)

#Does not work
fit.bad=auto.arima(test.data,xreg=z)
forecast.bad=forecast(fit.bad,h=14,xreg=fz)
plot(forecast.bad)


#Works
fit.good=auto.arima(test.data)
forecast.good=forecast(fit.good,h=14)
plot(forecast.good)

不管它是什么数字,但是如果时间序列是完全静态的,第一个auto.arima()会给你错误

Error in as.matrix(newxreg) %*% coefs : non-conformable arguments

然而,仅将时间序列中的单个值更改为 2(或任何其他数字)将允许两个 ARIMA 函数正常工作。

这似乎是我关于

的原始问题中的次要错误消息
In cbind(intercept = rep(1, n), xreg) :
  number of rows of result is not a multiple of vector length (arg 1)

...是 HTS 添加的完整的红鲱鱼。错误的根源在于 auto.arima 函数。删除所有具有静态销售的产品系列已解决我的问题。