使用预测准确度()测量VAR准确度

Har*_*rsh 6 r time-series forecasting

我正在尝试使用varsR中的包来学习矢量自回归模型.这个包没有任何方法来测量返回模型的准确性.

具体来说,我想使用R中包中accuracy函数中定义的MASE forecast,将VAR预测与每个组件时间序列上使用Arima模型的预测进行比较(我使用了4个可能相关的时间序列).accuracy无法识别varest返回的对象vars.如何获取每个预测组件的MASE?我想计算样本内和样本外的准确度

代码示例:

library(vars)
library(forecast)
data(Canada)
v<- VAR(window(Canada, end=c(1998,4)), p=2)
accuracy(v$varresult[[1]])
Run Code Online (Sandbox Code Playgroud)

参数accuracy是一个lm对象,并返回系列1的训练精度:

                       ME      RMSE       MAE           MPE      MAPE       MASE
Training set 1.536303e-15 0.3346096 0.2653946 -1.288309e-05 0.0281736 0.03914555
Run Code Online (Sandbox Code Playgroud)

我希望使用类似的东西来获得样本外的测试精度(不完全是这样,因为需要指定预测期):

 accuracy(v$varresult[[1]], window(Canada[,1], start=c(1999,1)))
Run Code Online (Sandbox Code Playgroud)

但是lm对象不支持这种情况并返回错误

 Error in testaccuracy(f, x, test) : Unknown list structure
Run Code Online (Sandbox Code Playgroud)

如果我直接使用这些值如下,我没有得到MASE,它需要有关训练集的信息.这也容易出现一个错误,因为使用了值而不是ts对象,因为它们accuracy将直接匹配存储的时间:

 p<-predict(v, n.ahead=8)
 accuracy(p$fcst[[1]][,"fcst"],window(Canada[,1], start=c(1999,1)))

             ME      RMSE       MAE         MPE       MAPE      ACF1 Theil's U
Test set -0.1058358 0.8585455 0.7385238 -0.01114099 0.07694492 0.5655117  1.359761
Run Code Online (Sandbox Code Playgroud)

理想情况下,我想将其预测为:

fr<-forecast(v$varresult[[1]], h=8)
Run Code Online (Sandbox Code Playgroud)

但这不起作用,因为它需要其他系列进行预测,并给出:

Error in eval(expr, envir, enclos) : object 'datamat' not found
Run Code Online (Sandbox Code Playgroud)

可以尝试复制forecast.Arimaetc 的功能并尝试编写一个forecast.varresult包,但是有更简单的方法吗?

Rob*_*man 10

你为什么不试着阅读文档.以下是关于第一个参数的说法f:

类"预测"的对象,或包含预测的数字向量.如果省略x,它也将与Arima,ets和lm对象一起使用 - 在这种情况下,返回样本内准确度度量.

VAR不会返回"预测"类的对象,但您可以计算包含预测数字向量.

现在阅读第二个参数,x.

一个可选的数字向量,包含与对象长度相同的实际值,或与f的时间重叠的时间序列.

好的,这很简单.只需给它中的实际值x和预测值f.

但是这不会给你MASE在帮助页面的下方,它解释了"MASE计算是使用MAE对非季节性时间序列的样本内天真预测,季节性时间序列的样本季节性天真预测和非时间序列数据的样本内平均预测." 因此,如果没有历史数据,它就无法进行计算,除非您传递"预测"类的对象,否则它将无法了解它们.

然而,不难欺骗它给你想要的东西.这是一些代码:

trainingdata <- window(Canada, end=c(1998,4))
testdata <- window(Canada, start=c(1999,1))
v <- VAR(trainingdata, p=2)
p <- predict(v, n.ahead=8)
res <- residuals(v)
fits <- fitted(v)
for(i in 1:4)
{
  fc <- structure(list(mean=p$fcst[[i]][,"fcst"], x=trainingdata[,i],
     fitted=c(NA,NA,fits[,i])),class="forecast")
  print(accuracy(fc,testdata[,i]))
}
Run Code Online (Sandbox Code Playgroud)