Commit f8ddf339 authored by Loick Klpr's avatar Loick Klpr

Ajout fichier pdf (version 2)

parent 14f10067
---
title: "TP évalué par les pairs"
author: "Loïck Kléparski"
date: "18/02/2021"
output:
pdf_document: default
html_document: default
---
```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE)
```
## Etude de la concentration de CO2 dans l'atmosphère depuis 1958
Fichier télécharger le 18/02/2021
Atmospheric CO2 concentrations (ppm) derived from in situ air measurements at Mauna Loa, Observatory, Hawaii: Latitude 19.5°N Longitude 155.6°W Elevation 3397m.
Source: R. F. Keeling, S. J. Walker, S. C. Piper and A. F. Bollenbacher. Scripps CO2 Program ( http://scrippsco2.ucsd.edu ). Scripps Institution of Oceanography (SIO). University of California. University of California. La Jolla, California USA 92093-0244.
Données hebdomadaires.
Les analyses effectuées pour décomposer la série temporelle ont été réalisées à partir du livre *Numerical Ecology* écrit par Pierre et Louis Lengendre et édité par Elsevier en 1998.
`url_data_co2_web` = lien pour télécharger les données.
`url_data_co2_local` = lien des données en local.
```{r}
url_data_co2_web = "https://scrippsco2.ucsd.edu/assets/data/atmospheric/stations/in_situ_co2/weekly/weekly_in_situ_co2_mlo.csv"
url_data_co2_locale = "D:/PhD formations/formation recherche reproductible/mooc-rr/module3/exo3/weekly_in_situ_co2_mlo.csv"
```
### 1. Réalisez un graphique qui vous montrera une oscillation périodique superposée à une évolution systématique plus lente.
Après un examen visiuel du fichier csv, l'on constate que les données commencent à la ligne 45. L'on peut donc "skipper" les 44 premières lignes. La première colonne correspond aux dates et la seconde aux concentration de CO2 en ppm.
```{r}
data_co2 = read.csv(url_data_co2_locale, skip = 44,
col.names = c("dates","CO2"), header = FALSE)
```
On vérifie le type de données dans chaque colonne.
```{r}
class(data_co2$dates)
class(data_co2$CO2)
```
Il faut convertir le vecteur *dates* au format date avec la fonction `as.Date`. Les dates renseignées étant déjà au bon format, cela ne devrait pas poser de problème. Les résultats sont placés dans un vecteur *dates2*:
```{r}
data_co2$dates2 = as.Date(data_co2$dates, format = "%Y-%m-%d")
```
On vérifie que cela a fonctionné:
```{r}
class(data_co2$dates2)
```
Y a-t-il des points manquants dans nos données ?
```{r}
na_records = apply(data_co2, 1, function (x) any(is.na(x)))
data_co2[na_records,]
```
On peut à présent représenter graphiquement la relation entre la concentration en CO2 et le temps:
```{r}
plot(data_co2$CO2 ~ data_co2$dates2, type = "l",
col = "blue", xlab = "Time", ylab = "CO2 in ppm")
```
On zoom sur la fin des données pour mieux voir la périodicité.
```{r}
plot(data_co2$CO2[c(3000:3208)] ~ data_co2$dates2[c(3000:3208)], type = "l",
col = "blue", xlab = "Time", ylab = "CO2 in ppm")
```
On peut donc constater la présence d'une périodicité, qui semble à première vue être annuelle, et d'une tendance générale à l'augmentation.
### 2. Séparez ces deux phénomènes. Caractérisez l'oscillation périodique. Proposez un modèle simple de la contribution lente, estimez ses paramètres et tentez une extrapolation jusqu'à 2025 (dans le but de pouvoir valider le modèle par des observations futures).
Pour décomposer cette série, deux modèles de décomposition s'offrent à nous: un modèle additif ou multiplicatif. La périodicité étant annuelle, nous allons estimer les moyennes et les écarts types annuels. Si aucune relation n'apparait entre ces deux paramètres, on appliquera un modèle additif pour décomposer la série, sinon on appliquera un modèle multiplicatif.
On charge le package `lubridate` qui va nous permettre d'utiliser la fonction `year` que nous allons utiliser pour isoler les concentrations en CO2 qui appartiennent toutes à la même année.
```{r include=FALSE}
library(lubridate)
```
On créé deux vecteurs vides, `moyenne_ann` et `et_ann` pour stocker la concentration en CO2 moyenne de chaque année et l'écart type associé
```{r}
moyenne_ann = rep(NA, length(min(year(data_co2$dates2)):max(year(data_co2$dates2))))
et_ann = rep(NA, length(min(year(data_co2$dates2)):max(year(data_co2$dates2))))
```
On effectue ensuite une boucle de 1958 (année minimale (`min(year(data_co2$dates2))`)) à 2021 (année maximale (`max(year(data_co2$dates2))`)). On définit un conteur `a` égal à 1 dont la valeur changera à chaque itération pour nous permettre de stocker les moyennes et les écarts types à la bonne position dans nos vecteurs vides `moyenne_ann` et `et_ann`. On définit également un vecteur *logique* `test` qui va nous permettre d'isoler dans la matrice `data_co2$CO2` les concentration en CO2 correspondant à l'année de l'itérations.
```{r}
a=1
for (i in min(year(data_co2$dates2)):max(year(data_co2$dates2))){
test = (year(data_co2$dates2) == i) == TRUE
moyenne_ann[a] = mean(data_co2$CO2[test == TRUE])
et_ann[a] = sd(data_co2$CO2[test == TRUE])
a=a+1
}
```
On peut à présent plotter les résultats:
```{r}
plot(moyenne_ann ~ et_ann, xlab = "annual mean", ylab = "standard deviation")
```
Et calculer le coefficient de corrélation de Pearson `r` entre les deux paramètres avec la fonction `cor`.
```{r}
r = cor(moyenne_ann, et_ann, method = "pearson")
r
```
Il n'y a pas de relation entre les deux variables, on peut donc utiliser un modèle additif pour décomposer la série.
Pour extraire la tendance des données, on applique une moyenne mobile simple d'ordre n = 52 (nombre de semaines dans une année) avec la fonction `movavg` du package `pracma`
```{r}
library(pracma)
trend = movavg(data_co2$CO2, 52, type = "s")
```
On plot le résultat
```{r}
plot(trend ~ data_co2$dates2, type = "l", col = "red", xlab = "", ylab = "", axes = FALSE)
par(new = T)
plot(data_co2$CO2 ~ data_co2$dates2, type = "l", col = "blue",
xlab = "Time", ylab = "CO2 in ppm")
legend(1, 400, legend = c("tendance", "raw data"),
col = c("red", "blue"), lty = 1, cex = 1)
```
On extrait ensuite la tendance des données avec la formule suivante $Y_{i Detrend} = Y_{i} - \hat{Y_{i}}$, avec $Y_{i}$ les concentrations en CO2 et $\hat{Y_{i}}$ la tendance estimé avec la moyenne mobile.
```{r}
data_co2$CO2dt = data_co2$CO2 - trend
```
On plot le résultat pour voir si cela a marché.
```{r}
plot(data_co2$CO2dt ~ data_co2$dates2, type = "l", col = "blue",
xlab = "Time", ylab = "Detrend CO2 in ppm")
```
Pour caractériser l'oscillation périodique, nous allons effectué une mesure d'autocorrelation avec la fonction `acf` sur les données détentancées:
```{r}
auto_cor = acf(data_co2$CO2dt, type = "correlation", lag.max = 100)
```
On observe un décalage d'environs 52-53 pas de temps, ce qui correspond à la durée d'une année en semaine. Nous avons donc une périodicité annuelle.
On va ensuite ajuster un polynome de degré 3 avec la fonction `polyfit` du package `pracma`.
```{r}
model = polyfit(seq(1,3208), data_co2$CO2, 3)
```
Voici les paramètres du modèle:
```{r}
model
```
Et sa représentation graphique.
```{r}
output = polyval(model, seq(1,3208))
plot(output ~ data_co2$dates2, type = "l", col = "red", axes = FALSE,
xlab = "", ylab = "", lwd = 2)
par(new = T)
plot(data_co2$CO2 ~ data_co2$dates2, type = "l", col = "blue",
xlab = "Time", ylab = "CO2 in ppm")
legend(1, 400, legend = c("model", "raw data"),
col = c("red", "blue"), lty = 1, cex = 1)
```
Malheureusement, nous ne sommes pas parvenu à ajuster le polynome en considérant les dates en tant que tel.
La dernière valeur de CO2 enregistrée correspond à la date:
```{r}
last_date = data_co2$dates2[length(data_co2$dates2)]
```
Pour extrapoler jusqu'en 2025, il nous faut estimer le nombre de semaine entre le 30 janvier 2021 et le 30 janvier 2025.
```{r}
date1 = as.Date("2021-01-30")
date2 = as.Date("2025-01-30")
difftime(date2, date1, units="weeks")
```
En arrondissant à 209, on peut relancer notre code précédent pour extrapoler jusqu'en 2025:
```{r}
output2 = polyval(model, seq(1,3208+209))
```
Avec le package `lubridate` et la fonction `weeks` l'on va pouvoir compléter notre vecteur `dates2` avec les dates manquantes entre 30-01-2021 et le 30-01-2025.
```{r}
library(lubridate)
date_new = c(data_co2$dates2,last_date+weeks(1:209))
last_date+weeks(1:209)
```
Et représenter graphiquement le résultat.
```{r}
plot(output2 ~ date_new, type = "l", col = "red", xlab = "", ylab = "", lwd = 2)
par(new = T)
plot(c(data_co2$CO2, rep(NA, length(last_date+weeks(1:209)))) ~ date_new, type = "l",
col = "blue", axes = FALSE, xlab = "Time", ylab = "CO2 in ppm")
legend(1, 400, legend = c("model", "raw data"), col = c("red", "blue"), lty = 1, cex = 1)
```
Notre modèle est loin d'être parfait et sous estime l'accroissement de la concentration en CO2.
This diff is collapsed.
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