使用R中的横截面(非时间序列)数据计算MASE

时间:2015-07-03 02:57:17

标签: r prediction forecasting

我正在尝试使用R中的横截面(非时间序列)数据的平均绝对比例误差(MASE)计算预测的准确性。我有一个预测值向量和一个观测值向量。据Rob Hyndman所说,MASE is suitable for non-time series data。根据Hyndman的教科书for calculating MASE with cross-sectional data, errors should be scaled relative to the mean forecast。我尝试使用accuracy()包的forecast函数计算MASE,根据its documentation,使用样本内平均预测来计算非时间序列数据中的错误。但是,as noted by othersaccuracy()函数不会使用两个向量作为参数来计算MASE,因为它需要历史数据来计算缩放因子。如果我有时间序列数据,我可以创建一个预测对象并将其传递给accuracy(),但我不确定如何使用横截面数据。

这是我尝试根据Hyndman's formula for scaling errors in cross-sectional data创建一个计算MASE的函数:

computeMASE <- function(forecast, actual){
  mydata <- data.frame(na.omit(cbind(forecast, actual)))
  n <- nrow(mydata)

  scalingFactor <- mean(mydata$forecast)
  errors <- mydata$actual - mydata$forecast
  scaledErrors <- errors/(sum(abs(mydata$actual - scalingFactor)) / n)

  MASE <- mean(abs(scaledErrors))
  return(MASE)
}

这是一个小例子:

set.seed(33333)
observedValues <- rnorm(1000)
forecastedValues <- observedValues + rnorm(1000, sd=.5)

observedValues[sample(1:1000, 10)] <- NA
forecastedValues[sample(1:1000, 10)] <- NA

computeMASE(forecast = forecastedValues, actual = observedValues)
[1] 0.5147389

我不清楚我想将lm模型传递给accuracy()因为我的预测值向量包含预测值,而不是我用于生成预测的预测值的值值。实际上,当我将两个向量作为参数而不是lm模型传递时,准确度估计值会有所不同:

round(accuracy(f=forecastedValues, x=observedValues), 2)
         ME RMSE  MAE    MPE   MAPE
Test set  0 0.51 0.41 -55.62 259.12

round(accuracy(f=lm(observedValues ~ forecastedValues)), 2)
             ME RMSE  MAE    MPE   MAPE MASE
Training set  0 0.44 0.35 -20.87 203.64 0.44

我的函数在从accuracy()模型传递预测时,使用与lm相同的值计算MASE:

computeMASE(forecast = predict(lm(observedValues ~ forecastedValues, na.action=na.exclude)), actual = observedValues)
[1] 0.4413931

accuracy(f=lm(observedValues ~ forecastedValues))
                   ME      RMSE       MAE       MPE     MAPE      MASE
Training set 2.014282e-17 0.4388396 0.3488355 -20.86792 203.6389 0.4413931

我有两个问题:

  1. 根据Hyndman's formula
  2. ,根据横截面数据,我的函数是否正确用于计算MASE?
  3. 是否有更简单的方法使用accuracy()函数使用横截面数据计算MASE而无需编写函数?

1 个答案:

答案 0 :(得分:3)

帮助文件说它有效。你不相信吗?

# Generate some artificial training and test data
x <- 1:100
y <- 5 + .1*x + rnorm(100)
xtrain <- sample(x, size=80)
ytrain <- y[xtrain]
xtest <- x[-xtrain]
ytest <- y[-xtrain]

# Compute forecasts from a linear model
forecast <- predict(lm(ytrain~xtrain), newdata=data.frame(xtrain=xtest))

# Plot training data, test data and forecasts
plot(xtrain, ytrain)
lines(xtest,forecast,col='red',pch=19)
points(xtest,ytest,col='blue',pch=19)

# Compute accuracy statistics
accuracy(forecast,ytest)

forecastytest都是请求的数字向量。但是不会生成MASE,因为MASE基于从 training 数据计算的缩放因子。因此,如果您还未将训练数据传递给accuracy,则要求MASE是没有意义的。最简单的方法是传递整个预测对象:

forecast <- forecast(lm(ytrain~xtrain), newdata=data.frame(xtrain=xtest))
accuracy(forecast,ytest)

forecast对象不仅包含未来期间的点预测。它还包含培训数据,不确定性估计等。

如果您不想使用lm进行预测,则必须自行设置预测对象,至少包含点预测(mean),insample fits({ {1}})和培训回复(fitted)。像这样:

x