2012-06-18 19 views
5

Estoy usando la función accuracy del paquete forecast, para calcular medidas de precisión. Lo estoy usando para calcular medidas para modelos ajustados de series temporales, como ARIMA o suavizado exponencial. Como estoy probando diferentes tipos de modelos en diferentes dimensiones y niveles de agregación, estoy usando MASE, error de escala absoluta media, presentado por Hyndman et al (2006, "Otra mirada a las medidas de precisión del pronóstico"), para comparar diferentes modelos en diferentes niveles.Precisión del pronóstico: no MASE con dos vectores como argumentos

Ahora también estoy comparando modelos con el historial de pronósticos. Como solo tengo los valores de pronóstico y no los modelos, traté de usar la función accuracy. En la función de descripción se menciona que también se permite proporcionar dos argumentos vector, uno con valores de pronóstico y una con datos reales, para calcular las medidas (en lugar de un modelo ajustado):

f: Un objeto de la clase "pronóstico", o un vector numérico que contiene pronósticos. Es también funcionará con Arima, ets y objetos lm si se omite x - en cuyo caso se devuelven las medidas de precisión en la muestra .

x: Un vector numérico opcional que contiene valores reales de la misma longitud que el objeto .

Pero me sorprendió el hecho de que se devuelvan todas las medidas, espere el MASE. Entonces, me preguntaba si alguien sabe cuál es la razón para eso. ¿Por qué no se devuelve el MASE, mientras se usan dos vectores como argumentos en la función accuracy?

Respuesta

11

El MASE requiere los datos históricos para calcular el factor de escala. Es no calculado a partir de los datos futuros como en la respuesta por @FBE. Por lo tanto, si no pasa los datos históricos al accuracy(), el MASE no se puede calcular. Por ejemplo,

> 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 

Pero si se pasa todo el fcast objeto (que incluye los datos históricos), se obtiene

> 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

Es posible pasar objetos que no sean un objeto 'forecast' para obtener la predicción MASE. Por ejemplo, quiero usar el paquete 'vars' para hacer predicciones y calcular el MASE. Consulte la pregunta relacionada: http://stackoverflow.com/questions/18244506/measuring-var-accuracy-using-accuracy-from-forecast – Harsh

+0

Dr. Hyndman. Gracias por su trabajo en la previsión de series de tiempo.Por favor, evalúe mi respuesta para encontrar MASE sin usar el objeto de la clase 'pronóstico'. ¡Sería genial si pudieras incorporarlo dentro de tu paquete también! –

+0

Dr. Hyndman, ¿es posible obtener la métrica de error MASE para los datos del conjunto de prueba (formato ts) con los datos reales? – mike

0

Para ayudarme a mí mismo un poco, creé una función para calcular el MASE, según lo descrito por Hyndman et al en "Otra mirada a las medidas de la precisión del pronóstico" (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])))))) 
} 

Como referencia, ver:

10

El documento sobre MASE explica claramente cómo llegar a ella (incluso para los no tiempo -series data)

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

Esta es una función muy útil +1 – forecaster

+0

¿Hay alguna manera de usar la función en caso de que tenga datos de temporada con más de una temporada? P.ej. datos diarios con un patrón entre semana (7) y un patrón anual (365). – RandomDude

Cuestiones relacionadas