10  Doubles différences

10.1 Méthode des doubles différences

Cliquer ici pour télécharger la présentation.

Pour le cas d’études auquel on s’intéresse, on n’a pas une seule date de mise en oeuvre de l’intervention à évaluer, mais un échelonnement des dates de mises en oeuvre. En d’autres termes, les aires protégées ont été créées à des dates différentes. Pour ce type de cas, on va utiliser une variante de la méthode de différence de doubles différences, qui est dite “échelonnées” (staggered diff-in-diff). Cette méthode a été conceptualisée par Callaway et Sant’Anna (2021b) et ces mêmes auteurs ont programmé mise en oeuvre pour R dans la librairie {did} (Callaway and Sant’Anna 2021a).

10.2 Application aux polygones d’aires protégées

La spécification employée peut se traduire de la manière suivante :

On l’applique aux aires protégées et à leur déforestation entre 1990 et 2021. On commence par préparer le jeu de données tel qu’attendu par {did}, de sorte à obtenir :

Code
library(did) # Pour des doubles-différences échelonnées
library(tidyverse) # Pur faciliter la manipulation de données
library(lubridate) # Pour modifier les dates
library(gt) # Pour de jolis tableaux

load("data/ch3_AP_Vahatra.rds") # On charge les données préparées au chapitre 3
options(scipen = 999) # On désactive les notations scientifiques

# On prépare le jeu de données au format attendu par {did}
ap_did <- AP_Vahatra %>%
  select(nom, date_creation, num_atlas = num_atlas_, starts_with("TMF"),
         cat_iucn = cat__iucn) %>%
  mutate(annee_creation = year(date_creation)) %>%
  pivot_longer(cols = starts_with("TMF"), 
               names_to = "TMF_variable", 
               values_to = "TMF_value") %>%
  mutate(annee = str_extract(TMF_variable, "[:digit:]{4}"),
         annee = as.numeric(annee),
         traitee = ifelse(annee > annee_creation, 1, 0),
         TMF_variable = str_remove(TMF_variable, "TMF"),
         TMF_variable = str_remove(TMF_variable, "_[:digit:]{4}"),
         group = 1) %>%
  pivot_wider(names_from = TMF_variable, values_from = TMF_value)

gt(slice(ap_did, 20:30)) %>%
  tab_header(title = "Jeu de données 1990-2020 préparé pour {did}",
             subtitle = "Echantillon des 10 lignes") %>%
  tab_source_note("Source : Aires protégées d'AP Vahatra, données TMF")
Jeu de données 1990-2020 préparé pour {did}
Echantillon des 10 lignes
nom date_creation num_atlas cat_iucn annee_creation annee traitee group deg_HA ly_HA deg_ratio ly_ratio
Agnakatrika 2015-04-28 54 VI 2015 2009 0 1 3.51 4.50 0.008347603 0.0107020548
Agnakatrika 2015-04-28 54 VI 2015 2010 0 1 5.04 6.21 0.013160987 0.0162162162
Agnakatrika 2015-04-28 54 VI 2015 2011 0 1 1.62 4.05 0.004230317 0.0105757932
Agnakatrika 2015-04-28 54 VI 2015 2012 0 1 14.58 16.56 0.038072855 0.0432432432
Agnakatrika 2015-04-28 54 VI 2015 2013 0 1 18.36 11.61 0.047943596 0.0303172738
Agnakatrika 2015-04-28 54 VI 2015 2014 0 1 0.54 1.62 0.001410106 0.0042303173
Agnakatrika 2015-04-28 54 VI 2015 2015 0 1 3.33 5.67 0.008695652 0.0148061105
Agnakatrika 2015-04-28 54 VI 2015 2016 1 1 6.30 15.12 0.016451234 0.0394829612
Agnakatrika 2015-04-28 54 VI 2015 2017 1 1 21.24 31.14 0.055464160 0.0813160987
Agnakatrika 2015-04-28 54 VI 2015 2018 1 1 2.16 0.18 0.005640423 0.0004700353
Agnakatrika 2015-04-28 54 VI 2015 2019 1 1 2.34 0.18 0.006110458 0.0004700353
Source : Aires protégées d'AP Vahatra, données TMF

Pour rappel, on récapitule les années d’assignation :

Code
ap_did %>%
  select(nom, annee_creation) %>%
  filter(annee_creation > 1990) %>%
  unique() %>%
  group_by(annee_creation) %>%
  summarize(`Nombre d'AP créées cette année` = n()) %>%
  gt() %>%
  tab_header(title = "Années de création des aires protégées")
Années de création des aires protégées
annee_creation Nombre d'AP créées cette année
1991 1
1997 9
1998 2
2002 1
2003 1
2004 1
2007 2
2011 2
2012 1
2015 53

On passe maintenant à l’estimation pour la déforestation.

Code
attgt_apmada_def <- att_gt(yname = "ly_ratio",
                        tname = "annee",
                        idname = "num_atlas",
                        gname = "annee_creation",
                        data = ap_did,
                       control_group = "notyettreated")
ggdid(attgt_apmada_def) +
  theme(axis.text.x =  element_text(angle = 45, hjust = 1))

Peu d’effet ressortent graphiquement.

On aggrège les effets de traitment pour l’ensemble de la période

Code
agg.simple <- aggte(attgt_apmada_def, type = "simple", na.rm = TRUE)

summary(agg.simple)

Call:
aggte(MP = attgt_apmada_def, type = "simple", na.rm = TRUE)

Reference: Callaway, Brantly and Pedro H.C. Sant'Anna.  "Difference-in-Differences with Multiple Time Periods." Journal of Econometrics, Vol. 225, No. 2, pp. 200-230, 2021. <https://doi.org/10.1016/j.jeconom.2020.12.001>, <https://arxiv.org/abs/1803.09015> 

     ATT    Std. Error     [ 95%  Conf. Int.] 
 -0.0001         0.001    -0.0021      0.0019 


---
Signif. codes: `*' confidence band does not cover 0

Control Group:  Not Yet Treated,  Anticipation Periods:  0
Estimation Method:  Doubly Robust
Code
# gt(summary(agg.simple)) %>%
#   tab_header(title = "Effet aggrégé pour les traités de 1991 à 2011") %>%
#   tab_footnote("Résultats encore préliminaire à confirmer (erreurs possibles)")

Pour la déforestation, on ne voit aucun effet net des aires protégées (ATT très faible et non significativement différent de 0). Mais la taille de l’échantillon est extrêmement restreinte et il est on ne peut pas vraiment en tirer d’interprétation.

Mise en garde : l’échantillon utilisé à titre d’exemple ici est trop petit pour cette méthode. Il convient de préférer une analyse avec un plus grand nombre d’observation, par exemple en se focalisant sur des pixels ou des cellules.

10.3 Application aux données par mailles

L’analyse reposant par aire protégée rassemble un nombre trop faible d’observations. On va donc procéder en réalisant l’analyse par maille. On va donc avoir une observation par hexagone de 5 km2, pour lequel on dispose du couvert forestier par année, de l’année de création de l’aire protégée. La première analyse est une première régression simple n’incluant pas de variables de contrôle. On commence par visualiser les tendances.

Code
library(sf)
load("data/grille_mada_AP.rds") # On charge les données préparées au chapitre 4

# On "déplie" les données de déforestation, ce qui produit un format long
grille_mada_AP_long <- grille_mada_AP %>%
  unnest(cols = treecover_area_and_emissions)

# On passe ces paramètres au package did
att_mailles_def <- att_gt(yname = "treecover",
                         tname = "years",
                         idname = "assetid",
                         gname = "an_creation",
                         data = grille_mada_AP_long,
                         control_group = "notyettreated")
# On visualise les résultats.
ggdid(att_mailles_def) +
  theme(axis.text.x =  element_text(angle = 45, hjust = 1))

On aggrège à nouveau les résultats de traitements pour l’ensemble de la période, ce qui produit le résumé suivant.

Code
agg.simple <- aggte(att_mailles_def, type = "simple", na.rm = TRUE)

summary(agg.simple)

Call:
aggte(MP = att_mailles_def, type = "simple", na.rm = TRUE)

Reference: Callaway, Brantly and Pedro H.C. Sant'Anna.  "Difference-in-Differences with Multiple Time Periods." Journal of Econometrics, Vol. 225, No. 2, pp. 200-230, 2021. <https://doi.org/10.1016/j.jeconom.2020.12.001>, <https://arxiv.org/abs/1803.09015> 

     ATT    Std. Error     [ 95%  Conf. Int.]  
 -3.4758        0.7226    -4.8921     -2.0595 *


---
Signif. codes: `*' confidence band does not cover 0

