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é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
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?
Réponses:
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
newxreg
qui 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.)
Éditer
La fonction
predict
telle 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 dansres$fit
et la détection des valeurs aberrantes,res$outliers
. Nous avons une équation modèle comme celle-ci:tsoutliers
la source
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. avec actual.fit/forecast et un tracé des ré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.
la source