我试图在我的预测中传递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个日期值。没有NAs或缺少数据。CSV有2,520个数据行,等于60x42。CSV文件结构与从上述代码创建的数据帧相同。
我遗漏了什么??
更新
为了在Excel中尝试,我用随机数替换了SalesNetAmount & TotalViews,重新分配了CSV,没有运行R脚本的问题。我试着重放原来的CSV,因为-但是再次遇到错误。让我相信这些数字是我问题的根源。一些产品线的销售/流量非常少,所以有相当多的0,但我尝试添加1到整个数据集的非零值,而且错误仍然存在。
发布于 2015-03-20 21:56:03
我解决了直接的问题,所以这是技术上的答案,但我不完全明白为什么。
我仔细阅读了HTS代码中有关使用trace()函数的内容,发现了引起问题的行:
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)...was是由HTS添加的一种完全的红鲱鱼。错误的根源在于auto.arima函数。删除所有产品系列的静态销售已经解决了我的问题。
发布于 2015-03-06 23:49:46
检查z和fz的类。您的模拟数据使用了工作良好的矩阵。
还检查z和fz的尺寸。它们应该有相同的列数,fz应该有与days相同的行数。
https://stackoverflow.com/questions/28908371
复制相似问题