2016-07-09 2 views
0

J'ai un objet de série temporelle calc_visit_ts. Je souhaite appliquer le modèle de série temporelle le mieux adapté en fonction de la valeur MAPE pour chaque modèle. Le problème auquel je suis confronté est que le modèle multiplicatif HOLT-WINTER de valeur MAPE ne peut pas être calculé de la même manière que les autres modèles (car il me donne une valeur MAPE différente par rapport à summary(visit_model_Hw_M)).Application de différents modèles de séries chronologiques (ARIMA, HOLT-WINTER) sur la base de MAPE

#### AUTO-ARIMA 
visit_model_Arima <- auto.arima(calc_visit_ts) 
# summary(visit_model_Arima) 

#### HOLT-WINTER ADDITIVE 
visit_model_Hw_A <- hw(calc_visit_ts,h=monthly_prediction,seasonal = "additive") 
# summary(visit_model_Hw_A) 

#### HOLT-WINTER MULTIPLICATIVE 
visit_model_Hw_M <- hw(calc_visit_ts,h=monthly_prediction,seasonal = "multiplicative") 
# summary(visit_model_Hw_M) 


#### Calculating MAPE on models for best suit 
model_Mape<- c(MAPE_model(visit_model_Arima) 
       ,MAPE_model(visit_model_Hw_A)) 
       #,MAPE_model(visit_model_Hw_M)) this is not accurate 

model_Mape=na.omit(model_Mape) 
token<-which(min(model_Mape)==model_Mape) 

if(length(token)>0) 
{ 
    if(token==1) 
    {visit_model<-visit_model_Arima 
    }else if(token==2) 
    {visit_model<-visit_model_Hw_A 
    }else if(token==3) 
    {visit_model<-visit_model_Hw_M 
    }else 
    { 
    ##EXCEPTION HANDLING 
    } 
} 

summary(visit_model) 

Et voici la fonction -je utiliser pour effectuer le calcul MAPE sur les modèles -

MAPE_model <- function(visit_model) { 
#CHECK FOR ZERO CONDIITION if(visit_model$x!=0) 
mape = mean(abs(visit_model$residuals)/visit_model$x) 
return(mape) 
} 

données pour les séries chronologiques -

calc_visit_ts 
    Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec 
2012   35 53 65 60 64 49 63 55 59 66 
2013 62 54 77 67 84 62 82 65 59 67 60 67 
2014 73 75 55 76 93 96 89 76 88 65 83 82 
2015 76 72 75 94 91 83 72 73 80 83 81 81 
2016 97 91 90 80 101 98 

dput(calc_visit_ts) 
structure(c(35, 53, 65, 60, 64, 49, 63, 55, 59, 66, 62, 54, 77, 
67, 84, 62, 82, 65, 59, 67, 60, 67, 73, 75, 55, 76, 93, 96, 89, 
76, 88, 65, 83, 82, 76, 72, 75, 94, 91, 83, 72, 73, 80, 83, 81, 
81, 97, 91, 90, 80, 101, 98), .Tsp = c(2012.16666666667, 2016.41666666667, 
12), class = "ts") 

Pour montrer exactement ce que je moyenne -

Holt-Winter Additif Terrain

Holt-Winter Additive Plot

Holt-Winter multiplicatif Terrain Holt-Winter Multiplicative Plot

La question est summary(visit_model_Hw_M) donne MAPE = 9.075097 alors que, MAPE_model(visit_model_Hw_M) donne 0.001273087 parce que le modèle multiplicatif correspond à la courbe (points de données) en utilisant visit_model_Hw_M$residuals n'est pas un moyen approprié de calculer le MAPE (car la fonction essaie de s'adapter à la courbe).

Existe-t-il un moyen de récupérer la valeur MAPE pour HOLT-WINTER multiplicatif à partir du résumé lui-même? OU un moyen d'estimer correctement la valeur MAPE pour le modèle multiplicatif HOLT-HIVER?

+0

Veuillez fournir l'objet de données en utilisant 'dput' ou reconstruire la question en utilisant des données intégrées afin que vous ayez un MCVE http://stackoverflow.com/help/mcve –

+0

Ajouté les données . Désolé était pressé. –

+0

Merci! Pas de soucis. BTW si vous utilisez 'dput' alors cela nous permet de le copier dans nos sessions R, c'est-à-dire' dput (calc_visit_ts) '. Parfois, nous pouvons charger les données à partir du presse-papiers, mais pas quand il manque des points de données comme celui-ci. –

Répondre

0

Après de longues délibérations sur les données et de tâtonnements, je trouve que la MAPE pour ARIMA et Holt-Winter modèles sont calculés différemment -

MAPE_model <- function(visit_model,model_type) { 
if(model_type == "ARIMA") 
    mape = mean(abs(visit_model$residuals)/visit_model$x) 
if(model_type == "HW") 
    mape = mean(abs(visit_model$x - visit_model$fitted)/visit_model$x) 
else 
    mape = -1 #Something 
return(mape) 
} 

Alors que la notation visit_model$x - visit_model$fitted est canoniquement équivalente à visit_model$residuals dans le ARIMA et Holt-Winter(additive) il ce n'est pas le cas dans le modèle Holt-Winter(multiplicative). Par conséquent, la distinction par model_type