我正在尝试使用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 others,accuracy()
函数不会使用两个向量作为参数来计算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
我有两个问题:
accuracy()
函数使用横截面数据计算MASE而无需编写函数?答案 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)
forecast
和ytest
都是请求的数字向量。但是不会生成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