Control Group:  Not Yet Treated,  Anticipation Periods:  0
Estimation Method:  Doubly Robust

Les résultats indiquent une baisse de la déforestation. TODO : coefficents à interpréter.

10.4 Doubles différences échelonnées avec contrôles

L’analyse précédente ne tient pas compte de certains facteurs dont on a vu qu’ils pouvaient influencer à la fois la sélection, mais aussi la déforestation, en particulier l’altitude, la qualité des sols, le temps de parcours à la ville la plus proche, ou encore le caractère accidenté du terrain. On va rajouter ces variables comme contrôles, en continuant à comparer les aires protégées créées avant 2015 avec celles créées en 2015.

Code
# On passe ces paramètres au package did
att_mailles_def_crtl <- att_gt(yname = "treecover",
                               tname = "years",
                               idname = "assetid",
                               gname = "an_creation",
                               xformla = ~ distance_minutes_5k_110mio + 
                                 mean_clay_5_15cm + tri_mean + elevation_mean,
                               data = grille_mada_AP_long,
                               control_group = "notyettreated")
# On visualise les résultats.
ggdid(att_mailles_def_crtl) +
  theme(axis.text.x =  element_text(angle = 45, hjust = 1))

On aggrège les résultats.

Code
agg.simple <- aggte(att_mailles_def_crtl, type = "simple", na.rm = TRUE)

summary(agg.simple)

Call:
aggte(MP = att_mailles_def_crtl, type = "simple", na.rm = TRUE)

Reference: Callaway, Brantly and Pedro H.C. Sant'Anna.  "Difference-in-Differences with Multiple Time Periods." Journal of Econometrics, Vol. 225, No. 2, pp. 200-230, 2021. <https://doi.org/10.1016/j.jeconom.2020.12.001>, <https://arxiv.org/abs/1803.09015> 

     ATT    Std. Error     [ 95%  Conf. Int.] 
 -2.2241        1.1701    -4.5176      0.0693 


---
Signif. codes: `*' confidence band does not cover 0

Control Group:  Not Yet Treated,  Anticipation Periods:  0
Estimation Method:  Doubly Robust

L’ajout des quatre variables de contrôle (temps de trajet à une ville, altitude, caractère accidenté du terrain et teneur en argile du sol) réduit l’effet moyen sur les traités (ATT) estimé et conduit l’intervalle de confiance à englober 0, ce qui nous empêche de conclure avec assurance à la présence d’effets significatifs.

On doit toutefois souligner : 1) Qu’on s’appuie ici sur les données GFC et qu’on ne dispose donc de recul que depuis 2000, à la différence des données TMF qui démarrent en 1990, avec toutefois une fiabilité limitée pour la première décennie ; 2) que la méthode prenant comme contrefactuel les zones situées dans des aires protégées en 2015 réduit la taille d’échantillon et la période d’observation, par opposition à l’approche consistant à utiliser comme contrefactuel des zones non traitées, par exemples celles désignées par matching dans le [Chapitre Chapter 8

Une autre solution consisterait à utiliser des matching pour utiliser comme contrefactuel des zones hors aires protégées.