预测准确性:没有MASE,两个向量作为参数

时间:2012-06-18 23:34:35

标签: r forecasting

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

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

  

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

     

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

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

3 个答案:

答案 0 :(得分:14)

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 

答案 1 :(得分:11)

关于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)
}

答案 2 :(得分:0)

为了帮助自己一点点,我创建了一个计算MASE的函数,如Hyndman等人在“Another look at measures of forecast 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]))))))
}

供参考,见: