无法将xreg值传递给ARIMA预测

时间:2015-03-06 21:57:31

标签: r time-series forecasting

我正在尝试在我的预测中传递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)

我不理解错误消息。由于我无法发布原始数据,因此我在下面的代码中创建了一组模拟数据。出于某种原因,模拟数据工作正常。当我注释掉临时行并使用我的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&amp;具有随机数的TotalView,重新保存CSV并且在运行R脚本时没有问题。我尝试重新保存原始CSV但是再次遇到错误。让我相信数字是我问题的根源。有些产品线的销售/流量非常少,所以有相当多的0,但我尝试在整个数据集中添加1非零值,但错误仍然存​​在。

2 个答案:

答案 0 :(得分:0)

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

同时检查zfz的尺寸。它们应具有相同数量的列,fz应与days具有相同的行数。

答案 1 :(得分:0)

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

我在使用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函数。删除静态销售的所有产品系列已解决了我的问题。