首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法将xreg值传递给hts预测

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

Stack Overflow用户
提问于 2015-03-06 21:57:30
回答 2查看 3.6K关注 0票数 0

我试图在我的预测中传递xreg参数,但始终遇到一个错误,即:

代码语言:javascript
复制
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文件时,我得到了上面的错误。

代码语言:javascript
复制
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到整个数据集的非零值,而且错误仍然存在。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-03-20 21:56:03

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

我仔细阅读了HTS代码中有关使用trace()函数的内容,发现了引起问题的行:

代码语言:javascript
复制
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无法处理外部回归器。

您可以通过以下方式复制这个

代码语言:javascript
复制
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()将给出错误

代码语言:javascript
复制
Error in as.matrix(newxreg) %*% coefs : non-conformable arguments

然而,只将时间序列中的单个值更改为2(或任何其他数字),这两个ARIMA函数都可以很好地工作。

在我最初的问题中,似乎是次要的错误信息

代码语言:javascript
复制
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函数。删除所有产品系列的静态销售已经解决了我的问题。

票数 1
EN

Stack Overflow用户

发布于 2015-03-06 23:49:46

检查zfz的类。您的模拟数据使用了工作良好的矩阵。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28908371

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档