Tag Archives: M1

Décomposition(s) de Séries Temporelles

La semaine dernière, pour le TP du cours de série temporelle, on avait parlé de décomposition de séries temporelles. On part d’une série temporelle , et on va considérer une décomposition de la forme

par exemple une tendance linéaire, et un cycle annuel,

Considérons la série suivante

> autoroute=read.table(
+ "http://freakonometrics.free.fr/autoroute.csv",
+ header=TRUE,sep=";")
>  a7=autoroute$a007
>  X=ts(a7,start = c(1989, 9), frequency = 12)

correspondant à du trafic sur l’autoroute (A7)

>  plot(X,xlim=c(1989,2000))

Pour estimer la tendance, on va faire une régression linéaire, sur le temps, à partir de la base suivante

>  T=time(X)
>  base=data.frame(Y=a7,X1=as.numeric(T))

Le modèle est ici

>  reg1=lm(Y~X1,data=base)

ce qui permet de faire une prévision sur les données passées, mais aussi futures,

>  tendance1=predict(reg1)
>  T=as.numeric(T)
>  lines(T,tendance1,col="red",lwd=3)
>  futur=seq(max(T)+1/12,length=36,by=1/12)
>  tendance2=predict(reg1,
+  newdata=data.frame(X1=futur))
>  lines(futur,tendance2,col="red")

Voilà pour la tendance. Pour le cycle, on va ajuste un modèle de la forme suivante

sur la série des résidus

>  base$Y2=residuals(reg1)

Cette fois, on va définir le mois de la date

> base$mois=round(base$X1-t
+ trunc(base$X1),digit=4)

Et on régresse le résidu sur le mois

>  reg2=lm(Y2~0+as.factor(mois),data=base)

Là encore, on peut faire une régression sur les données passées

>  cycle1=predict(reg2)
>  lines(T,tendance1+cycle1,col="blue",lwd=3)

mais aussi sur les données futures,

>  moisfutur=round(futur-trunc(futur),4)
>  cycle2=predict(reg2,newdata=
+  data.frame(mois=moisfutur))
>  lines(futur,tendance2+cycle2,col="blue")

Cela dit, pour les données futures, on peut aussi tenter de rajouter une région de confiance, en tenant compte de l’erreur d’ajustement,

>  E=residuals(reg2)
>  hist(E)
>  1.96*sqrt(var(E))
[1] 5637.897

On peut alors facilement ajouter notre région de confiance avec

> polygon(c(futur,rev(futur)),
+ c(tendance2+cycle2-1.96*sqrt(var(E)),
+ rev(tendance2+cycle2+1.96*sqrt(var(E)))),
+ col="yellow",border=NA)

Et voilà…. On peut quand même vérifier que le bruit est effectivement non-autocorrélé, et c’est le cas ici

>  plot(acf(E))

Comme on l’a vu en TP, ajuster une droite de régression c’est bien ici, mais peut être qu’on peut envisager un ajustement local. Par exemple prendre la moyenne autour de la date qui nous intéresse, +/- 6 mois (techniquement, si on rajoute 6 mois avant et après, on aura un soucis, alors on fait une petite correction au bord),

ce qui correspond à un lissage par moyenne mobile.

>  n=length(X)
>  F=rep(NA,n)
>  for(t in 7:(n-7)) F[t]=1/12*(sum(X[(t-5):(t+5)])+ (X[t-6]+X[t+6])/2)
>  lines(T,F,lwd=3,col="purple")

On voit ici – par notre ajustement non-paramétrique – que l’ajustement d’une tendance linéaire n’était pas si mauvais que ça

Par contre, pour des séries où la tendance n’est clairement pas linéaire, le lissage par moyenne mobile permet d’avoir une bonne estimation de la tendance de fond

> sncf=read.table(
+ "http://freakonometrics.free.fr/sncf.csv",
+ header=TRUE,sep=";")
> train=as.vector(t(as.matrix(sncf[,2:13])))
> X=ts(train,start = c(1963, 1), frequency = 12)
> plot(X)  
> n=length(X)
> F=rep(NA,n)
> for(t in 7:(n-7)) F[t]=1/12*(sum(X[(t-5):(t+5)])+(X[t-6]+X[t+6])/2)
> lines(as.numeric(time(X)),
+ F,lwd=3,col="purple")

On continuera en cours cette semaine autour du lissage, par moyenne mobile, et avec du lissage exponentiel ensuite. A suivre donc.

Manipuler des Séries Chronologiques

Ce matin en cours, on a vu un peu comment manipuler des séries temporelles, et en particulier comme jouer avec l’échelle de temps (passer de données hebdomadaire à de données mensuelles, par exemple).

Pour commencer, travaillons un peu sur les données extraites de google.fr/trends/ par exemple sur le mot clé fièvre,

report = read.csv(
"http://freakonometrics.free.fr/report-fievre.csv",
  skip=6,header=FALSE,nrows=626)
 X=report$V2
 plot(X,type="l")

Au lieu d’avoir un vecteur, on peut créer un format de série temporelle (hebdomadaire )

 X_h=ts(X,start=c(2004,3),frequency=52)
 plot(X_h)

On va essayer d’agréger les données pour les rendre mensuelles

 date1=substr(as.character(report$V1),1,10)
 date2=substr(as.character(report$V1),14,23) 
 d1=as.Date(date1,"%Y-%m-%d")
 d2=as.Date(date2,"%Y-%m-%d")
 d1[2]-d1[1]
 Vect_J=Vect_M=Vect_X=Vect_A= NULL
 for(i in 1:length(d1)){
   jours = seq(d1[i],d2[i],length=7)
   mois = as.POSIXlt(jours)$mon+1
   annees = as.POSIXlt(jours)$year+1900
   donnees = rep(X[i],7)
   Vect_J = c(Vect_J,jours)
   Vect_M = c(Vect_M,mois)
   Vect_A = c(Vect_A,annees)
   Vect_X = c(Vect_X,donnees)
 }
 base=data.frame(J=Vect_J,M=Vect_M,
                 A=Vect_A,X=Vect_X)
 head(base)
 base$AM = base$A*100+base$M
 head(base)
 Y=tapply(base$X,as.factor(base$AM),mean)
 Z=ts(as.numeric(Y[1:144]),
 start=c(2004,1),frequency=12)
 plot(Z)

On peut superposer les deux d’ailleurs (il y a peut être un léger décalage sur la série hebdomadaire)

plot(X_h,col="blue")
lines(as.numeric(time(Z)),as.numeric(Z),
col="red",lwd=2)

Continue reading Manipuler des Séries Chronologiques

Analyse des Données et Rappels d’Algèbre Linéaire

Cette semaine, on va commencer le cours d’Analyse des Données. Pour le premier cours, on reverra les bases d’algèbre linéaire (valeurs propres, diagonalisation, décomposition en valeurs singulières, etc). Pour ceux qui souhaitent réviser un peu, je renvoie vers le support de cours de Lara Thomas, qui contient tous les résultats nécessaires. Le reste se verra au tableau, en cours.

Histoire d’illustrer les premiers concepts, on pourra utiliser la base de données securite, extrait du “palmarès des départements: où vit-on en sécurité ?” paru dans le journal L’Express (N 2589, du 15 février 2001).

Données pour le cours de Statistique

Pour les derniers cours de Statistique, j’avais envoyé  une feuille avec quelques exercices, à regarder. J’en profile pour mettre en ligne les exercices sur l’inférence, et ceux sur les tests. Je mets aussi en ligne un tableau contenant les résultats de cinq établissements sur Rennes, au Brevet des Collèges. On pourra utiliser ces données pour faire un peu de statistique.

Analyse des Données, plan de cours

Ce semestre, je vais donner le cours d’Analyse des Données du Master Statistique & Économétrie. Le plan de cours sera, en gros,

  1. Introduction à l’analyse des données non-supervisée
  2. Réduction de dimension et Analyse en Composantes Principales
  3. Analyse Factorielle et Analyse des Correspondances
  4. Analyse Discriminante et k-Means
  5. Classification Hiérarchique

Parmi les références utiles,

Continue reading Analyse des Données, plan de cours

Séries Temporelles, références et exercices

Ce semestre, je vais donner le cours de Séries Temporelles du Master Statistique & Économétrie. Le plan de cours sera, en gros

  1. Concepts généraux, définition, stationnarité, processus Gaussien, propriété de Markov
  2. Opérateurs Retards
  3. Notions de lissage exponentiel
  4. Modèles Linéaires Stationnaires univariés AR et MA
  5. Modèles Linéaires Non-Stationnaires univariées, ARIMA et racines unités
  6. Modèles Linéaires Multivariées, VAR et co-intégration
  7. Modèles Linéaires univariés saisonniers
  8. Modèles Non-Linéaires, ARCH et GARCH

Parmi les références utiles:

Je peux aussi renvoyer vers le Task Views, de R dédié aux Séries temporelles, afin ‘avoir des compléments d’informations sur les packages de R. Je mettrais d’ailleurs en ligne des billets au fur et à mesure. Je mets aussi en ligne quelques séries d’exercices. Pour les premières données avec lesquelles on jouera un peu,

> autoroute=read.table(
"http://freakonometrics.blog.free.fr/public/data/autoroute.csv",header=TRUE,sep=";")

(données de fréquentation d’autoroutes, en France).