Erreur dans predict.Arima avec newxreg dans boucle

Postez ici vos questions, réponses, commentaires ou suggestions - Les sujets seront ultérieurement répartis dans les archives par les modérateurs

Modérateur : Groupe des modérateurs

michel lutz
Messages : 195
Enregistré le : 15 Juil 2010, 06:42

Erreur dans predict.Arima avec newxreg dans boucle

Messagepar michel lutz » 19 Sep 2011, 14:48

Bonjour à tous,

J'essaie d'écrire un modeste programme pour comparer les résultats en prédiction de 2 modèles, l'un linéaire (lm) et l'autre de type arima avec régresseurs externes (arima).

J'essaie de le faire de façon dynamique, en augmentant séquentiellement la taille de l'échantillon de modélisation et en calculant l'erreur de prévision sur le reste des points (cas d'une série temporelle).

Mon pogramme est le suivant :
xshort est l'échantillon d'apprentissage
xnext celui de prévision

Code : Tout sélectionner

## Reference models
model <-  Y ~ X1 + X2 +X3 + X4
k <- 60 # minimum data length for fitting a model
n <- nrow(D)

mae.lm <- mae.arima <-  matrix(NA,n-k-1)
D <- ts(D, frequency = 1)

for(i in 1:(n-k-1))
{
  xshort <- window(D, end= k+i)
  xnext <- window(D, start= k+(i+1), end= n)
  fit1 <- lm(model, data=xshort)
  fit2 <- arima(xshort[,"Y"],  order = c(1,0,0), xreg = xshort[,2:5], method = "ML", include.mean = FALSE)
  fcast1 <- predict(fit1, newdata = xnext)
  fcast2 <- predict(fit2, newxreg = xnext[,2:5])
  mae.lm[i] <- mean(abs(fcast1-xnext[,"Y"]))
  mae.arima[i] <- mean(abs(fcast2$pred-xnext[,"Y"]))

}


Ca fonctionne pour le modèle linéaire, je récupère une estimation séquentielle du MAE dans mae.lm.

Mais dès que j'intègre le modèle avec arima, j'ai le message d'erreur suivant :

Code : Tout sélectionner

Erreur dans predict.Arima(fit2, newxreg = xnext[, 2:5]) :
'xreg' et 'newxreg' ont des nombres de colonnes différents

Or je ne comprends, dans 'arima' et dans 'predict', j'ai exactement les mêmes indices [,2:5]...

Quelqu'un aurait une idée ??? Je suis un peu confus...

Merci beaucoup

Michel[/code]

michel lutz
Messages : 195
Enregistré le : 15 Juil 2010, 06:42

Messagepar michel lutz » 21 Sep 2011, 10:03

Bonjour,

Désespéré, je me permets de relancer à ce sujet car je crois devenir fou...
xnext et xshort ont exactement la même structure, je n'arrive pas à voir où le logiciel peut détecter une incohérence...

Si a quelqu'un à la moindre piste de réflexion, je lui serais vraiment reconnaissant !

Merci !

Michel

Eric Casellas
Messages : 767
Enregistré le : 06 Jan 2009, 14:59

Messagepar Eric Casellas » 21 Sep 2011, 10:19

Pour pouvoir vous aider plus facilement vous devriez inclure avec votre code des jeux de données (même simplifiés) qui reproduise cette erreur afin que le code soit reproductible chez d'autres...
Eric

michel lutz
Messages : 195
Enregistré le : 15 Juil 2010, 06:42

Messagepar michel lutz » 21 Sep 2011, 11:36

Oui, bien sur.

Voici un extrait du jeu de données.

Code : Tout sélectionner

         Y    X1    X2    X3           X4
  1 900927.7 15135 4323   176.45530     0
  2 912258.7 15631 4519  -113.31342     1
  3 903719.7 15257 4303   445.77068     1
  4 930432.7 14793 4718  1629.97644     0
  5 935177.7 14665 4699  1787.25637     0
  6 890734.7 15213 4449   493.98957     0
  7 870044.7 14727 4164   820.57435     0
  8 885299.7 14874 3774  -423.81057     0
  9 861367.7 14555 4261   438.68513     1
 10 850124.7 15111 4692   507.62591     1
 11 843363.7 14727 4887  1489.32467     0
 12 934837.7 14739 4741  1389.70402     0
 13 896552.7 14928 4665   975.81585     0
 14 920724.7 14934 4607   826.69942     0
 15 898205.7 15234 4745   638.90225     0
 16 906951.7 15042 4193  -251.24832     1
 17 839139.7 14493 4095   504.16795     1
 18 879235.7 14339 4208   978.05345     0
 19 890170.7 14147 3819   608.07765     0
 20 896022.7 14080 4079   831.11957     0


Merci d'avance !

Eric Casellas
Messages : 767
Enregistré le : 06 Jan 2009, 14:59

Messagepar Eric Casellas » 21 Sep 2011, 12:37

le soucis semblerait venir de xnext[,2:5] à qui il manque des éléments par rapport a xnext (1 attr vs 3), et la fonction ncol (qui a priori est utilisée dans la condition qui renvoi l'erreur) ne marche plus pour l'objet xnext[,2:5]

Code : Tout sélectionner

D <- data.frame(list(Y=rnorm(70), X1=rnorm(70), X2=rnorm(70), X3=rnorm(70), X4=rnorm(70)))

## Reference models
model <-  Y ~ X1 + X2 +X3 + X4
k <- 60 # minimum data length for fitting a model
n <- nrow(D)

mae.lm <- mae.arima <-  matrix(NA,n-k-1)
D <- ts(D, frequency = 1)

i <- 9

  xshort <- window(D, end= k+i)
  xnext <- window(D, start= k+(i+1), end= n)
  fit1 <- lm(model, data=xshort)
  fit2 <- arima(xshort[,"Y"],  order = c(1,0,0), xreg = xshort[,2:5], method = "ML", include.mean = FALSE)
  fcast1 <- predict(fit1, newdata = xnext)
  fcast2 <- predict(fit2, newxreg = xnext[,2:5])
  mae.lm[i] <- mean(abs(fcast1-xnext[,"Y"]))
  mae.arima[i] <- mean(abs(fcast2$pred-xnext[,"Y"]))


str(xshort)
str(xnext)
ncol(xshort) == ncol(xnext)

str(xshort[,2:5])
str(xnext[,2:5])
ncol(xshort[,2:5]) == ncol(xnext[,2:5])
Eric

michel lutz
Messages : 195
Enregistré le : 15 Juil 2010, 06:42

Messagepar michel lutz » 21 Sep 2011, 14:02

ok, merci beaucoup pour cette réponse... je crois que j'arrive à visualiser le problème (mais toujours pas à le résoudre !) :

xshort[,2:5] donne :

Code : Tout sélectionner

Time Series:
Start = 1
End = 69
Frequency = 1
             X1           X2          X3           X4
 1  0.207614467 -1.310438023 -1.20451667  0.529951590
 2 -0.545716492  0.983697548 -0.85791605  0.716701542
 3  1.221347204  3.152934941 -2.15878879 -1.099418562
 4 -1.018649165  1.404938369 -0.26678190 -0.025717033
 5  0.408904022 -0.828612059 -0.39354132 -0.251142095
 6 -0.048756517  0.334329893  1.04465112  0.422166406

avec

Code : Tout sélectionner

str(xshort[,2:5])
 mts [1:69, 1:4] 0.208 -0.546 1.221 -1.019 0.409 ...
 - attr(*, "dimnames")=List of 2
  ..$ : NULL
  ..$ : chr [1:4] "X1" "X2" "X3" "X4"
 - attr(*, "tsp")= num [1:3] 1 69 1
 - attr(*, "class")= chr [1:2] "mts" "ts"

et xnext[,2:5]

Code : Tout sélectionner

Time Series:
Start = 70
End = 73
Frequency = 1
         X1          X2          X3          X4
 0.12177438 -0.81980123  0.07535495  1.38675983

avec

Code : Tout sélectionner

str(xnext[,2:5])
 Time-Series [1:4] from 70 to 73: 0.1218 -0.8198 0.0754 1.3868
 - attr(*, "names")= chr [1:4] "X1" "X2" "X3" "X4"


Les deux séries ont l'air d'être construites différemment... Mais comment cela peut-il se faire, alors que j'utilise la fonction window, sur le même jeu de données initial ?

Eric Casellas
Messages : 767
Enregistré le : 06 Jan 2009, 14:59

Messagepar Eric Casellas » 21 Sep 2011, 14:20

Le soucis arrive pour une valeur de i=9 (avec 70 valeurs dans D et k=60)
ceci donne donc
k+(i+1) = 70
avec n= 70
j'imagine que du coup il aime pas avec ces valeurs le

Code : Tout sélectionner

window(D, start= 70, end= 70)
Eric

michel lutz
Messages : 195
Enregistré le : 15 Juil 2010, 06:42

Messagepar michel lutz » 21 Sep 2011, 14:45

argh.... oui, je viens de réaliser qu'en fait, le programme fonctionne, sauf pour la dernière valeur, pour la raison que vous venez de souligner !

J'avais cru que du fait de l'erreur, les tableau mae.lm et mal.arima n'étaient pas remplis... mais en fait ils le sont, donc j'ai bien les résultats attendus !

Merci beaucoup de m'avoir éclairé, j'aurais pu tourner en rond pendant des heures encore !!!

bonne soirée,

Michel


Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité