8

我正在使用包中的accuracy函数forecast来计算精度度量。我用它来计算拟合时间序列模型的度量,例如 ARIMA 或指数平滑。当我在不同维度和聚合级别上测试不同的模型类型时,我正在使用由 Hyndman 等人(2006 年,“另一个看预测准确性的衡量标准”)引入的 MASE(平均绝对比例误差)来比较不同的模型在不同的层面上。

现在我还将模型与预测历史进行比较。由于我只有预测值而不是模型,因此我尝试使用该accuracy功能。在函数描述中提到,还允许提供两个向量参数,一个带有预测值,一个带有实际值,以计算度量(而不是拟合模型):

f:“预测”类的对象,或包含预测的数值向量。如果 x 被省略,它也适用于 Arima、ets 和 lm 对象——在这种情况下,将返回样本内准确度度量。

x:一个可选的数值向量,包含与对象长度相同的实际值。

但令我惊讶的是,所有措施都返回了,期待 MASE。所以我想知道是否有人知道这是什么原因?为什么在函数中使用两个向量作为参数时不返回 MASE accuracy

4

3 回答 3

15

MASE 需要历史数据来计算比例因子。它不是像@FBE 的答案那样从未来的数据中计算出来的。因此,如果您不将历史数据传递给accuracy(),则无法计算 MASE。例如,

> library(forecast)
> fcast <- snaive(window(USAccDeaths,end=1977.99))
> accuracy(fcast$mean,USAccDeaths)
         ME        RMSE         MAE         MPE        MAPE        ACF1 
225.1666667 341.1639391 259.5000000   2.4692164   2.8505546   0.3086626 
  Theil's U 
  0.4474491 

但是如果你传递整个fcast对象(包括历史数据),你会得到

> accuracy(fcast,USAccDeaths)
         ME        RMSE         MAE         MPE        MAPE        MASE 
225.1666667 341.1639391 259.5000000   2.4692164   2.8505546   0.5387310 
       ACF1   Theil's U 
  0.3086626   0.4474491 
于 2013-04-22T23:25:58.407 回答
13

关于 MASE 的论文清楚地解释了如何找到它(即使对于非时间序列数据)

computeMASE <- function(forecast,train,test,period){

  # forecast - forecasted values
  # train - data used for forecasting .. used to find scaling factor
  # test - actual data used for finding MASE.. same length as forecast
  # period - in case of seasonal data.. if not, use 1

  forecast <- as.vector(forecast)
  train <- as.vector(train)
  test <- as.vector(test)

  n <- length(train)
  scalingFactor <- sum(abs(train[(period+1):n] - train[1:(n-period)])) / (n-period)

  et <- abs(test-forecast)
  qt <- et/scalingFactor
  meanMASE <- mean(qt)
  return(meanMASE)
}
于 2014-12-29T14:21:41.217 回答
0

为了帮助自己一点,我创建了一个函数来计算 MASE,正如 Hyndman 等人在“Another look at measure of predict accuracy”(2006)中所描述的那样。

calculateMASE <- function(f,y) { # f = vector with forecasts, y = vector with actuals
    if(length(f)!=length(y)){ stop("Vector length is not equal") }
    n <- length(f)
    return(mean(abs((y - f) / ((1/(n-1)) * sum(abs(y[2:n]-y[1:n-1]))))))
}

供参考,请参阅:

于 2012-06-18T23:34:35.533 回答