Module R’Stat1 : Les séries temporelles

Novembre 2019 ; IRD-Montpellier-France

CC BY-NC-ND 3.0

Définitions

Série temporelle

Mesures répétées à un pas de temps donné. Par exemple la température chaque jour, la valeur d’une action chaque semaine, le nombre d’insectes chaque mois, …

Une série temporelle est régulière si le pas de temps est toujours le même et irrégulière dans le cas contraire. La plupart des analyses statistiques ne s’appliquent qu’aux séries temporelles régulières. La quasi totalité des séries temporelles en biologie sont irrégulières !

!! On ne va que survoler la thématique des séries temporelles qui fait l’objet de nombreux livres et de nombreux packages R !!! Vue d’ensemble ici

Décomposition

Une série temporelle peut être décomposée en :

  • une tendance ou orientation (en général avec un modèle linéaire)
  • une composante saisonnière (quelque chose qui revient avec périodicité)
  • une composante aléatoire (bruit de fond)
  • une composante cyclique (des évènements qui reviennent avec des variations, par exemple El Niño)

Pour quoi faire ?

Pour décrire, expliquer, faire des hypothèses, modéliser, prévoir, …

ts

##              Jan         Feb         Mar         Apr         May
## 2016             -0.66960810  1.13983300 -1.85598599  0.81628493
## 2017 -1.12656474 -0.14393231  1.06762113 -2.30920531  0.47295250
## 2018  0.20322220 -0.20668717  0.15708461 -0.72950695  1.09791403
## 2019  0.96931212  0.15772934 -1.21621748 -0.94901891  3.12868932
##              Jun         Jul         Aug         Sep         Oct
## 2016 -0.17076981  1.08981231  0.74192109 -0.72764400 -0.70373971
## 2017  0.30791470  1.58896050 -0.17352878 -0.87229436 -0.18136641
## 2018 -0.43094538 -0.84162924  0.38198947  1.09339724 -0.71494964
## 2019 -0.16476848  0.38624069  0.82786204 -1.49346438  0.74670559
##              Nov         Dec
## 2016  0.00253112 -1.66704299
## 2017  0.97877421 -0.12194153
## 2018 -0.40475779  0.79466085
## 2019

##  Time-Series [1:45] from 2016 to 2020: -0.67 1.14 -1.856 0.816 -0.171 ...

## Time Series:
## Start = c(2019, 32) 
## End = c(2019, 61) 
## Frequency = 365 
##  [1]  0.1892583  2.4191292 -0.9180494 -0.7277307 -1.1643339  0.1161126
##  [7]  0.5771136 -1.8024935  0.6341600  0.6972268  1.5070810 -0.9685960
## [13]  1.7469175  0.7793346  1.5068857 -1.9686809  0.2755536  0.8376550
## [19]  0.5363980  0.4532773 -2.3447569 -0.9409205  1.4031314 -1.1792448
## [25] -3.0580679 -0.9762208  1.5576742 -0.5317512  2.0538006  0.6494285

Mais concrètement, avec des données réelles ?

Exemple : données météo

Dans la pratique nos séries temporelles viennent d’un fichier. Et le fichier comportera souvent (si ce n’est tout le temps) des données manquantes !

Charger les données

Dates au format POSIXct

## 'data.frame':    188184 obs. of  19 variables:
##  $ raspid      : Factor w/ 8 levels "EG","EM","IC",..: 1 1 1 1 1 1 1 1 1 1 ...
##  $ timestamp   : POSIXct, format: "2019-09-01 00:11:16" "2019-09-01 00:12:19" ...
##  $ temperature : num  22.4 22.4 24.1 22.3 22.3 ...
##  $ gas         : int  5797414 5797414 6552984 5797414 5797414 6593137 5797414 11127198 6593137 5797414 ...
##  $ humidity    : num  59.2 59.2 49.4 59.1 59 ...
##  $ pressure    : num  1009 1009 1010 1010 1010 ...
##  $ lightvisible: int  261 260 299 260 260 301 260 276 301 260 ...
##  $ lightir     : int  254 253 648 253 254 673 255 392 670 253 ...
##  $ lightuv     : int  2 2 23 2 2 24 2 10 24 2 ...
##  $ ndvi_0      : int  307200 307200 237139 307200 307200 230841 307200 224441 241853 307200 ...
##  $ ndvi_1      : int  0 0 0 0 0 0 0 954 0 0 ...
##  $ ndvi_2      : int  0 0 0 0 0 0 0 15 0 0 ...
##  $ ndvi_3      : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ ndvi_4      : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ ndvi_5      : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ ndvi_6      : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ ndvi_7      : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ ndvi_8      : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ ndvi_9      : int  0 0 0 0 0 0 0 0 0 0 ...

Aperçu des données

Séparer les différentes mesures

Mettre chaque mesure dans une colonne d’un data.frame

Identifier le nombre de données manquantes

## [1]   0  51 286 563 271 325 174 718
## [1] "0%"    "7.1%"  "39.7%" "78.2%" "37.6%" "45.1%" "24.2%" "99.7%"

##  [1]   1   2   3   4   5   6   7   8   9  10  11  12  13  14  15  16  17
## [18]  18  19  20  21  22  23  24  25  26  27  28  29  30  31  32  33  34
## [35] 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127

Que faire ?

##                    date EM
## 1   2019-09-01 00:00:00 NA
## 2   2019-09-01 01:00:00 NA
## 3   2019-09-01 02:00:00 NA
## 4   2019-09-01 03:00:00 NA
## 5   2019-09-01 04:00:00 NA
## 6   2019-09-01 05:00:00 NA
## 7   2019-09-01 06:00:00 NA
## 8   2019-09-01 07:00:00 NA
## 9   2019-09-01 08:00:00 NA
## 10  2019-09-01 09:00:00 NA
## 11  2019-09-01 10:00:00 NA
## 12  2019-09-01 11:00:00 NA
## 13  2019-09-01 12:00:00 NA
## 14  2019-09-01 13:00:00 NA
## 15  2019-09-01 14:00:00 NA
## 16  2019-09-01 15:00:00 NA
## 17  2019-09-01 16:00:00 NA
## 18  2019-09-01 17:00:00 NA
## 19  2019-09-01 18:00:00 NA
## 20  2019-09-01 19:00:00 NA
## 21  2019-09-01 20:00:00 NA
## 22  2019-09-01 21:00:00 NA
## 23  2019-09-01 22:00:00 NA
## 24  2019-09-01 23:00:00 NA
## 25  2019-09-02 00:00:00 NA
## 26  2019-09-02 01:00:00 NA
## 27  2019-09-02 02:00:00 NA
## 28  2019-09-02 03:00:00 NA
## 29  2019-09-02 04:00:00 NA
## 30  2019-09-02 05:00:00 NA
## 31  2019-09-02 06:00:00 NA
## 32  2019-09-02 07:00:00 NA
## 33  2019-09-02 08:00:00 NA
## 34  2019-09-02 09:00:00 NA
## 111 2019-09-05 14:00:00 NA
## 112 2019-09-05 15:00:00 NA
## 113 2019-09-05 16:00:00 NA
## 114 2019-09-05 17:00:00 NA
## 115 2019-09-05 18:00:00 NA
## 116 2019-09-05 19:00:00 NA
## 117 2019-09-05 20:00:00 NA
## 118 2019-09-05 21:00:00 NA
## 119 2019-09-05 22:00:00 NA
## 120 2019-09-05 23:00:00 NA
## 121 2019-09-06 00:00:00 NA
## 122 2019-09-06 01:00:00 NA
## 123 2019-09-06 02:00:00 NA
## 124 2019-09-06 03:00:00 NA
## 125 2019-09-06 04:00:00 NA
## 126 2019-09-06 05:00:00 NA
## 127 2019-09-06 06:00:00 NA

Remplacer les valeurs manquantes par la moyenne de la température à la même heure ?

## [1] 18.86718
## [1] 1.354671

Autres idées ?

  • Remplacer par la médiane ?
  • Prendre une valeur au hasard ?

Le package imputeTS

## [1] "Length of time series:"
## [1] 720
## [1] "-------------------------"
## [1] "Number of Missing Values:"
## [1] 51
## [1] "-------------------------"
## [1] "Percentage of Missing Values:"
## [1] "7.08%"
## [1] "-------------------------"
## [1] "Stats for Bins"
## [1] "  Bin 1 (180 values from 1 to 180) :      51 NAs (28.3%)"
## [1] "  Bin 2 (180 values from 181 to 360) :      0 NAs (0%)"
## [1] "  Bin 3 (180 values from 361 to 540) :      0 NAs (0%)"
## [1] "  Bin 4 (180 values from 541 to 720) :      0 NAs (0%)"
## [1] "-------------------------"
## [1] "Longest NA gap (series of consecutive NAs)"
## [1] "34 in a row"
## [1] "-------------------------"
## [1] "Most frequent gap size (series of consecutive NA series)"
## [1] "34 NA in a row (occuring 1 times)"
## [1] "-------------------------"
## [1] "Gap size accounting for most NAs"
## [1] "34 NA in a row (occuring 1 times, making up for overall 34 NAs)"
## [1] "-------------------------"
## [1] "Overview NA series"
## [1] "  17 NA in a row: 1 times"
## [1] "  34 NA in a row: 1 times"

?na.kalman