Commit b679cc1d authored by Thomas PEROT's avatar Thomas PEROT

Avancement de l'exercice

parent 42c0ab7c
...@@ -2,10 +2,13 @@ ...@@ -2,10 +2,13 @@
title: "Concentration de CO2 dans l'atmosphère depuis 1958" title: "Concentration de CO2 dans l'atmosphère depuis 1958"
author: "Thomas Pérot" author: "Thomas Pérot"
date: "12 juin 2023" date: "12 juin 2023"
output: pdf_document output:
pdf_document:
toc: true
editor_options: editor_options:
markdown: markdown:
wrap: sentence wrap: sentence
bibliography: references.bib
--- ---
```{r setup, include=FALSE} ```{r setup, include=FALSE}
...@@ -14,13 +17,9 @@ knitr::opts_chunk$set(echo = TRUE) ...@@ -14,13 +17,9 @@ knitr::opts_chunk$set(echo = TRUE)
## Introduction ## Introduction
Dans ce document nous allons présenter et analyser des données d'évolution de la concentration en CO2 atmosphérique provenant Dans ce document nous allons présenter et analyser des données d'évolution de la concentration en CO2 atmosphérique provenant du site de l'observatoire de Mauna Loa situé sur l'île d'Hawaï.
du site de l'observatoire de Mauna Loa situé sur l'île d'Hawaï.
*C. D. Keeling, S. C. Piper, R. B. Bacastow, M. Wahlen, T. P. Whorf, M. Heimann, and *C. D. Keeling, S. C. Piper, R. B. Bacastow, M. Wahlen, T. P. Whorf, M. Heimann, and H. A. Meijer, Exchanges of atmospheric CO2 and 13CO2 with the terrestrial biosphere and oceans from 1978 to 2000. I. Global aspects, SIO Reference Series, No. 01-06, Scripps Institution of Oceanography, San Diego, 88 pages, 2001.*
H. A. Meijer, Exchanges of atmospheric CO2 and 13CO2 with the terrestrial biosphere and
oceans from 1978 to 2000. I. Global aspects, SIO Reference Series, No. 01-06, Scripps
Institution of Oceanography, San Diego, 88 pages, 2001.*
## Chargement des données ## Chargement des données
...@@ -63,37 +62,37 @@ data[na_records,] ...@@ -63,37 +62,37 @@ data[na_records,]
**Premier problème rencontré** : les colonnes 3 et 4 sont des dates mais le format de la date n'est pas indiqué. **Premier problème rencontré** : les colonnes 3 et 4 sont des dates mais le format de la date n'est pas indiqué.
Après recherche voici la description des quatre première colonne : Après recherche voici la description des quatre première colonne :
- colonne 1 : année ; - colonne 1 : année ;
- colonne 2 : mois ; - colonne 2 : mois ;
- colonne 3 : date en nombre de jours depuis une origine (comme dans Excel). Date d'origine 1899-12-30 ; - colonne 3 : date en nombre de jours depuis une origine (comme dans Excel). Date d'origine 1899-12-30 ;
- colonne 4 : date en année décimal. - colonne 4 : date en année décimal.
## Conversion des colonnes en date ### Conversion des colonnes en date
Nous allons convertir la colonne 3 en date en indiquant la date 1899-12-30 comme origine. Nous allons convertir la colonne 3 en date en indiquant la date 1899-12-30 comme origine.
```{r} ```{r}
class(data$Date) class(data$Date)
data$Date<-as.Date(data$Date, origin = "1899-12-30") data$Date<-as.Date(data$Date, origin = "1899-12-30")
class(data$Date) class(data$Date)
head(data) head(data[,c("Yr","Mn","Date","CO2")])
tail(data) tail(data[,c("Yr","Mn","Date","CO2")])
``` ```
Cette conversion renvoie le 15 du mois ce qui est conforme à la description dans le fichier "The monthly values have been adjusted to 24:00 hours on the 15th of each month" Cette conversion renvoie le 15 du mois ce qui est conforme à la description dans le fichier "The monthly values have been adjusted to 24:00 hours on the 15th of each month".
Nous n'avons pas réussi à faire de même avec la colonne 4.
## Représentations graphique ## Représentations graphiques des données
### Réprésentation de l'évolution de la concentration de CO2 atmosphérique en fonction du temps ### Réprésentation de l'évolution de la concentration de CO2 atmosphérique en fonction du temps
D'après la description des données contenu dans le fichier csv la colonne 5 CO2 correspond à la concentration D'après la description des données contenu dans le fichier csv la colonne 5 CO2 correspond à la concentration en CO2 : "Column 5 below gives monthly Mauna Loa CO2 concentrations in micro-mol CO2 per mole (ppm)".
en CO2 : "Column 5 below gives monthly Mauna Loa CO2 concentrations in micro-mol CO2 per mole (ppm)".
Ce ne sont pas des données brutes mais des données recalculées à une échelle mensuelle. Ce ne sont pas des données brutes mais des données recalculées à une échelle mensuelle.
```{r} ```{r}
plot(data$Date,data$CO2,type="l",main="",xlab="Date (month)",ylab="CO2 concentration (ppm)") plot(data$Date,data$CO2,type="l",main="",xlab="Date (month)",
ylab="CO2 concentration (ppm)")
mtext("Mauna Loa Observatory, Hawaii", side=3,line=2,cex=1.25,adj=0) mtext("Mauna Loa Observatory, Hawaii", side=3,line=2,cex=1.25,adj=0)
mtext("Monthly average carbone dioxide concentration", side=3,line=1,cex=1.25,adj=0) mtext("Monthly average carbone dioxide concentration", side=3,line=1,cex=1.25,adj=0)
mtext("Data from Scripps CO2 Program", side=3,lin=0,cex=.75,adj=0) mtext("Data from Scripps CO2 Program", side=3,lin=0,cex=.75,adj=0)
...@@ -107,13 +106,15 @@ Nous voyons clairement deux structures dans les données, une forte tendance à ...@@ -107,13 +106,15 @@ Nous voyons clairement deux structures dans les données, une forte tendance à
### Transformation des données en série temporelle ### Transformation des données en série temporelle
Pour caractériser ces deux composantes, nous allons considérer les données comme une série temporelle. Pour caractériser ces deux composantes, nous allons considérer les données comme une série temporelle.
Nous allons transformer les données en un objet ts. Pour cela nous devons utiliser une série de données sans valeurs manquantes. Nous allons transformer les données en un objet ts.
Plutôt que la colonne 5 nous allons donc utiliser la colonne 9 "CO2.1" qui correspond aux mêmes données que la colonne 5 Pour cela nous devons utiliser une série de données sans valeurs manquantes.
mais où les données manquantes ont été remplacées en utilisant une "smoothed version of the data generated from a stiff cubic spline function plus 4-harmonic functions with linear gain". Cette procédure est décrite en détail dans le rapport cité en introduction de ce document. Plutôt que la colonne 5 nous allons donc utiliser la colonne 9 "CO2.1" qui correspond aux mêmes données que la colonne 5 mais où les données manquantes ont été remplacées en utilisant une "smoothed version of the data generated from a stiff cubic spline function plus 4-harmonic functions with linear gain".
Nous pouvons le vérifier en superposant les données remplies et les données avec données manquantes : Cette procédure est décrite en détail dans le rapport cité en introduction de ce document.
Nous pouvons le vérifier en superposant les données remplies et les données avec données manquantes :
```{r} ```{r}
plot(data$Date,data$CO2.1,type="l",main="",xlab="Date (month)",ylab="CO2 concentration (ppm)",col=2) plot(data$Date,data$CO2.1,type="l",main="",xlab="Date (month)",
ylab="CO2 concentration (ppm)",col=2)
mtext("Mauna Loa Observatory, Hawaii", side=3,line=2,cex=1.25,adj=0) mtext("Mauna Loa Observatory, Hawaii", side=3,line=2,cex=1.25,adj=0)
mtext("Monthly average carbone dioxide concentration", side=3,line=1,cex=1.25,adj=0) mtext("Monthly average carbone dioxide concentration", side=3,line=1,cex=1.25,adj=0)
mtext("Data from Scripps CO2 Program", side=3,lin=0,cex=.75,adj=0) mtext("Data from Scripps CO2 Program", side=3,lin=0,cex=.75,adj=0)
...@@ -124,7 +125,8 @@ legend("topleft",c("CO2 data with NA","CO2 data filled"),lty=1,col=c(1,2),bty="n ...@@ -124,7 +125,8 @@ legend("topleft",c("CO2 data with NA","CO2 data filled"),lty=1,col=c(1,2),bty="n
Nous constatons qu'il y a très peu de données manquantes et qu'elles se situent toutes entre 1958 et 1964 (nous les avions déjà identifiées plus haut). Nous constatons qu'il y a très peu de données manquantes et qu'elles se situent toutes entre 1958 et 1964 (nous les avions déjà identifiées plus haut).
```{r} ```{r}
plot(data$Date,data$CO2.1,type="l",main="",xlab="Date (month)",ylab="CO2 concentration (ppm)",col=2, plot(data$Date,data$CO2.1,type="l",main="",xlab="Date (month)",
ylab="CO2 concentration (ppm)",col=2,
xlim=as.Date(c("1958-01-01","1970-01-01")),ylim=c(300,340)) xlim=as.Date(c("1958-01-01","1970-01-01")),ylim=c(300,340))
mtext("Mauna Loa Observatory, Hawaii", side=3,line=2,cex=1.25,adj=0) mtext("Mauna Loa Observatory, Hawaii", side=3,line=2,cex=1.25,adj=0)
mtext("Monthly average carbone dioxide concentration", side=3,line=1,cex=1.25,adj=0) mtext("Monthly average carbone dioxide concentration", side=3,line=1,cex=1.25,adj=0)
...@@ -133,18 +135,19 @@ points(data$Date,data$CO2,type="l",col=1) ...@@ -133,18 +135,19 @@ points(data$Date,data$CO2,type="l",col=1)
legend("topleft",c("CO2 data with NA","CO2 data filled"),lty=1,col=c(1,2),bty="n") legend("topleft",c("CO2 data with NA","CO2 data filled"),lty=1,col=c(1,2),bty="n")
``` ```
Il nous faut également supprimer les premières et dernières données (manquantes) Il nous faut également supprimer les premières et dernières données (manquantes) allant de janvier 1958 à février 1958 puis de juin 2023 à décembre 2023.
allant de janvier 1958 à février 1958 puis de juin 2023 à décembre 2023.
```{r} ```{r}
data.trunc<-data[!is.na(data$CO2.1),] data.trunc<-data[!is.na(data$CO2.1),]
head(data.trunc[,c("Date","CO2","CO2.1")],10) head(data.trunc[,c("Date","CO2","CO2.1")],10)
tail(data.trunc[,c("Date","CO2","CO2.1")],10) tail(data.trunc[,c("Date","CO2","CO2.1")],10)
``` ```
Nous pouvons maintenant transformer la colonne 9 en un objet ts. Nous pouvons maintenant transformer la colonne 9 en un objet ts.
Nous commençons par trier les données pour être sûr que les lignes sont bien ordonnées selon la date. Nous commençons par trier les données pour être sûr que les lignes sont bien ordonnées selon la date.
La série temporelle correspond à des données mensuelles sur plusieurs années. La série temporelle correspond à des données mensuelles sur plusieurs années.
La première donnée est le mois de mars 1958. La fin est le mois de mai 2023. La première donnée est le mois de mars 1958.
La fin est le mois de mai 2023.
Nous créons notre objet ts en indiquant le début et la fréquence de la série. Nous créons notre objet ts en indiquant le début et la fréquence de la série.
```{r} ```{r}
...@@ -154,8 +157,10 @@ plot(data.ts) ...@@ -154,8 +157,10 @@ plot(data.ts)
``` ```
### Décomposition de la série temporelle ### Décomposition de la série temporelle
La fonction stl du package stats permet de décomposer la série temporelle en utilisant un modèle loess pour ajuster la tendance.
Nous avons fixé le paramètre s.window à 13 ce qui signifie que la fonction utilise une fenêtre de 13 annés consécutives pour estimer chaque valeur de la composante saisonnière. Nous avons préféré cela plutôt que la valeur par défaut ("periodic") qui considère que la composante saisonnière ne varie pas au cours du temps. La fonction stl() du package stats permet de décomposer la série temporelle en utilisant un modèle loess pour ajuster la tendance.
Nous avons fixé le paramètre s.window à 13 ce qui signifie que la fonction utilise une fenêtre de 13 annés consécutives pour estimer chaque valeur de la composante saisonnière.
Nous avons préféré cela plutôt que la valeur par défaut ("periodic") qui considère que la composante saisonnière ne varie pas au cours du temps.
La fonction renvoie la composante saisonnière, la tendance et les résidus. La fonction renvoie la composante saisonnière, la tendance et les résidus.
```{r} ```{r}
...@@ -182,7 +187,8 @@ mtext("hors tendance",line=0) ...@@ -182,7 +187,8 @@ mtext("hors tendance",line=0)
``` ```
Nous pouvons également donner quelques statistiques de cette composante saisonnières. Nous pouvons également 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. 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. 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.
...@@ -191,13 +197,15 @@ La variance de la composante saisonnière n'est pas constante au cours du temps. ...@@ -191,13 +197,15 @@ La variance de la composante saisonnière n'est pas constante au cours du temps.
Nous pouvons superposer la tendance aux données brutes ce qui correspond au même type de données que la colonne 6 seasonally : "Column 6 gives the same data after a seasonal adjustment to remove the quasi-regular seasonal cycle" Nous pouvons superposer la tendance aux données brutes ce qui correspond au même type de données que la colonne 6 seasonally : "Column 6 gives the same data after a seasonal adjustment to remove the quasi-regular seasonal cycle"
```{r} ```{r}
plot(data.trunc$Date,data.trunc$CO2.1,type="l",main="",xlab="Date (month)",ylab="CO2 concentration (ppm)") plot(data.trunc$Date,data.trunc$CO2.1,type="l",main="",xlab="Date (month)",
ylab="CO2 concentration (ppm)")
mtext("Mauna Loa Observatory, Hawaii", side=3,line=2,cex=1.25,adj=0) mtext("Mauna Loa Observatory, Hawaii", side=3,line=2,cex=1.25,adj=0)
mtext("Monthly average carbone dioxide concentration", side=3,line=1,cex=1.25,adj=0) mtext("Monthly average carbone dioxide concentration", side=3,line=1,cex=1.25,adj=0)
mtext("Data from Scripps CO2 Program", side=3,lin=0,cex=.75,adj=0) mtext("Data from Scripps CO2 Program", side=3,lin=0,cex=.75,adj=0)
points(data.trunc$Date,data.trunc$seasonally,col="red",type="l") points(data.trunc$Date,data.trunc$seasonally,col="red",type="l")
points(data.trunc$Date,data.trunc$trendSTL,col="blue",type="l") points(data.trunc$Date,data.trunc$trendSTL,col="blue",type="l")
legend("topleft",c("CO2 concentration","Column seasonally from file","Trend from stl function"),lty=1,col=c(1,"red","blue"),bty="n") legend("topleft",c("CO2 concentration","Column seasonally from file",
"Trend from stl function"),lty=1,col=c(1,"red","blue"),bty="n")
``` ```
...@@ -214,17 +222,21 @@ mtext("Monthly average carbone dioxide concentration", side=3,line=1,cex=1.25,ad ...@@ -214,17 +222,21 @@ mtext("Monthly average carbone dioxide concentration", side=3,line=1,cex=1.25,ad
mtext("Data from Scripps CO2 Program", side=3,lin=0,cex=.75,adj=0) mtext("Data from Scripps CO2 Program", side=3,lin=0,cex=.75,adj=0)
points(data.trunc$Date,data.trunc$seasonally,col="red",type="l") points(data.trunc$Date,data.trunc$seasonally,col="red",type="l")
points(data.trunc$Date,data.trunc$trendSTL,col="blue",type="l") points(data.trunc$Date,data.trunc$trendSTL,col="blue",type="l")
legend("topleft",c("CO2 concentration","Column seasonally from file","Trend from stl function"),lty=1,col=c(1,"red","blue"),bty="n") legend("topleft",c("CO2 concentration","Column seasonally from file",
"Trend from stl function"),lty=1,col=c(1,"red","blue"),bty="n")
``` ```
### Modélisatin de la tendance ## 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. 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. 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. 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.
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} ```{r}
data.trunc$time<-as.numeric(data.trunc$Date) data.trunc$time<-as.numeric(data.trunc$Date)
...@@ -236,50 +248,134 @@ data.trunc$modeleSimple0Fit<-fitted(modeleSimple0) ...@@ -236,50 +248,134 @@ data.trunc$modeleSimple0Fit<-fitted(modeleSimple0)
data.trunc$modeleSimple0Res<-resid(modeleSimple0) data.trunc$modeleSimple0Res<-resid(modeleSimple0)
par(mfrow=c(1,2)) par(mfrow=c(1,2))
plot(data.trunc$Date,data.trunc$trendSTL,type="l",main="",xlab="Date (month)",ylab="CO2 concentration (ppm)") plot(data.trunc$Date,data.trunc$trendSTL,type="l",main="",xlab="Date (month)",
ylab="CO2 concentration (ppm)")
mtext("Modèle simple", side=3,line=2,cex=0.75,adj=0) mtext("Modèle simple", side=3,line=2,cex=0.75,adj=0)
mtext("Valeur ajustée", side=3,line=1,cex=0.75,adj=0) mtext("Valeur ajustée", side=3,line=1,cex=0.75,adj=0)
points(data.trunc$Date,data.trunc$modeleSimple0Fit,col="blue",type="l") points(data.trunc$Date,data.trunc$modeleSimple0Fit,col="blue",type="l")
legend("topleft",c("tendance","tendance ~ time + time^2"),lty=1,col=c("black","blue"),bty="n",cex=0.75) legend("topleft",c("tendance","tendance ~ time + time^2"),lty=1,
plot(data.trunc$Date,data.trunc$modeleSimple0Res,type="l",main="",xlab="Date (month)",ylab="CO2 concentration (ppm)") col=c("black","blue"),bty="n",cex=0.75)
plot(data.trunc$Date,data.trunc$modeleSimple0Res,type="l",main="",
xlab="Date (month)",ylab="CO2 concentration (ppm)")
mtext("Modèle simple", side=3,line=2,cex=0.75,adj=0) mtext("Modèle simple", side=3,line=2,cex=0.75,adj=0)
mtext("Résidus", side=3,line=1,cex=0.75,adj=0) mtext("Résidus", side=3,line=1,cex=0.75,adj=0)
abline(h=0) abline(h=0)
``` ```
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. 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 ### 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.
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.
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} ```{r}
data.trunc$time<-as.numeric(data.trunc$Date) data.trunc$time<-as.numeric(data.trunc$Date)
myNewData<-data.frame(time=as.numeric(seq.Date(from=as.Date("1958-03-15"),to=as.Date("2025-12-15"),by="month"))) myNewData<-data.frame(time=as.numeric(seq.Date(from=as.Date("1958-03-15"),
predictions<-data.frame(predict.lm(modeleSimple0,myNewData,interval="prediction",type="response")) to=as.Date("2025-12-15"),by="month")))
predictions<-data.frame(predict.lm(modeleSimple0,myNewData,
interval="prediction",type="response"))
myNewData<-cbind(myNewData,predictions) myNewData<-cbind(myNewData,predictions)
myNewDataExtrapolation<-myNewData[myNewData$time > as.numeric(as.Date("2023-05-15")),]
```
Le graphe suivant représente la tendance "observée" sur la période connue, les valeurs de la tendance obtenues par ajustement du modèle simple et enfin les valeurs de la tendance prédite au-delà de mai 2023.
```{r}
plot(data.trunc$Date,data.trunc$trendSTL,type="l",main="",xlab="Date (month)", plot(data.trunc$Date,data.trunc$trendSTL,type="l",main="",xlab="Date (month)",
ylab="CO2 concentration (ppm)",col="red",xlim=as.Date(c("2000-01-01","2026-01-01")), ylab="CO2 concentration (ppm)",col="red",xlim=as.Date(c("2000-01-01","2026-01-01")),
ylim=c(360,440)) ylim=c(360,440))
points(myNewData$time,myNewData$fit,col=1,type="l") points(myNewData$time,myNewData$fit,col=1,type="l")
points(myNewData$time,myNewData$lwr,col=1,type="l",lty=2) points(myNewData$time,myNewData$lwr,col=1,type="l",lty=2)
points(myNewData$time,myNewData$upr,col=1,type="l",lty=2) points(myNewData$time,myNewData$upr,col=1,type="l",lty=2)
legend("topleft",c("tendance observée","valeurs prédites","intervalle de confiance des prédictions"),col=c("red","black","black"),lty=c(1,1,2),bty="n",cex=0.75) points(myNewDataExtrapolation$time,myNewDataExtrapolation$fit,col="blue",type="l")
points(myNewDataExtrapolation$time,myNewDataExtrapolation$lwr,col="blue",type="l",lty=2)
points(myNewDataExtrapolation$time,myNewDataExtrapolation$upr,col="blue",type="l",lty=2)
legend("topleft",c("tendance observée","valeurs ajustées (modèle simple)",
"valeurs prédites (modèle simple)","intervalle de confiance des prédictions"),col=c("red","black","blue","black"),lty=c(1,1,1,2),bty="n",cex=0.75)
``` ```
Nous pouvons estimer à l'aide du modèle simple la concentration moyenne attendue en CO2 pour l'année 2025.
```{r} ```{r}
modeleSimple0<-lm(data=data.trunc, CO2.1 ~ time + I((time)^2)) myNewData2025<-myNewDataExtrapolation[myNewDataExtrapolation$time >=
as.numeric(as.Date("2025-01-01")) &
myNewDataExtrapolation$time <= as.numeric(as.Date("2025-12-31")),]
dim(myNewData2025)
round(mean(myNewData2025$fit),2)
round(mean(myNewData2025$fit)-mean(myNewData2025$lwr),2);
round(mean(myNewData2025$fit)-mean(myNewData2025$upr),2)
```
data.trunc$modeleSimple0Fit<-fitted(modeleSimple0) **D'après le modèle simple, en première approximation la valeur de concentration moyenne en CO2 en 2025 serait de `r round(mean(myNewData2025$fit),2)` ppm plus ou moins `r round(mean(myNewData2025$fit)-mean(myNewData2025$lwr),2)` ppm.**
data.trunc$modeleSimple0Res<-resid(modeleSimple0)
### Modélisation à l'aide d'un modèle stochastique
Pour aller un peu plus loin nous allons tenter d'utiliser un modèle stochastique de type SARIMA pour faire les prédictions.
En effet, nous avons vu précédemment que les données présentaient à la fois une tendance et une saisonnalité.
Nous pouvons également vérifier que les résidus présentent une autocorrélation et une autocorrélation partielle à l'aide des fonctions acf et pcaf.
```{r}
par(mfrow=c(1,2)) par(mfrow=c(1,2))
plot(data.trunc$Date,data.trunc$CO2.1,type="l",main="",xlab="Date (month)",ylab="CO2 concentration (ppm)") acf(data.trunc$residSTL)
mtext("Mauna Loa Observatory, Hawaii", side=3,line=2,cex=1.25,adj=0) pacf(data.trunc$residSTL)
mtext("Monthly average carbone dioxide concentration", side=3,line=1,cex=1.25,adj=0)
mtext("Data from Scripps CO2 Program", side=3,lin=0,cex=.75,adj=0) ```
points(data.trunc$Date,data.trunc$modeleSimple0Fit,col="blue",type="l")
legend("topleft",c("modèle simple CO2 ~ time + time^2"),lty=1,col="blue",bty="n") Pour simplifier le processus de construction du modèle nous allons utiliser la fonction auto.arima() du package forecast qui permet de choisir le type de modèle approprié et d'estimer les différents paramètres du modèle stochastique.
plot(data.trunc$Date,data.trunc$modeleSimple0Res,type="l",main="",xlab="Date (month)",ylab="CO2 concentration (ppm)")
abline(h=0) ```{r}
#install.packages("forecast")
library(forecast)
modelSarima<-auto.arima(data.ts,stepwise=FALSE)
summary(modelSarima)
```
Nous pouvons vérifier qu'il n'y a plus d'autocorrélation dans les résidus du modèle.
```{r}
par(mfrow=c(1,2))
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).
```{r}
predictionsSARIMA<-data.frame(forecast(modelSarima,h=31))
tail(predictionsSARIMA)
names(predictionsSARIMA)
``` ```
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%.
```{r}
plot(forecast(modelSarima,h=31),include=50)
```
De la même façon que pour le modèle simple nous pouvons estimer la concentration de CO2 en 2025.
Nous récupérons les dates dans le data frame des prédictions du modèle SARIMA et nous créons un data.frame uniquement pour 2025.
```{r}
Sys.setlocale("LC_TIME", "English")
predictionsSARIMA$Date<-as.Date(paste("15 ",row.names(predictionsSARIMA),sep=""),format="%d %b %Y")
Sys.setlocale("LC_TIME", "French")
predictionsSARIMA2025<-predictionsSARIMA[predictionsSARIMA$Date >= as.Date("2025-01-01") &
predictionsSARIMA$Date <= as.Date("2025-12-31"),]
```
**D'après le modèle SARIMA, la valeur de concentration moyenne en CO2 en 2025 serait de `r round(mean(predictionsSARIMA2025$Point.Forecast),2)` ppm plus ou moins `r round(mean(predictionsSARIMA2025$Point.Forecast)-mean(predictionsSARIMA2025$Lo.95),2)` ppm.**
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.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment