Différencier (indéfiniment) les séries temporelles ?

Dans un mail, un étudiant qui finissait son projet de séries temporelles m’a posé une question simple et intéressante  (que je me permets de reprendre ici): “quand on cherche à stationnariser une série, on a souvent  besoin de différencier deux fois, et ça marche tout le temps“.
Effectivement, on peut toujours différencier une série, on finira bien par tomber sur une série stationnaire. Je retraduirais cette question sous la forme suivante “pourquoi cherche-t-on toujours à stationnariser les séries ?” ou encore “est-ce gênant de différencier une série ?“.
Pour la première question, la réponse est simple: les seules séries que l’on sache modéliser sont les séries stationnaires. Les autocorrélations se calculent sur des séries stationnaires, par exemple, et la non-stationnarité n’est pas une notion simple à définir (tout comme la non-indépendance entre variables aléatoires)…..etc.
Pour la seconde question, la réponse est simple: si on différencie une série pour mieux la modéliser, si on souhaite par la suite faire de la prévision, il conviendra d’intégrer la série modélisée. Or intégrer une série fait exploser l’intervalle de confiance. Autant faire ça sur un exemple simple, avec la série suivante, que l’on commence par supposer stationnaire, et que l’on prédit sur une trentaine de valeurs, avec un intervalle de confiance.
XXX

Mais si l’on suppose la série intégrée à l’ordre 1, on différencie puis on modélise par un processus stationnaire (c’est l’idée qui sous-tend les processus ARIMA, à savoir un processus ARMA intégré: en différenciant la série, on devrait tomber sur un processus ARMA. On peut rattacher ça à la notion de racine unité). La prédiction (avec l’intervalle de confiance) est alors présenté sur la série initiale. Le fait d’intégrer les erreurs fait que la variance de la prédiction augmente avec l’horizon.

Et si l’on continue, et que l’on différencie de fois la série avant de la modéliser, et que l’on intègre deux fois les erreurs, l’intervalle de confiance devient immense !
XXX

Bref, il convient de ne pas différencier si ce n’est pas vraiment indispensable ! L’outil pour vérifier que l’on n’a pas trop différencier est la fonction d’autocovariance inverse (c’est à dire la fonction d’autocovariance d’une série dont la densité spectrale serait l’inverse de la densité spectrale initiale*). Cette fonction fait partie des fonctions de base sous SAS, mais pas sous R… J’ai cherché un peu, mais sans succès. L’argument dans les forums est que cette fonction est redondante avec la fonction d’autocorrélation partielle. Et en effet, si la finalité est simplement de détecter les ordres AR ou MA d’une série stationnaire, alors effectivement, les deux fonctions s’utilisent de manière équivalente. Mais la fonction d’autocovariance inverse apporte plus d’information, en particulier afin de détecter si l’on n’a pas surdifférencié la série.
La sortie suivante présente la fonction d’autocorrélation (à gauche) et la fonction d’autocorrélation inverse (à droite) sur une série.
XXXX

On note que la série semble intégrée (en pratique, des autocorrélations très fortes et persistantes très longtemps se traduit par une suspission d’intégration). Si l’on différencie la série, on obtient les autocorrélogrammes suivants,
XXX

Et si l’on différencie une nouvelle fois, on obtient les graphiques suivants,
XXXX

Bref, l’autocorrélogramme de droite semble caractéristique d’une série intégrée: on dira alors que l’on a surdifférencié le modèle (“en intégrant la série, elle est toujours stationnaires”…). Je parle un peu de tout ça dans mon polycopié de Dauphine, tome 1.

* J’avais parlé dans un ancien billet (ici) de l’importance de la densité spectrale en série temporelles. L’idée est que si f est une densité spectrale, 1/f peut également l’être. Le lien entre la fonction d’autocorrélation et la densité spectrale est donné par des théorèmes de Kolmogorov ou Wiener. Pour plus de détails, il y a des compléments dans le chapitre 1.2 du polycopié que j’avais fait à Dauphine (ici). On peut d’ailleurs noter que la fonction d’autocorrélation partielle d’un processus ARMA(p,q) est la fonction d’autocorrélation d’un processus ARMA(q,p) obtenu en permutant les deux polynômes d’opérateurs retard.


5 thoughts on “Différencier (indéfiniment) les séries temporelles ?”

  1. Bonjour,
    Merci pour cet article très intéressant !
    Je me suis posé une question similaire qui m’a fait tomber sur votre article qui est la suivante, si on différencie une série, faut-il nécessairement différencier également les variables explicatives de cette série ? J’ai remarqué que par défaut SAS le faisait mais je doute que cela soit utile. Je cherche à prédire un volume de vente totale et j’ai comme variable les volumes de promotion prévus dans le passé et le futur.
    Merci de votre avis si vous avez une idée de la réponse !

    1. Il faudrait d’abord souligner que chaque variable est une série en soit. Ainsi, la différenciation dépend du fait que la série (variable) soit non-stationnaire du type DS. C’est le test de racine unitaire qui vous aiderait à savoir si vous devez stationnariser une variable ou pas ; qu’elle soit endogène ou exogène.

  2. Bonjour,

    Les images des régressions ne sont plus affichées.
    Pourriez-vous les remettre s’il vous plaît ?

    Merci beaucoup pour cet article très éclairant !

  3. Attention, j’avais posté une correction à mon post immédiatement après car la fonction ar() de R n’estimait pas exactement l’équation que je croyais (aux signes près). C’est pourquoi il faut remplacer :
    acfth <- ARMAacf(ar=numeric(0),ma=artest$ar)
    par :
    acfth <- ARMAacf(ar=numeric(0),ma=-artest$ar)

    Et là ça correspond exactement aux sorties de SAS (pour s’en convaincre, surdifférencier une série et regarder comment le graphique se comporte).
    Au passage, je me permets de recommander l’éditeur pour R nouvellement arrivé Rstudio (http://www.rstudio.org/) qui constitue une amélioration radicale par rapport à ce qui existait auparavant (notamment sous PC).

    Bonne continuation, ce blog et vos deux poly dauphinois sont véritablement d’une grande aide.

    REPONSE: ah ah, le coup du signe des processus MA ! c’était une des questions dans mon premier examen, il y a 10 ans ! Merci pour le soutien. 

    ts.1<-arima.sim(list(ar=c(0.4,0.4)),n=1000) artest <- ar(ts.1,aic=F,order.max=30,method="yule-walker") acfth <- ARMAacf(ar=numeric(0),ma=-artest$ar) base <- data.frame(IACF=as.vector(acfth), Lag=as.numeric(names(acfth))) ci <- 0.95 climy <- qnorm((1 + ci)/2) / sqrt(artest$n.used) q2 <- qplot(Lag, IACF, data = base, yend = 0, xend = Lag, geom="bar",stat="identity",fill=I("Darkblue"))+ theme_bw()+geom_hline(yintercept=c(-climy,climy),colour="red", linetype="dashed")+opts(title=expression(paste("Inverse autocorrelogram of ",y[t])),plot.title = theme_text(size = 25))+geom_hline(yintercept=0) q2
  4. Pour ceux que ça intéresse, il est facile de reproduire sous R la procédure d’estimation des autocorrélations inverses telle qu’elle est implémentée sous SAS. J’ai posté ça ici :
    http://www.mail-archive.com/r-help@

    Et au passage, ce blog est génial

    RÉPONSE: merci ! il risque effectivement de devenir génial si vous continuez à me poster des codes !

    ts.1<-arima.sim(list(ar=c(0.4,0.4)),n=1000) artest <- ar(ts.1,aic=F,order.max=30,method="yule-walker") acfth <- ARMAacf(ar=numeric(0),ma=artest$ar) base <- data.frame(IACF=as.vector(acfth), Lag=as.numeric(names(acfth))) ci <- 0.95 climy <- qnorm((1 + ci)/2) / sqrt(artest$n.used) q2 <- qplot(Lag, IACF, data = base, yend = 0, xend = Lag, geom="bar",stat="identity",fill=I("Darkblue"))+ theme_bw()+geom_hline(yintercept=c(-climy,climy),colour="red", linetype="dashed")+opts(title=expression(paste("Inverse autocorrelogram of ",y[t])),plot.title = theme_text(size = 25))+geom_hline(yintercept=0) q2

Leave a Reply

Your email address will not be published.

This site uses Akismet to reduce spam. Learn how your comment data is processed.