0 - Traitement des séries temporelles sous R

Formation - Désaisonnalisation avec JDemetra+ et RJDemetra

Auteur

Alain Quartier-la-Tente

L’objectif de ce TP est d’apprendre à manipuler les séries temporelles sous R en utilisant les packages de bases.

Dans R il existe de nombreux packages qui permettent de manipuler les séries temporelles. Pour n’en citer que quelques-uns :
- Les objets ts peuvent être créés à partir du package stats ;
- Les objets zoo peuvent être créés à partir du package zoo ;
- Les objets xts peuvent être créés à partir du package xts ;
- Les objets tis peuvent être créés à partir du package tseries ;
- Les objets tsibble peuvent être créés à partir du package tsibble.

tsbox permet quand à lui de facilement passer d’une classe à l’autre.

Ici nous nous concentrerons essentiellement sur les trois premiers : ts stocker les séries temporelles, zoo et xts pour effectuer certaines manipulations supplémentaires.

Manipulation des séries temporelles avec ts()

Création d’une série temporelle

La fonction ts() permet de créer des objets séries-temporelles à partir un vecteur (ou une matrice). La syntaxe de base est ts(vector, start=, end=, frequency=)start et end sont la première et la dernière observation, frequency est le nombre d’observations par unité de temps (1=annuelle, 2=semestrielle, 4=trimestrielle, 6=bi-mestrielle, 12=mensuelle, etc.).

Par exemple pour créer une série trimestrielle ayant les valeurs de 1 à 10 et commençant en 1959Q2 :

ts(1:10, frequency = 4, start = c(1959, 2)) # 2ème trimestre de 1959
     Qtr1 Qtr2 Qtr3 Qtr4
1959         1    2    3
1960    4    5    6    7
1961    8    9   10     
# Équivalent à 
ts(1:10, frequency = 4, start = 1959 + 1/4)
     Qtr1 Qtr2 Qtr3 Qtr4
1959         1    2    3
1960    4    5    6    7
1961    8    9   10     

On peut aussi définir l’objet à partir de sa date de fin :

ts(1:10, frequency = 4, end = c(1959, 2))
     Qtr1 Qtr2 Qtr3 Qtr4
1957    1    2    3    4
1958    5    6    7    8
1959    9   10          

Si l’on directement extraire un sous-ensemble de la série on peut spécifier les paramètres end et start. Par exemple pour ne garder que les valeurs jusqu’en 1960 inclus :

ts(1:10, frequency = 4, start = c(1959, 2), end = c(1960, 4))
     Qtr1 Qtr2 Qtr3 Qtr4
1959         1    2    3
1960    4    5    6    7

Ou alors utiliser la fonction window une fois l’objet créé :

ts_object <- ts(1:10, frequency = 4, start = c(1959, 2))
window(ts_object, end = c(1960, 4))
     Qtr1 Qtr2 Qtr3 Qtr4
1959         1    2    3
1960    4    5    6    7

On peut récupérer les différents attributs avec les fonctions start(), end() et frequency() :

start(ts_object)
[1] 1959    2
end(ts_object)
[1] 1961    3
frequency(ts_object)
[1] 4

Deux autres fonctions peuvent aussi être utiles : time() crée un série-temporelle à partir des dates de notre série-temporelle et cycle() donne la position dans le cycle de chaque observation.

time(ts_object)
        Qtr1    Qtr2    Qtr3    Qtr4
1959         1959.25 1959.50 1959.75
1960 1960.00 1960.25 1960.50 1960.75
1961 1961.00 1961.25 1961.50        
cycle(ts_object)
     Qtr1 Qtr2 Qtr3 Qtr4
1959         2    3    4
1960    1    2    3    4
1961    1    2    3     
Exercice

Extraire toutes les données du 2ème trimestre de l’objet ts_object

ts_object[cycle(ts_object) == 2]
[1] 1 5 9
Exercice

Créer une série temporelle mensuelle qui commence en 2000, qui se termine en janvier 2020, qui vaut 1 en avril 2009 et 0 à toutes les autres dates

indicatrice <- ts(0, start = 2000, end = 2020, frequency = 12)
window(indicatrice, start = c(2005, 4), end = c(2005, 4)) <- 1
indicatrice
     Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
2000   0   0   0   0   0   0   0   0   0   0   0   0
2001   0   0   0   0   0   0   0   0   0   0   0   0
2002   0   0   0   0   0   0   0   0   0   0   0   0
2003   0   0   0   0   0   0   0   0   0   0   0   0
2004   0   0   0   0   0   0   0   0   0   0   0   0
2005   0   0   0   1   0   0   0   0   0   0   0   0
2006   0   0   0   0   0   0   0   0   0   0   0   0
2007   0   0   0   0   0   0   0   0   0   0   0   0
2008   0   0   0   0   0   0   0   0   0   0   0   0
2009   0   0   0   0   0   0   0   0   0   0   0   0
2010   0   0   0   0   0   0   0   0   0   0   0   0
2011   0   0   0   0   0   0   0   0   0   0   0   0
2012   0   0   0   0   0   0   0   0   0   0   0   0
2013   0   0   0   0   0   0   0   0   0   0   0   0
2014   0   0   0   0   0   0   0   0   0   0   0   0
2015   0   0   0   0   0   0   0   0   0   0   0   0
2016   0   0   0   0   0   0   0   0   0   0   0   0
2017   0   0   0   0   0   0   0   0   0   0   0   0
2018   0   0   0   0   0   0   0   0   0   0   0   0
2019   0   0   0   0   0   0   0   0   0   0   0   0
2020   0                                            

Pour tracer un graphique il suffit maintenant d’utiliser les fonctions plot() et lines()

plot(ts_object * 2)
lines(ts_object, col = "red")

Séries multivariées

De la même façon que précédemment on peut créer une série temporelle multivariée. Cette fois-ci l’objet créé est à la fois mts, ts et matrix

mts <- ts(matrix(rnorm(300), 100, 3), start = c(1961, 1), frequency = 12)

On peut accéder à la première variable de la même façon que dans une matrice : par son nom ou son numéro de colonne :

colnames(mts)
[1] "Series 1" "Series 2" "Series 3"
# mts[,1] # ou de façon équivalente :
mts[, "Series 1"]
             Jan         Feb         Mar         Apr         May         Jun
1961  0.48457656 -0.35498297 -4.07604013 -0.94818736  0.49777745  0.83790218
1962 -0.59378326 -0.12329912  0.14425366 -1.87033256  2.07358714 -0.79759979
1963 -1.32728072  0.43801327  0.27269378  0.50397756 -0.71284225 -0.28389309
1964 -0.65843830 -1.23378701 -0.10760678  0.23627752  0.27659537  0.87856469
1965 -0.16224075 -1.38098691 -0.84078131 -0.57084346  0.24409719  1.32974484
1966 -0.12101717 -0.71629919  0.70740582  0.27336550  0.47031910 -2.14256903
1967  0.49154784 -0.46248882  1.53373504  1.69799441 -1.35614340  0.81509954
1968  1.46840899 -0.28817877 -0.05167282 -0.05508327 -0.75298834 -0.35390815
1969 -0.98758474  1.23111712 -1.06354431 -1.68894505                        
             Jul         Aug         Sep         Oct         Nov         Dec
1961  1.00576280 -0.08247037 -0.70366556 -0.26087010  1.04846904 -1.71825380
1962  0.22070799  1.01982402  0.53763430 -1.02860299 -0.61588759  1.56678439
1963 -0.84023146  1.39245730 -0.11318523 -1.47566125 -0.48108957 -1.29835261
1964  0.07445877 -0.56883127  0.60440919 -0.65243419  0.98461073 -2.47754589
1965  0.88815020  1.72164040 -1.30703847  0.28122870 -0.49543356  1.08880197
1966  3.24831138  1.01697072  1.42221349 -1.13667101 -1.23098253  0.48852850
1967 -1.54316150  0.57076612  0.40654318  0.10156154  0.12003689  0.55890502
1968  0.97194091  0.05395929 -1.45792337 -0.16589613 -1.35823982 -0.26852694
1969                                                                        

