【问题标题】:Measuring VAR accuracy using accuracy() from forecast使用预测中的准确度()测量 VAR 准确度
【发布时间】:2013-08-18 18:44:00
【问题描述】:

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

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

代码示例:

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

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

我想使用类似的方法来获得样本外测试的准确性(不完全是这样,因为需要指定预测期):

 accuracy(v$varresult[[1]], window(Canada[,1], start=c(1999,1)))

但 lm 对象不支持此操作并返回错误

 Error in testaccuracy(f, x, test) : Unknown list structure

如果我如下直接使用这些值,我不会得到 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

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

fr<-forecast(v$varresult[[1]], h=8)

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

Error in eval(expr, envir, enclos) : object 'datamat' not found

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

【问题讨论】:

  • 请提供可重现的例子
  • 准确率函数现在可用于时间序列预测和横截面forecasts
  • 我在上面添加了一个代码示例
  • accuracy 中的 ??f 参数仅适用于 Arima、ets 和 lm 对象,如果 x 被省略 - 在这种情况下返回样本内准确度度量。这意味着我们不能有-来自var 包的 v 样本预测。但是,你可以联系forecast包的作者,看看有没有可能。

标签: r time-series forecasting


【解决方案1】:

您为什么不尝试阅读文档。这是关于第一个论点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]))
}

【讨论】:

    猜你喜欢
    • 2021-06-02
    • 2012-01-03
    • 2020-11-06
    • 2020-08-06
    • 1970-01-01
    • 1970-01-01
    • 2018-12-01
    • 2018-10-08
    • 1970-01-01
    相关资源
    最近更新 更多