Comment faire des prévisions avec détection de valeurs aberrantes dans R? - Procédure et méthode d'analyse des séries chronologiques

16

J'ai des données mensuelles sur les séries chronologiques et je voudrais faire des prévisions avec détection des valeurs aberrantes.

Voici l'exemple de mon ensemble de données:

       Jan   Feb   Mar   Apr   May   Jun   Jul   Aug   Sep   Oct   Nov   Dec
2006  7.55  7.63  7.62  7.50  7.47  7.53  7.55  7.47  7.65  7.72  7.78  7.81
2007  7.71  7.67  7.85  7.82  7.91  7.91  8.00  7.82  7.90  7.93  7.99  7.93
2008  8.46  8.48  9.03  9.43 11.58 12.19 12.23 11.98 12.26 12.31 12.13 11.99
2009 11.51 11.75 11.87 11.91 11.87 11.69 11.66 11.23 11.37 11.71 11.88 11.93
2010 11.99 11.84 12.33 12.55 12.58 12.67 12.57 12.35 12.30 12.67 12.71 12.63
2011 12.60 12.41 12.68 12.48 12.50 12.30 12.39 12.16 12.38 12.36 12.52 12.63

J'ai fait référence à la procédure et aux méthodes d'analyse Timeseries utilisant R , pour faire une série de modèles de prévision différents, mais cela ne semble pas être exact. De plus, je ne sais pas trop comment y incorporer les tsoutliers.

J'ai un autre post concernant ma demande de tsoutliers et de modélisation et de procédure arima ici .

Voici donc mon code actuellement, qui est similaire au lien n ° 1.

Code:

product<-ts(product, start=c(1993,1),frequency=12)

#Modelling product Retail Price

#Training set
product.mod<-window(product,end=c(2012,12))
#Test set
product.test<-window(product,start=c(2013,1))
#Range of time of test set
period<-(end(product.test)[1]-start(product.test)[1])*12 + #No of month * no. of yr
(end(product.test)[2]-start(product.test)[2]+1) #No of months
#Model using different method
#arima, expo smooth, theta, random walk, structural time series
models<-list(
#arima
product.arima<-forecast(auto.arima(product.mod),h=period),
#exp smoothing
product.ets<-forecast(ets(product.mod),h=period),
#theta
product.tht<-thetaf(product.mod,h=period),
#random walk
product.rwf<-rwf(product.mod,h=period),
#Structts
product.struc<-forecast(StructTS(product.mod),h=period)
)

##Compare the training set forecast with test set
par(mfrow=c(2, 3))
for (f in models){
    plot(f)
    lines(product.test,col='red')
}

##To see its accuracy on its Test set, 
#as training set would be "accurate" in the first place
acc.test<-lapply(models, function(f){
    accuracy(f, product.test)[2,]
})
acc.test <- Reduce(rbind, acc.test)
row.names(acc.test)<-c("arima","expsmooth","theta","randomwalk","struc")
acc.test <- acc.test[order(acc.test[,'MASE']),]

##Look at training set to see if there are overfitting of the forecasting
##on training set
acc.train<-lapply(models, function(f){
    accuracy(f, product.test)[1,]
})
acc.train <- Reduce(rbind, acc.train)
row.names(acc.train)<-c("arima","expsmooth","theta","randomwalk","struc")
acc.train <- acc.train[order(acc.train[,'MASE']),]

 ##Note that we look at MAE, MAPE or MASE value. The lower the better the fit.

Ceci est l'intrigue de mes différentes prévisions, qui ne semble pas très fiable / précise, à travers la comparaison de l'ensemble de test rouge et de l'ensemble prévisionnel bleu. Tracé de prévisions différentes Prévisions différentes

Précision différente des modèles respectifs de test et de formation

Test set
                    ME      RMSE       MAE        MPE     MAPE      MASE      ACF1 Theil's U
theta      -0.07408833 0.2277015 0.1881167 -0.6037191 1.460549 0.2944165 0.1956893 0.8322151
expsmooth  -0.12237967 0.2681452 0.2268248 -0.9823104 1.765287 0.3549976 0.3432275 0.9847223
randomwalk  0.11965517 0.2916008 0.2362069  0.8823040 1.807434 0.3696813 0.4529428 1.0626775
arima      -0.32556886 0.3943527 0.3255689 -2.5326397 2.532640 0.5095394 0.2076844 1.4452932
struc      -0.39735804 0.4573140 0.3973580 -3.0794740 3.079474 0.6218948 0.3841505 1.6767075

Training set
                     ME      RMSE       MAE         MPE     MAPE      MASE    ACF1 Theil's U
theta      2.934494e-02 0.2101747 0.1046614  0.30793753 1.143115 0.1638029  0.2191889194        NA
randomwalk 2.953975e-02 0.2106058 0.1050209  0.31049479 1.146559 0.1643655  0.2190857676        NA
expsmooth  1.277048e-02 0.2037005 0.1078265  0.14375355 1.176651 0.1687565 -0.0007393747        NA
arima      4.001011e-05 0.2006623 0.1079862 -0.03405395 1.192417 0.1690063 -0.0091275716        NA
struc      5.011615e-03 1.0068396 0.5520857  0.18206018 5.989414 0.8640550  0.1499843508        NA