Et avec les même fonctions que pour les matrices on peut récupérer les noms des colonnes (colnames), le nombre de variables (ncol), etc.

Attention

Une source classique d’erreur est de manipuler des séries-temporelles uni et multivariées et de vouloir utiliser les fonctions liées aux matrices sur les séries univariées. Par exemple, colnames(ts_object) renverra toujours l’objet NULL. Une solution est de tester si l’objet est multivarié avec la fonction is.mts().

Manipulation basiques

Pour concaténer plusieurs séries temporelles, les fonctions deux fonctions suivantes peuvent ts.union() et ts.intersect().

ts_object2 <- ts(1:10, frequency = 4, start = c(1960, 1))
ts.union(ts_object, ts_object2) # on garde toute la couverture temporelle en rajoutant des NA
        ts_object ts_object2
1959 Q2         1         NA
1959 Q3         2         NA
1959 Q4         3         NA
1960 Q1         4          1
1960 Q2         5          2
1960 Q3         6          3
1960 Q4         7          4
1961 Q1         8          5
1961 Q2         9          6
1961 Q3        10          7
1961 Q4        NA          8
1962 Q1        NA          9
1962 Q2        NA         10
ts.intersect(ts_object, ts_object2) # on ne garde que les périodes communes
        ts_object ts_object2
1960 Q1         4          1
1960 Q2         5          2
1960 Q3         6          3
1960 Q4         7          4
1961 Q1         8          5
1961 Q2         9          6
1961 Q3        10          7

On va maintenant utiliser la série d’indice de production industrielle de la France (CVS-CJO) :

ipi_fr_manuf <- ts(c(94.2, 96.69, 95.66, 95.06, 95.96, 93.97, 94.16, 93.4, 
94.12, 94.29, 92.42, 93.01, 94.98, 93.31, 93.76, 93.06, 91.93, 
93.41, 91.68, 92.98, 93.42, 92.39, 93.74, 92.69, 93.12, 92.57, 
93.49, 92.59, 92.85, 91.74, 91.23, 91.53, 90.08, 90.47, 89.97, 
88.44, 88.66, 87.86, 87.38, 87.42, 87.14, 86.24, 87.67, 86.86, 
87.2, 87.68, 85.93, 86.25, 88.14, 87.71, 88.21, 89.59, 90.38, 
90.76, 91.67, 92.18, 91.79, 93.02, 94.54, 94.04, 94.17, 94.56, 
93.94, 94.29, 93.59, 94.34, 94.79, 94.04, 94.62, 93.51, 92.59, 
94.9, 93.89, 93.19, 94.19, 93.67, 95.19, 94.72, 92.82, 95.49, 
95.13, 94.21, 95.42, 95.34, 94.39, 96.09, 97.14, 100.02, 97.84, 
98.59, 98.72, 102.9, 100.51, 103.23, 100.91, 103.1, 103.21, 103.76, 
102.15, 103.37, 104.98, 104.21, 105.32, 102.65, 104.34, 104.07, 
104.39, 103.62, 104.75, 103.36, 103.8, 104.89, 105.49, 106.69, 
106.91, 104.6, 107.76, 109.36, 109.26, 108.33, 109.12, 109.6, 
110.2, 110.81, 112.57, 110.92, 112.15, 110.86, 111.53, 112.75, 
112.67, 114.3, 113.32, 114.09, 114.65, 112.12, 113.06, 113.27, 
111.34, 114.36, 111.94, 112.04, 109.81, 110.12, 110.98, 111.91, 
112.23, 112.86, 111.23, 111.13, 109.96, 112.59, 110.62, 109.69, 
111.26, 108.05, 110.05, 110.39, 110.92, 110.7, 107.72, 107.26, 
109.22, 108.78, 108.66, 110.62, 108.8, 109.42, 110.12, 111.6, 
110.61, 111, 110.22, 111.69, 112.3, 107.68, 111.92, 112.66, 110.38, 
110.74, 113.16, 111.04, 108.72, 112, 110.35, 110.3, 110.21, 109.04, 
112.63, 109.26, 113.55, 112.07, 111.16, 110.64, 112.98, 111.54, 
114.46, 114.28, 112.29, 111.52, 113.52, 112.84, 112.1, 114.24, 
113.24, 114.18, 114.73, 113.28, 115.9, 114.88, 115.04, 115.72, 
112.57, 115.17, 113.71, 113.82, 115.29, 116.48, 114.36, 116.12, 
111.24, 110.64, 111.49, 109.8, 109.25, 107.21, 100.8, 99.34, 
94.87, 93.66, 92.19, 92.2, 93.49, 95.23, 94.71, 96.27, 97.09, 
96.3, 97.66, 96.56, 97.12, 96.6, 98.78, 98.7, 99.27, 99.03, 99.69, 
98.63, 99.98, 99.7, 100.82, 101.79, 104.09, 105.03, 103.59, 102.21, 
105.56, 101.55, 103.08, 101.93, 101.22, 101.5, 104.35, 102.1, 
101.05, 100.14, 101.87, 100.16, 99.79, 99.16, 100.01, 101.92, 
100.11, 97.66, 97.59, 99.12, 98.02, 98.55, 98.78, 100.31, 100.31, 
99.64, 98.56, 98.37, 98.54, 99.16, 100.35, 99.27, 98.24, 99.95, 
99.43, 99.53, 96.53, 99.06, 100.11, 98.2, 99.17, 97.91, 96.93, 
99.45, 99.02, 99.38, 99.74, 99.38, 100.85, 100.02, 98.66, 100.22, 
101.23, 100.64, 99.94, 100.92, 102.39, 100.8, 99.54, 100.73, 
99.76, 99.07, 99.77, 101.63, 100.4, 99.4, 102.76, 100.97, 100.16, 
101.11, 102.62, 101.82, 103.7, 103.02, 103.59, 103.54, 104.38, 
105.57, 105.52, 105.93, 103.59, 102.87, 103.82, 103.83, 102.5, 
104.23, 104.04, 104.61, 103.38, 104.22, 103.42, 103.7, 104.93, 
105.75, 104.38, 104.29, 105.98, 103.72, 104.07, 103.1, 103.88, 
104.37), start = 1990, frequency = 12)

Pour calculer la série retardée/avancée, il suffit d’utiliser la fonction lag() :

# série retardée d'un mois : en février 2010 on a la valeur de janvier 2010
lag(ipi_fr_manuf, k = -1) 

La fonction diff permet de calculer la différence entre deux périodes

diff(ipi_fr_manuf, k = 1)
Exercice

Écrire une fonction ev() qui calcule l’évolution mensuelle si la série en entrée est mensuelle, l’évolution trimestrielle si la série en entrée est trimestrielle, etc.

ev <- function(x){
  result <- (x/lag(x, k = -1) - 1) * 100
  return(result)
}
# Ou de manière équivalente :
ev2 <- function(x){
  # Attention ici c'est bien k = 1 dans la fonction diff
  # et k = -1 dans la fonction lag
  result <- (diff(x, k = 1) /lag(x, k = -1)) * 100
  return(result)
}

#################################################
# Remarque : pour des raisons informatiques ces deux fonctions ne donnent pas exactement
# le même résultat. C'est un problème récurrent lorsque l'on
# souhaite tester l'égalité entre deux séries temporelles :
all (ev(ipi_fr_manuf) == ev2(ipi_fr_manuf))
[1] FALSE
# Une solution est plutôt d'utiliser la fonction all.equal():
isTRUE(all.equal(ev(ipi_fr_manuf), ev2(ipi_fr_manuf)))
[1] TRUE

Utilisation de xts et zoo

Utilisation de xts

Un des avantages du package xts est qu’il permet d’appliquer une fonction à chaque période d’une série temporelle (par exemple à toutes les données trimestrielles, annuelles, etc.). Il s’agit des fonctions apply.monthly(), apply.quarterly(), apply.yearly(), etc. Pour cela il faut auparavant convertir les données au format xts.

Par exemple pour calculer la moyenne annuelle :

library(xts)
moy_an <- apply.yearly(as.xts(ipi_fr_manuf), mean)
moy_an
              [,1]
déc 1990  94.41167
déc 1991  93.11250
déc 1992  91.50667
déc 1993  87.19083
déc 1994  91.00250
déc 1995  94.11167
déc 1996  94.43833
déc 1997  99.45333
déc 1998 103.83917
déc 1999 106.26667
déc 2000 111.45667
déc 2001 112.51000
déc 2002 111.04250
déc 2003 109.37833
déc 2004 110.91000
déc 2005 111.02750
déc 2006 112.63083
déc 2007 114.35333
déc 2008 110.16833
déc 2009  95.01917
déc 2010  99.17583
déc 2011 103.01750
déc 2012  99.88167
déc 2013  99.15500
déc 2014  98.70917
déc 2015 100.00000
déc 2016 100.60167
déc 2017 103.41333
déc 2018 103.68417
oct 2019 104.44700
Exercice

Calculer l’évolution trimestrielle de ipi_fr_manuf.

# Tout d'abord on prolonge l'IPI par des valeurs manquantes jusqu'à la fin 
# de l'année, sinon la dernière somme sur le trimestre est fausse.
ipi_fr_manuf_prolonge <- window(ipi_fr_manuf, end = c(2019, 12), extend = TRUE)

somme_trim <- apply.quarterly(as.xts(ipi_fr_manuf_prolonge), sum)
# Attention la fonction lag n'agit pas pareil pour les objets xts et ts :
# il faut ici utiliser l'option k = 1
evol_trim <- (somme_trim/lag(somme_trim, k = 1) - 1) * 100

# On peut utiliser la fonction format() 
# si l'on veut convertir automatiquement en un objet ts
start_year <- as.numeric(format(start(evol_trim), "%Y"))
start_quarter <- as.numeric(substr(quarters(start(evol_trim)), 2, 2))
ts(evol_trim, start = c(start_year, start_quarter), frequency = 4)
            Qtr1        Qtr2        Qtr3        Qtr4
1990          NA -0.54440761 -1.16144426 -0.69582505
1991  0.83297583 -1.29409679 -0.11494253  0.26611047
1992  0.12911556 -0.71638370 -1.56576954 -1.45140009
1993 -1.85212734 -1.17468738  0.35659509 -0.71447675
1994  1.61625491  2.52594107  1.81361504  2.16224060
1995  0.37997159 -0.15919624  0.43583020 -0.86434997
1996  0.09608541  0.82127493 -0.04936878  0.53979678
1997  0.92992245  3.07002295  1.91600607  1.69132493
1998  0.61189949  1.11283644 -0.07998464 -0.07364478
1999 -0.05447321  1.65432336  0.69385309  2.40548752
2000  0.60253861  1.63565609  0.07179180  1.54839481
2001  0.68880254 -1.05537040 -0.23932634 -1.67930340
2002  0.94888092  0.02984006 -0.61153869 -1.25161329
2003  0.71732523 -1.71414775  0.30090887  0.66736056
2004  1.06130641  0.17452532 -0.30338530  0.56643567
2005 -0.25765474 -0.08110056 -0.23147452  0.90394118
2006 -0.02986144  1.64286994 -0.86693311  0.54842439
2007  0.87564125  0.55823469 -0.21217230 -0.18349693
2008  1.00087540 -2.34882847 -2.20710059 -7.01579234
2009 -8.66438913  0.07124537  2.54520860  0.85048773
2010  0.68153656  1.53846154  0.43771044  1.34428428
2011  3.44017730 -1.08407150 -0.99896547  0.56166933
2012 -1.58792012 -1.30337227  0.97957273 -2.53939876
2013  0.33291436  1.66243440 -1.59528409  1.12024909
2014 -0.38824553 -0.83999731  0.79967471 -1.07234100
2015  1.30823338  0.70772120 -0.04662781  0.46316351
2016  0.40796020 -1.04713771  0.74776339  0.44068920
2017  0.25071751  1.53015894  0.96259804  1.76880357
2018 -2.12604883  0.09024107  0.47333849 -0.22113258
2019  1.19483523 -0.33961785 -0.93633555          NA

Utilisation de zoo

Le package zoo donne un ensemble d’outils qui permettent de manipuler les séries-temporelles. De nombreux packages (dont xts) sont d’ailleurs basés sur ce format. Il permet notamment de faire des imputations de données manquantes selon différentes fonctions (toutes les fonctions commençant par na.) et de mieux gérer le format des dates associées aux séries temporelles (ce qui permet de faire des manipulations avec la fonction format, ce qui permet par exemple plus facilement exporter des séries temporelles sous Excel). Le calcul de l’évolution trimestrielle aurait par exemple pu être faite avec ce package :

somme_trim <- aggregate(as.zoo(ipi_fr_manuf_prolonge), yearqtr, sum)
somme_trim <- as.ts(somme_trim) #La conversion en ts est plus simple depuis un objet zoo
evol_trim <- ev(somme_trim)
evol_trim
            Qtr1        Qtr2        Qtr3        Qtr4
1990             -0.54440761 -1.16144426 -0.69582505
1991  0.83297583 -1.29409679 -0.11494253  0.26611047
1992  0.12911556 -0.71638370 -1.56576954 -1.45140009
1993 -1.85212734 -1.17468738  0.35659509 -0.71447675
1994  1.61625491  2.52594107  1.81361504  2.16224060
1995  0.37997159 -0.15919624  0.43583020 -0.86434997
1996  0.09608541  0.82127493 -0.04936878  0.53979678
1997  0.92992245  3.07002295  1.91600607  1.69132493
1998  0.61189949  1.11283644 -0.07998464 -0.07364478
1999 -0.05447321  1.65432336  0.69385309  2.40548752
2000  0.60253861  1.63565609  0.07179180  1.54839481
2001  0.68880254 -1.05537040 -0.23932634 -1.67930340
2002  0.94888092  0.02984006 -0.61153869 -1.25161329
2003  0.71732523 -1.71414775  0.30090887  0.66736056
2004  1.06130641  0.17452532 -0.30338530  0.56643567
2005 -0.25765474 -0.08110056 -0.23147452  0.90394118
2006 -0.02986144  1.64286994 -0.86693311  0.54842439
2007  0.87564125  0.55823469 -0.21217230 -0.18349693
2008  1.00087540 -2.34882847 -2.20710059 -7.01579234
2009 -8.66438913  0.07124537  2.54520860  0.85048773
2010  0.68153656  1.53846154  0.43771044  1.34428428
2011  3.44017730 -1.08407150 -0.99896547  0.56166933
2012 -1.58792012 -1.30337227  0.97957273 -2.53939876
2013  0.33291436  1.66243440 -1.59528409  1.12024909
2014 -0.38824553 -0.83999731  0.79967471 -1.07234100
2015  1.30823338  0.70772120 -0.04662781  0.46316351
2016  0.40796020 -1.04713771  0.74776339  0.44068920
2017  0.25071751  1.53015894  0.96259804  1.76880357
2018 -2.12604883  0.09024107  0.47333849 -0.22113258
2019  1.19483523 -0.33961785 -0.93633555          NA

Pour le prochain exercice, utiliser la série suivante :

serie_avec_NA <- ts(c(NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 0, 0, 0, 0, 
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, NA, 
  NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
  NA, NA, NA, NA, NA, NA, NA, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, NA, NA, NA, NA, NA, NA, 
  NA, NA, NA, NA, NA, NA), start= 2000, frequency = 12)
Exercice

Sur la série serie_avec_NA, utiliser les différentes fonctions du package zoo pour : 1. Enlever les valeurs manquantes au début de la série ; 2. Remplacer les valeurs manquantes à la fin de la série par la dernière valeur observée. 3. Interpoler de manière linéaire les valeurs manquantes entre les 0 et les 1.

Les trois fonctions à utiliser sont : na.trim(), na.locf et na.approx()

# D'abord on enlève les valeurs manquantes au début de la série
etape_1 <- na.trim(serie_avec_NA, sides = "left")
etape_1
     Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
2001   0   0   0   0   0   0   0   0   0   0   0   0
2002   0   0   0   0   0   0   0   0   0   0   0   0
2003  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA
2004  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA
2005   1   1   1   1   1   1   1   1   1   1   1   1
2006   1   1   1   1   1   1   1   1   1   1   1   1
2007  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA
# Ensuite on interpole
etape_2 <- na.approx(etape_1, na.rm = FALSE)
etape_2
      Jan  Feb  Mar  Apr  May  Jun  Jul  Aug  Sep  Oct  Nov  Dec
2001 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
2002 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
2003 0.04 0.08 0.12 0.16 0.20 0.24 0.28 0.32 0.36 0.40 0.44 0.48
2004 0.52 0.56 0.60 0.64 0.68 0.72 0.76 0.80 0.84 0.88 0.92 0.96
2005 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00
2006 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00
2007   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA
# Enfin on remplace les valeurs à la fin de la série
etape_3 <- na.locf(etape_2)
etape_3
      Jan  Feb  Mar  Apr  May  Jun  Jul  Aug  Sep  Oct  Nov  Dec
2001 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
2002 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
2003 0.04 0.08 0.12 0.16 0.20 0.24 0.28 0.32 0.36 0.40 0.44 0.48
2004 0.52 0.56 0.60 0.64 0.68 0.72 0.76 0.80 0.84 0.88 0.92 0.96
2005 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00
2006 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00
2007 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00
Exercice

À l’aide des fonctions as.yearmon() et format(), créer un data.frame contenant une colonne “date” qui contient les dates au format JJ/MM/YYYY et une deuxième colonnes avec les valeurs de ipi_fr_manuf.

La fonction as.yearmon() doit être appliquée sur time(ipi_fr_manuf). Pour la fonction format regarder l’aide ?format.Date.

dates <- as.yearmon(time(ipi_fr_manuf))
dates <- format(dates, "%d/%m/%Y")
donnees_formatees <- data.frame(date = dates, ipi = ipi_fr_manuf)
head(donnees_formatees)
        date   ipi
1 01/01/1990 94.20
2 01/02/1990 96.69
3 01/03/1990 95.66
4 01/04/1990 95.06
5 01/05/1990 95.96
6 01/06/1990 93.97

Il peut également être utile d’exporter un objet R ts ou mts vers un fichier Excel, tout en rajoutant une colonne “date” qui sera au format date. Ci-dessous un exemple en utilisant le package XLConnect :

library(XLConnect)
ts2xls <- function(x, file, sheet="Feuille 1", format = "dd/mm/yyyy"){
  wb <- loadWorkbook(file, create = TRUE)
  createSheet(wb, sheet)
  if(is.mts(x)){
    col <- c("date", colnames(x))
  }else{
    col <- c("date", "x")
  }
  # Le titre
  writeWorksheet(wb,matrix(col,nrow = 1),
                 sheet = sheet,startCol = 1,startRow =1,
                 header = FALSE)

  # Petit trick pour que la colonne date soit au format date d'Excel
  csDate <- getOrCreateCellStyle(wb, name = "date")
  setDataFormat(csDate, format = format)
  date <- as.Date(format(zoo::as.Date((time(x))), "%d/%m/%Y"),
                  "%d/%m/%Y")
  writeWorksheet(wb,date,sheet = sheet,
                 startCol = 1,startRow = 2,
                 header = FALSE)
  setCellStyle(wb, sheet = sheet, row = seq_along(date)+1,
               col = 1,
               cellstyle = csDate)
  # Fin colonne date

  # Autres colonnes
  writeWorksheet(wb,x,sheet = sheet,startCol = 2,startRow = 2,
                 header = FALSE)
  setColumnWidth(wb, sheet, column = seq_along(col), width = -1)
  saveWorkbook(wb, file)
}