@@ -186,11 +186,19 @@ mtext("Variation saisonnière de la concentration en CO2 (ppm)",line=1)
mtext("hors tendance",line=0)
```
Nous pouvons également donner quelques statistiques de cette composante saisonnières.
Nous pouvons donner quelques statistiques de cette composante saisonnières.
Dans une année le CO2 atmosphérique peut varier de `r round(min(data.trunc$seasonSTL),2)` ppm à `r round(max(data.trunc$seasonSTL),2)` ppm par rapport à la moyenne annuelle.
L'écart-type de la composante saisonnière est de `r round(sd(data.trunc$seasonSTL),2)` ppm.
Nous voyons sur le graphe précédent que cette variation intra-annuelle augmente au cours du temps.
La variance de la composante saisonnière n'est pas constante au cours du temps.
La variance de la composante saisonnière n'est pas constante au cours du temps. Nous voyons sur le graphe précédent que cette variation intra-annuelle augmente légèrement au cours du temps.
Pour mieux voir cet effet saisonnier nous pouvons le représenter en superposant toutes les années dans un graphe annuel avec la fonction ggseasonplot() du packages forecast. Pour mieux identifier où se situe les pics et les creux nous allons faire cette représentation à partir de la composante saisonnière obtenue avec la fonction stl().
```{r}
#install.packages("forecast")
library(forecast)
ggseasonplot(decom.stl[1]$time.series[,1])
```
Nous voyons qu'au sein d'une année le pic de concentration de CO2 a lieu vers le mois de mai et les valeurs les plus basses sont vers le mois de septembre octobre. Les données reflètent les variations de la concentration de CO2 atmosphérique dans l'hemisphère nord. Dans l'hemisphère nord, à partir du printemps, les plantes captent le CO2 atmosphérique expliquant une partie de ce cycle saisonnier (voir le document cité en introduction pour plus de détails).
### Caractérisation de la tendance
...
...
@@ -227,21 +235,28 @@ legend("topleft",c("CO2 concentration","Column seasonally from file",
```
Nous voyons qu'entre 1958 et 2023 la concentration de CO2 atmosphérique est passé de `r round(data.trunc[data.trunc$Date==as.Date("1958-03-15"),]$trendSTL,2)` ppm
à `r round(data.trunc[data.trunc$Date==as.Date("2023-05-15"),]$trendSTL,2)` ppm, soit une augmentation de `r
round(100*(data.trunc[data.trunc$Date==as.Date("2023-05-15"),]$trendSTL-data.trunc[data.trunc$Date==as.Date("1958-03-15"),]$trendSTL)/data.trunc[data.trunc$Date==as.Date("1958-03-15"),]$trendSTL,1)`% en 65 ans.
## Prédiction de la concentration de CO2 jusqu'en 2025
### Modélisatin de la tendance avec un modèle simple
Lorsque l'on zoom sur les données, un modèle linéaire semble convenir pour représenter la tendance d'augmentation du CO2 dans le temps.
Cependant en observant l'ensemble des données il apparaît clairement que la concentration de CO2 augmente de plus en plus vite.
Lorsque l'on zoom sur les données comme sur le graphe précédent, un modèle linéaire semble convenir pour représenter la tendance d'augmentation du CO2 dans le temps. Cependant en observant l'ensemble des données il apparaît clairement que la concentration de CO2 augmente de plus en plus vite.
Un premier modèle simple pourrait être d'ajuster un modèle linéaire ayant une composante linéaire et une composante quadratique.
Pour simplifier nous allons ajuster ce modèle sur la tendance extraite précédemment.
Pour simplifier nous allons ajuster ce modèle sur la tendance extraite précédemment avec la fonction stl().
Pour ajuster le modèle nous allons convertir le champ date en numérique et utiliser cette variable comme variable explicative du modèle.
Nous nommons cette variable "time".
```{r}
data.trunc$time<-as.numeric(data.trunc$Date)
head(data.trunc)
```
Nous ajustons le modèle et récupérons les valeurs ajustées et les résidus.
```{r}
modeleSimple0<-lm(data=data.trunc, trendSTL ~ time + I((time)^2))
ce modèle est simpliste car par exemple nous n'avons pas tenu compte des observations répétées par années, c'est à dire de la présence de pseudoréplications, ni de l'autocorrélation temporelle.
ce modèle est simpliste car, par exemple, nous n'avons pas tenu compte des observations répétées par années, c'est à dire de la présence de pseudoréplications, ni de l'autocorrélation temporelle.
Néanmoins, même s'il n'est pas parfait, ce modèle très simple semble bien convenir aux données.
### Prédiction jusqu'en 2025 à l'aide du modèle simple
Pour prédire la concentration de CO2 en 2025, nous allons utiliser le modèle précédent et l'appliquer jusqu'en 2025.
Au delà de mai 2023, nous n'avons plus de données.
Il s'agira d'extrapolations à l'aide du modèle simple.
Nous utilisons la fonction predict.lm qui permet d'obtenir l'intervalle de confiance des prédictions.
Au delà de mai 2023, nous n'avons plus de données. Il s'agira d'extrapolations à l'aide du modèle simple.
Nous utilisons la fonction predict.lm() qui permet d'obtenir l'intervalle de confiance des prédictions.
Nous commençons par construire un data.frame avec une colonne "time" sur l'ensemble de la période de mars 1958 à décembre 2025.
Puis nous utilisons ce data.frame pour prédire les valeurs de CO2 à l'aide du modèle simple.
Puis nous utilisons ce data.frame pour prédire les valeurs de CO2 à l'aide du modèle simple et de la fonction predict.lm().
Nous créons un data.frame spécifiquement pour les données au-delà de mai 2023 qui correspond aux valeurs prédites extrapolées.
```{r}
...
...
@@ -348,16 +362,15 @@ acf(resid(modelSarima))
pacf(resid(modelSarima))
```
Pour prédire la concentration de CO2 jusqu'en 2025 nous allons utiliser la fonction forecast() du package forecast.
Pour aller jusqu'à décembre 2025 nous allons prédire sur 31 valeur supplémentaires (de juin 2023 à décembre 2025).
Pour prédire la concentration de CO2 jusqu'en 2025 nous allons utiliser et modèle précédent et la fonction forecast() du package forecast.
Pour aller jusqu'à décembre 2025 nous allons prédire sur 31 valeurs supplémentaires (de juin 2023 à décembre 2025).
Nous pouvons représenter les prédictions à l'aide de la fonction plot.forecast() du package forecast qui représente les prédictions avec les intervalles de confiance à 80 et 95%.
Nous pouvons représenter les prédictions à l'aide de la fonction plot.forecast() du package forecast qui représente les prédictions avec les intervalles de confiance à 80 et 95%. La fonction représente également les données qui ont servi à construire le modèle. Pour plus de lisibilité nous choisissons de ne représentées que les 50 dernières valeurs passées avec le paramètre include=50.
Le modèle SARIMA prédit donc une concentration de CO2 très proche par rapport au modèle simple, très légèrement inférieure.
L'intervalle de confiance des prédictions est légèrement plus large avec le modèle SARIMA.
## Conclusion
Dans cette analyse nous avons chargé un jeu de données correspondant à l'évolution de la concentration en CO2 atmosphérique sur le site de Mauna Loa sur l'île d'Hawai. Pour construire le jeu de données à partir du fichier csv nous avons exclu des lignes correspondant à des informations autres que les données. Nous avons également géré des données manquantes codées par une valeur numérique. Enfin nous avons convertit une colonne en un format date reconnu par R. Cette dernière étape a demandé un peu de temps car les informations sur le format des colonnes représentant la date n'était pas précise.
Une fois la préparation du jeu de données réalisée nous avons représenté les données et constaté la présence d'une tendance et d'une saisonnalité fortes. Nous avons caractérisé les oscillations périodiques et la tendance en considérant les données comme une serie temporelle. Pour cela nous avons utilisé les fonction ts() et stl() du package stats. Ensuite, pour prédire la concentration en CO2 jsuqu'en 2025, nous avons construit un premier modèle simple de la tendance à l'aide d'un modèle linéaire correspondant à un polynôme de degré 2 du temps. Nous avons ensuite proposé un modèle stochastique SARIMA plus complexe mais plus adapté aux données qui permet de prédire la tendance et la saisonnalité. Les deux approches donnent des résultats très similaires probablement parceque nous avons fait des prédictions à très court terme.