D'après la précision des modèles, nous pouvons voir que le modèle le plus précis serait le modèle thêta. Je ne sais pas pourquoi la prévision est très imprécise, et je pense que l'une des raisons serait que je n'ai pas traité les "valeurs aberrantes" dans mon ensemble de données, ce qui entraîne une mauvaise prévision pour tous les modèles.

Ceci est mon intrigue aberrante

Parcelle des valeurs aberrantes Valeurs aberrantes

sortie tsoutliers

ARIMA(0,1,0)(0,0,1)[12]                    

Coefficients:
        sma1    LS46    LS51    LS61    TC133   LS181   AO183   AO184   LS185   TC186    TC193    TC200
      0.1700  0.4316  0.6166  0.5793  -0.5127  0.5422  0.5138  0.9264  3.0762  0.5688  -0.4775  -0.4386
s.e.  0.0768  0.1109  0.1105  0.1106   0.1021  0.1120  0.1119  0.1567  0.1918  0.1037   0.1033   0.1040
       LS207    AO237    TC248    AO260    AO266
      0.4228  -0.3815  -0.4082  -0.4830  -0.5183
s.e.  0.1129   0.0782   0.1030   0.0801   0.0805

sigma^2 estimated as 0.01258:  log likelihood=205.91
AIC=-375.83   AICc=-373.08   BIC=-311.19

 Outliers:
    type ind    time coefhat  tstat
1    LS  46 1996:10  0.4316  3.891
2    LS  51 1997:03  0.6166  5.579
3    LS  61 1998:01  0.5793  5.236
4    TC 133 2004:01 -0.5127 -5.019
5    LS 181 2008:01  0.5422  4.841 
6    AO 183 2008:03  0.5138  4.592
7    AO 184 2008:04  0.9264  5.911
8    LS 185 2008:05  3.0762 16.038
9    TC 186 2008:06  0.5688  5.483
10   TC 193 2009:01 -0.4775 -4.624
11   TC 200 2009:08 -0.4386 -4.217
12   LS 207 2010:03  0.4228  3.746
13   AO 237 2012:09 -0.3815 -4.877
14   TC 248 2013:08 -0.4082 -3.965
15   AO 260 2014:08 -0.4830 -6.027
16   AO 266 2015:02 -0.5183 -6.442

Je voudrais savoir comment puis-je "analyser" / prévoir davantage mes données, avec ces ensembles de données pertinents et la détection des valeurs aberrantes, etc. S'il vous plaît, aidez-moi également à traiter mes valeurs aberrantes pour faire mes prévisions

Enfin, je voudrais savoir comment combiner les différentes prévisions de modèle ensemble, comme ce que @forecaster avait mentionné dans le lien n ° 1, la combinaison des différents modèles se traduira très probablement par une meilleure prévision / prédiction.

ÉDITÉ

Je voudrais intégrer les valeurs aberrantes dans d'autres modèles sont bien.

J'ai essayé quelques codes, par exemple.

forecast.ets( res$fit ,h=period,xreg=newxreg)
Error in if (object$components[1] == "A" & is.element(object$components[2], : argument is of length zero

forecast.StructTS(res$fit,h=period,xreg=newxreg)
Error in predict.Arima(object, n.ahead = h) : 'xreg' and 'newxreg' have different numbers of columns

Il y a quelques erreurs produites et je ne suis pas sûr du code correct pour incorporer les valeurs aberrantes comme régresseurs. De plus, comment puis-je travailler avec thetaf ou rwf, car il n'y a ni prévision.thêta ni prévision.rwf?

Ted
la source
1
Vous devriez peut-être adopter une autre approche pour obtenir de l'aide, car une réédition continue ne semble pas fonctionner
IrishStat
Je suis d'accord avec @irishstat, les deux réponses ci-dessous fournissent une réponse directe à votre question et semblent avoir reçu peu d'attention.
prévisionniste du
Essayez de lire la documentation des fonctions spécifiques qui vous donne des erreurs, ETS et thetaf n'ont pas la capacité de gérer les régresseurs.
prévisionniste

Réponses:

7

Cette réponse est également liée aux points 6 et 7 de votre autre question .

Les valeurs aberrantes sont comprises comme des observations qui ne sont pas expliquées par le modèle, de sorte que leur rôle dans les prévisions est limité en ce sens que la présence de nouvelles valeurs aberrantes ne sera pas prédite. Tout ce que vous devez faire est d'inclure ces valeurs aberrantes dans l'équation de prévision.

Dans le cas d'une valeur aberrante additive (qui affecte une seule observation), la variable contenant cette valeur aberrante sera simplement remplie de zéros, puisque la valeur aberrante a été détectée pour une observation dans l'échantillon; dans le cas d'un décalage de niveau (un changement permanent des données), la variable sera remplie de variables afin de conserver le décalage dans les prévisions.


Ensuite, je montre comment obtenir des prévisions en R sur un modèle ARIMA avec les valeurs aberrantes détectées par les «tsoutliers». La clé est de définir correctement l'argument newxregqui est passé àpredict .

(Ceci est uniquement pour illustrer la réponse à votre question sur la façon de traiter les valeurs aberrantes lors de la prévision, je ne traite pas la question de savoir si le modèle résultant ou les prévisions sont la meilleure solution.)

require(tsoutliers)
x <- c(
  7.55,  7.63,  7.62,  7.50,  7.47,  7.53,  7.55,  7.47,  7.65,  7.72,  7.78,  7.81,
  7.71,  7.67,  7.85,  7.82,  7.91,  7.91,  8.00,  7.82,  7.90,  7.93,  7.99,  7.93,
  8.46,  8.48,  9.03,  9.43, 11.58, 12.19, 12.23, 11.98, 12.26, 12.31, 12.13, 11.99,
 11.51, 11.75, 11.87, 11.91, 11.87, 11.69, 11.66, 11.23, 11.37, 11.71, 11.88, 11.93,
 11.99, 11.84, 12.33, 12.55, 12.58, 12.67, 12.57, 12.35, 12.30, 12.67, 12.71, 12.63,
 12.60, 12.41, 12.68, 12.48, 12.50, 12.30, 12.39, 12.16, 12.38, 12.36, 12.52, 12.63)
x <- ts(x, frequency=12, start=c(2006,1))
res <- tso(x, types=c("AO","LS","TC"))

# define the variables containing the outliers for
# the observations outside the sample
npred <- 12 # number of periods ahead to forecast 
newxreg <- outliers.effects(res$outliers, length(x) + npred)
newxreg <- ts(newxreg[-seq_along(x),], start = c(2012, 1))

# obtain the forecasts
p <- predict(res$fit, n.ahead=npred, newxreg=newxreg)

# display forecasts
plot(cbind(x, p$pred), plot.type = "single", ylab = "", type = "n", ylim=c(7,13))
lines(x)
lines(p$pred, type = "l", col = "blue")
lines(p$pred + 1.96 * p$se, type = "l", col = "red", lty = 2)  
lines(p$pred - 1.96 * p$se, type = "l", col = "red", lty = 2)  
legend("topleft", legend = c("observed data", 
  "forecasts", "95% confidence bands"), lty = c(1,1,2,2), 
  col = c("black", "blue", "red", "red"), bty = "n")

prévisions

Éditer

La fonction predicttelle qu'elle est utilisée ci - dessus des prévisions de retours sur la base du modèle ARIMA choisi, ARIMA (2,0,0) stockés dans res$fitet la détection des valeurs aberrantes, res$outliers. Nous avons une équation modèle comme celle-ci:

yt=j=1mωjLj(B)jet(tj)+θ(B)ϕ(B)α(B)ϵt,ϵtNje(0,σ2),

Ljjtsoutliersjet

javlacalle
la source
vous avez donc ajouté des valeurs aberrantes à l'argument "newxreg". Est-ce que cela s'appelle le régresseur? Puis-je connaître l'utilisation du régresseur? De plus, grâce à l'utilisation du régresseur dans la fonction "prédire", utilise-t-il encore ARIMA? ou c'est une méthode de prévision différente? Merci beaucoup pour votre aide dans l'utilisation des tsoutliers. = D
Ted
est-il possible d'incorporer les valeurs aberrantes comme régresseur à utiliser dans la prévision dans d'autres modèles également? comme le modèle structurel de base, Theta, Random Walk et etc?
Ted
@Ted Oui, les prévisions sont basées sur un modèle ARMA. J'ai modifié ma réponse avec quelques détails à ce sujet.
javlacalle
Vous pouvez également incorporer des variables de régresseur contenant des effets tels que des changements de niveau, des valeurs aberrantes additives, ... dans d'autres modèles, par exemple, marche aléatoire, modèle de séries chronologiques structurelles, ... devrait probablement le poser dans un autre article et déterminer si la question convient mieux à d'autres sites comme stackoverflow .
javlacalle
Ah d'accord. Une autre question serait, savez-vous s'il y a une différence entre l'utilisation de la prévision et de la prévision ? S'il y en a, quelle est la différence
Ted
2

L'utilisation d'un logiciel que j'ai aidé à développer un modèle raisonnable pour vos 72 observations inclurait une transformation de puissance (journaux) car la variance d'erreur est liée à la valeur attendue. Cela est également assez évident à partir de l'intrigue originale où l'œil peut détecter une variance accrue au niveau supérieur. entrez la description de l'image iciavec actual.fit/forecast entrez la description de l'image iciet un tracé des entrez la description de l'image icirésidus finaux . Notez les limites de confiance plus réalistes en tenant compte de la transformation de puissance. Bien que cette réponse n'utilise pas R, elle élève la barre quant à ce qu'un modèle raisonnable utilisant R pourrait inclure.

IrishStat
la source