La totalité des séances de TD seront effectuées sur R, dans l’environnement R-Studio, avec un Notebook pour pouvoir commenter précisément le code au fur et à mesure.
La note de TD sera basée sur un mini rapport économétrique, effectué sur un pays en particulier. Vous rendrez donc le code complet (légèrement commenté) et fonctionnel sur un Notebook lors de la dernière séance.
Objectifs : L’économétrie, et les statistiques de manière générale, sont là pour déterminer et/ou décrire de manière empirique (à partir d’observations) le comportement d’une variable, et les relations entre les variables. A partir des observations passées, on peut éventuellement prédire les observations futures (prévisions/forecasts) ou les conséquences attendues de la variation (un choc) d’une variable sur les autres.
Séance de TD :
La première étape de tout travail économétrique (après la réflexion) est de récolter des données, de les importer, et de faire quelques statistiques descriptives et quelques graphiques qui retracent les grands aspects de la dynamique.
Pour l’ensemble des séances, nous utiliserons les données de la MACROHISTORY DATABASE (https://www.macrohistory.net/database/), créée et entretenue par Jordà, Schularick et Taylor. La base de données contient des observations de 48 variables macroéconomiques depuis 1870 jusqu’en 2020 pour 18 pays avancés.
require(ggplot2)
## Le chargement a nécessité le package : ggplot2
## Warning: le package 'ggplot2' a été compilé avec la version R 4.5.1
require(tidyverse)
## Le chargement a nécessité le package : tidyverse
## Warning: le package 'tidyr' a été compilé avec la version R 4.5.1
## Warning: le package 'purrr' a été compilé avec la version R 4.5.1
## Warning: le package 'dplyr' a été compilé avec la version R 4.5.1
## Warning: le package 'stringr' a été compilé avec la version R 4.5.1
## Warning: le package 'lubridate' a été compilé avec la version R 4.5.1
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr 1.1.4 ✔ readr 2.1.5
## ✔ forcats 1.0.0 ✔ stringr 1.5.1
## ✔ lubridate 1.9.4 ✔ tibble 3.2.1
## ✔ purrr 1.1.0 ✔ tidyr 1.3.1
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag() masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
require(tinytext)
## Le chargement a nécessité le package : tinytext
## Warning in library(package, lib.loc = lib.loc, character.only = TRUE,
## logical.return = TRUE, : aucun package nommé 'tinytext' n'est trouvé
donnees <- readxl::read_excel(file.choose()) # choisir data_schularick.xlsx pour la séance de TD
head(donnees) #pour afficher les 6 première lignes de la base de données
La base de données data_schularick.xlsx est une base de données de
panel, c’est à dire que l’observation d’une variable
(une colonne) est liée à un individu (un pays, dans la colonne
country) et un indice temporel (une année, dans la colonne
year). On note généralement les observations d’une variable
\(x\) d’un individu \(i\) à la période \(t\) de la manière suivante : \(x_{it}\)
Le TD et le cours traitent des séries temporelles, c’est-à-dire des observations d’une variable \(x\) dans le temps \(t\) d’un seul individu. On note ces observations \(x_t\). Pour faire de l’économétrie de séries temporelles avec une base de panel, il suffit donc de sélectionner un unique individu à étudier, en l’occurence la France :
require(tidyverse)
donnees_france <- donnees %>%
filter(country == "France")
head(donnees_france)
On peut vérifier la couverture temporelle des données (les dates de début et de fin des observations) :
range(donnees_france$year)
## [1] 1870 2020
On peut également faire un graphique relativement simple, par exemple
de l’évolution démographique de la France. On utilisera le package
ggplot2 pour faire les graphiques car il est très flexible
si vous voulez rajouter des éléments simplement.
#ggplot(data, aes(x= axe_x , y=axe_y))+geom_line()
ggplot(donnees_france, aes(x=year, y=pop))+
geom_line(lty=1, lwd=1)+ # "lty" fait référence à linetype, "lwd" fait référence à linewidth
labs(x="Titre Axe X", y="Titre Axe Y", title="Titre du Graphique")+
theme_bw()
On voit bien l’impact de la guerre Franco-Prusse (1870-1871), de la Première et de la Seconde Guerre Mondiale sur l’évolution démographique française, ainsi que le baby-boom d’après guerre.
On peut également regarder la moyenne de la population sur la période :
mean(donnees_france$pop)
## [1] 47682.21
En moyenne, entre 1870 et 2020, la France comptait 47 millions d’habitants. Mais cette statistique n’a pas forcément de sens : il serait plus intéressant de connaître le taux de croissance moyen sur la période. Une bonne approximation du taux de croissance est donnée par la différence de logarithmes : \(\Delta x_t(\%) \simeq \log(x_t)-log(x_{t-1})=\Delta \log(x_t)\). Attention avec les logarithmes si vous avez des données négatives.
On peut donc créer une nouvelle colonne avec le taux de croissance la population. Par simplicité, on va également créer un nouvel objet qui ne contient que les années, les observations concernant la population française.
donnees_pop_france <- donnees_france %>%
select(year, pop)%>%
mutate(croissance_pop = (log(pop) - lag(log(pop))) *100 ) %>%#taux de croissance, arrondi à 4 décimales
mutate(croissance_pop_alt = c(NA, diff(log(pop))*100 ) )%>% #methode alternative pour calculer le taux de croissance avec diff de log
round(4)%>%
na.omit()
head(donnees_pop_france)
Attention : faire na.omit() retire l’ensemble des
lignes qui comportent une NA sur au moins une des colonnes. Si l’une de
vos colonnes comporte des NAs entre 1870 et 1990, cela va retirer toutes
les lignes jusqu’en 1991 (d’où l’utilité de selectionner uniquement
quelques colonnes qui ont des données sur l’ensemble de la période avant
de faire na.omit()).
On calcule le taux de croissance moyen sur la période :
moyenne = mean(donnees_pop_france$croissance_pop) # na.rm=T permet de retirer les valeurs manquantes (NA) qui empêchent de calculer la moyenne
print(moyenne)
## [1] 0.3717807
Le taux de croissance annuel moyen de la population française sur la période était de 0.37%.
Et on peut refaire le même graphique, mais avec le taux de croissance de la population :
donnees_pop_france %>%
ggplot(aes(x=year, y=croissance_pop))+
geom_line()+
geom_hline(yintercept=0, lty=2)+ # pour rajouter une ligne horizontale (hline) à 0% de croissance pour savoir si la croissance est positive ou non
geom_hline(yintercept=moyenne, lty=2, color="red")+
labs(x="", y="", title="Taux croissance population")+
theme_bw()
On peut également regarder l’écart moyen à la moyenne, ou écart-type. Visuellement, ça revient à calculer la moyenne de l’aire colorée suivante :
moyenne <- mean(donnees_pop_france$croissance_pop)
df <- donnees_pop_france %>%
arrange(year) %>%
mutate(
moyenne = moyenne,
ymin = pmin(croissance_pop, moyenne),
ymax = pmax(croissance_pop, moyenne)
)
ggplot(df, aes(x = year)) +
geom_ribbon(aes(ymin = ymin, ymax = ymax), fill = "grey10", alpha = 0.25) +
geom_line(aes(y = croissance_pop), color = "black") +
geom_hline(yintercept = 0, lty = 2) +
geom_hline(yintercept = moyenne, lty = 2, color = "red") +
labs(x = "", y = "", title = "Taux de croissance de la population — écart à la moyenne") +
theme_bw()
L’écart-type (standard deviation en anglais) se calcule de la façon suivante :
sd(donnees_pop_france$croissance_pop)
## [1] 0.7136196
Donc, en moyenne, les observations du taux de croissance s’écartent
de 0.71 points de pourcentages de la moyenne de long-terme du taux de
croissance. On peut également regarder davantage de statistiques avec
summary :
summary(donnees_pop_france)
## year pop croissance_pop croissance_pop_alt
## Min. :1871 Min. :37679 Min. :-3.4743 Min. :-3.4743
## 1st Qu.:1908 1st Qu.:40122 1st Qu.: 0.1792 1st Qu.: 0.1792
## Median :1946 Median :41920 Median : 0.4518 Median : 0.4518
## Mean :1946 Mean :47744 Mean : 0.3718 Mean : 0.3718
## 3rd Qu.:1983 3rd Qu.:55871 3rd Qu.: 0.6133 3rd Qu.: 0.6133
## Max. :2020 Max. :67140 Max. : 2.4716 Max. : 2.4716
On voit que la médiane, quartiles et extrêmes (minimum, maximum) s’affichent simplement. On peut les calculer aussi de manière indépendantes :
quantile(donnees_pop_france$croissance_pop, c(0.25, 0.5, 0.75))
## 25% 50% 75%
## 0.1792 0.4518 0.6133
min(donnees_pop_france$croissance_pop)
## [1] -3.4743
max(donnees_pop_france$croissance_pop)
## [1] 2.4716
Et on peut aussi faire un tableau qui reprend toutes les statistiques qu’on souhaite :
donnees_pop_france %>%
summarize(
"Moyenne" = mean(croissance_pop),
"Ecart-Type" = sd(croissance_pop),
"Variance" = var(croissance_pop),
"Minimum"=min(croissance_pop),
"Maximum"=max(croissance_pop)
)%>%
round(2)
donnees_pop_france%>%
ggplot(aes(y=croissance_pop))+
geom_boxplot(
#outlier.shape=NA
)+
theme_bw()
Quand on a un nombre suffisamment important d’observations, on peut éventuellement calculer des moyennes et variances mobiles (estimer des moyennes et variances dans des fenêtres roulantes) :
require(zoo)
## Le chargement a nécessité le package : zoo
## Warning: le package 'zoo' a été compilé avec la version R 4.5.1
##
## Attachement du package : 'zoo'
## Les objets suivants sont masqués depuis 'package:base':
##
## as.Date, as.Date.numeric
donnees_pop_france2 <- donnees_pop_france%>%
mutate(roll_mean = rollapply(croissance_pop,FUN=mean, width=5, fill=NA, align="center"),
roll_var =rollapply(croissance_pop, FUN=var, width=5, fill=NA, align="center"))
head(donnees_pop_france2)
donnees_pop_france2%>%
ggplot(aes(x=year, y=croissance_pop))+
geom_line()+
geom_line(aes(y=roll_mean), color="steelblue", lwd=1)
## Warning: Removed 4 rows containing missing values or values outside the scale range
## (`geom_line()`).
donnees_pop_france2%>%
ggplot(aes(x=year, y=roll_var))+
geom_line(lwd=1)
## Warning: Removed 4 rows containing missing values or values outside the scale range
## (`geom_line()`).
La variance estimée dans des fenêtres roulantes est souvent estimée pour calculer la dynamique du risque (d’un actif par exemple). La moyenne mobile quant à elle a beaucoup d’usages : la moyenne mobile du taux de croissance permet notamment de capter les cycles économiques, donc à capturer la tendance dans la dynamique d’une série temporelle.
La tendance d’une série fait référence au fait qu’une série peut, pendant une période relativement longue, suivre une tendence (haussière ou baissière) et cette tendance doit être prise en compte économétriquement pour faire des prévisions ou pour faire des régressions (souvent, en la retirant).
Si, par exemple, vous voulez retirer à la série sa moyenne mobile de long-terme (ici, 5 ans), vous pouvez faire :
test<-donnees_pop_france2 %>%
mutate(detrended_pop_growth = croissance_pop - roll_mean)
head(test)
test%>%ggplot(aes(x=year, y=detrended_pop_growth))+
geom_line(lwd=1)
## Warning: Removed 4 rows containing missing values or values outside the scale range
## (`geom_line()`).
Et la série détrendée ressemble davantage à une série avec un comportement stationnaire (voir Séance 2 TD).