2012-06-18 72 views
5

我使用forecast軟件包中的accuracy函數來計算精度度量。我正在使用它來計算擬合的時間序列模型的度量,例如ARIMA或指數平滑。 當我在不同維度和聚合水平上測試不同的模型類型時,我使用Hyndman等人(2006年,「另一種預測準確度度量」)介紹的MASE,平均絕對縮放誤差,以比較不同的不同級別的模型。預測準確性:無兩個矢量作爲參數的MASE

現在我還在比較模型和預測歷史記錄。由於我只有預測值而不是模型,因此我嘗試使用accuracy函數。在功能說明中提到,它也被允許提供兩個向量參數,一個與預測值和一個與實際值,以計算測量(而不是擬合模型):

F:類的對象「預測」或包含預測的數字矢量。如果省略x, 也將與Arima,ets和lm對象一起使用 - 在這種情況下,將返回 樣本內精度度量。

x:包含與 對象相同長度的實際值的可選數字向量。

但我很驚訝的是,所有的措施都返回,期待MASE。所以我想知道是否有人知道這是什麼原因?爲什麼MASE不會返回,而在accuracy函數中使用兩個向量作爲參數?

回答

11

的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 
+0

是否可以傳遞預測對象以外的對象來獲取MASE預測。例如,我想用'vars'包做預測並計算MASE。看到相關的問題:http://stackoverflow.com/questions/18244506/measuring-var-accuracy-using-accuracy-from-forecast – Harsh

+0

博士Hyndman。感謝您在時間序列預測方面的工作。請評估我的答案,找到未使用'預測'類對象的MASE。如果你可以將它合併到你的軟件包中,這將是一件好事! –

+0

Dr. Hyndman,是否有可能通過實際數據獲得測試集(ts格式)數據的MASE誤差度量? – mike

0

爲了幫助自己一點點,我創建了一個函數來計算MASE,如Hyndman等人在「預測準確度的另一種測量方法」(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])))))) 
} 

爲了參考,見:

10

上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) 
} 
+0

這是非常有用的功能+1 – forecaster

+0

如果我有多個季節的季節數據,有沒有辦法使用該功能?例如。具有周日模式(7)和每年模式(365)的每日數據。 – RandomDude

相關問題