Script : 47_ZIP_GLMM_resultats

Ce script a pour objectif d’évaluer l’impact des différents réseaux sur les tendances des indicateurs régionaux. Il a également l’objectif de regarder l’impact des changements de protocoles sur les stations au cours des années d’études grâce aux zero inflated poisson GLMM.

1 Installation

1.1 Chargement des packages, fonctions et des données

library(lme4)
library(aspe)
library(tidyverse)
library(aspe)
library(sjstats)
library(gt)
library(glmmTMB)
load(file = "../processed_data/selection_especes.rda")
load(file = "../processed_data/selection_pop_ope.rda")
load(file = "../processed_data/donnees_densite_eff_abs.rda")
# source(file = "../R/lm_application_modele.R")
# source(file = "../R/lm_calcul_modele.R")
source(file = "../R/zip_glmm_calcul_modele.R")
source(file = "../R/zip_glmm_application_modele.R")
rdata_tables <- misc_nom_dernier_fichier(
  repertoire = "../../../../Liste_rouge_BFC/raw_data",
  pattern = "^tables")
load(rdata_tables) # Chargement des données 

2 Modèles Linéaires Généralisés à effets Mixtes (GLMM)

2.1 Introduction

Les modèles linéaires généralisés à effets mixtes combinent les caractéristiques des modèles linéaires généralisés (modéliser des variables non-normalement distribuées, spécialement des données binaires et de comptage) et des modèles à effets mixtes (modéliser des données groupées).

Nous utiliserons dans cette étude le package glmmTMB pour ajuster des modèles mixtes. La fonction glmmTMB de ce package estime les paramètres d’un modèle linéaire généralisé à effets mixtes. Les formules utilisées par glmmTMB suivent la forme reponse ~ predicteurs, avec une syntaxe spécifique pour les effets aléatoires.

La distribution de Poisson peut être ici utilisée (valeurs entières supérieures ou égales à 0. glmmTMB(y ~ x1 + x2 + …, data = …, family = poisson(link=log))

2.2 Pré-traitements ZIP_GLMM

Afin d’appliquer les modèles GLMM, il est nécessaire de construire un jeu de données contenant les valeurs des effectifs, les espèces, les stades, les pop_id, mais aussi les types de réseaux, les surfaces d’opérations et les protocoles de pêches. Nous utilisons dans un premier temps, le jeu de données relatifs aux effectifs des opérations de pêches (ope_effectifs) car nous souhaitons observer les effets des réseaux et des protocoles sur les résultats des opérations.

liste_periodes_etude <- list(c(2007, 2025), 
                             c(2015, 2025)) # Liste des périodes (chaque période est un vecteur avec l'année de début et l'année de fin) 

Nous construisons un jeu de données complet :

# preparer la table pour jointure
ope_selection <- ope_selection %>%
  dplyr::select(ope_id, pop_id, sta_id)

# Ajout des coordonnées pour jointure avec df pour future analyse autocorrelation spatiale
coord_sta_id <- point_prelevement %>%
  filter(pop_id %in% pop_serie_tempo) %>%
  rename(x = pop_coordonnees_x, y = pop_coordonnees_y) %>%
  select(pop_id, x, y)

ope_effectif_glm <- esp_ope_selection %>%
  mef_ajouter_type_protocole() %>%
  mef_ajouter_ope_date() %>%
  left_join(ope_selection, by = "ope_id") %>%
  rename(valeur = lop_effectif, annee = annee.x) %>%
  left_join(coord_sta_id, by = "pop_id") %>%
  mutate(
    valeur = as.numeric(valeur) ,
    annee = as.numeric(annee),
    ope_surface_calculee = as.numeric(ope_surface_calculee) ,
    pro_libelle = as.factor(pro_libelle),
    pop_id = as.factor(pop_id),
    sta_id = as.factor(sta_id),
    indicateur = "effectif_total"
  ) %>%
  mutate(julian = lubridate::yday(ope_date)) %>% #  Ajout de la date de pêche codée de 1 à 365
  select(
    ope_id,
    valeur,
    esp_code_alternatif,
    annee,
    ope_surface_calculee,
    pro_libelle,
    pop_id,
    sta_id,
    indicateur,
    x,
    y,
    ope_date, 
    julian
  ) %>% 
  rename(espece = esp_code_alternatif)

2.3 Application du modèle GLMM

Afin d’exécuter l’analyse, deux fonctions ont été créer : zip_glmm_calcul_modele (en charge de calculer les valeurs des modèles ZIPGLMM) et zip_glmm_application_modele (le but étant d’excécuter la fonction zip_glm_calcul_modele pour l’ensemble des combinaisons periodes-especes-stade-indicateur). Les analyses prennent en considération les données à l’échelle de l’opération.

zip_glmm_resultats <- zip_glmm_application_modele(data = ope_effectif_glm,
                                          liste_periodes = liste_periodes_etude)
zip_glmm_resultats_annee <- zip_glmm_resultats %>% 
  filter(row_name == "annee") %>% 
  select(periode,
         esp_code_alternatif,
         p_value,
         Estimate,
         sig, 
         family) %>% 
  mutate(trend = case_when(
      Estimate > 0 ~ "\U2197",
      Estimate < 0 ~ "\U2198",
      TRUE ~ "."))
# Filtrer les données selon les critères spécifiés
zip_glmm_resultats_format <- zip_glmm_resultats_annee %>%
  filter((esp_code_alternatif == "ANG" & periode == "2007-2025") |
    (esp_code_alternatif %in% c(c("ABL","BAF","BLN","BRB", "BRE","BRO","CCO","CHA","CHE", "EPI", "EPT", "GAR", "GOU","HOT","LOF",   "LOR", "LOT","LPM" ,"LPP", "OBR", "PER", "ROT", "SAT", "SPI", "TAN", "TOX", "TRF","VAI","VAN","VAR")) & periode == "2007-2025"))

Construction d’un tableau récapitulatif des résultats du modèle GLMM :

df_zip_glmm_resultats <- zip_glmm_resultats_format %>%
  select(esp_code_alternatif, periode, trend, sig, Estimate, family) %>%
  mutate(Estimate = round(Estimate, digits = 3)) %>%
  rename(
    "Code Espèce" = esp_code_alternatif,
    "Periode" = periode,
    "Tendance" = trend,
    "Coefficient" = Estimate,
    "Significativité" = sig,
    "Famille de distribution" = family
  ) %>%
  arrange(`Code Espèce`) # Ordonner par espèce, indicateur et stade

# Lignes positives et significatives
i_vert  <- which(
  df_zip_glmm_resultats$Tendance == "\U2197" &
    df_zip_glmm_resultats$Significativité %in% c("*", "**", "***")
)
# Lignes négatives et significatives
i_rouge <- which(
  df_zip_glmm_resultats$Tendance == "\U2198" &
    df_zip_glmm_resultats$Significativité %in% c("*", "**", "***")
)

tab_zip_glmm_resultats <- df_zip_glmm_resultats %>%
  flextable::flextable() %>%
  flextable::autofit() %>%
  flextable::colformat_int(j = c(1, 3), big.mark = " ") %>%
  flextable::theme_apa() %>%
  flextable::bg(i = i_vert, bg = "#c6efce") %>%   # vert clair
  flextable::bg(i = i_rouge, bg = "#ffc7ce") %>%   # rouge clair
  flextable::set_caption("Synthèse des tendances des populations de poissons d'eau douce de BFC")

tab_zip_glmm_resultats
Table 1: Synthèse des tendances des populations de poissons d'eau douce de BFC

Code Espèce

Periode

Tendance

Significativité

Coefficient

Famille de distribution

ABL

2007-2025

***

0.13

truncated_nbinom2

BAF

2007-2025

***

0.14

truncated_nbinom2

BLN

2007-2025

NS

0.01

truncated_nbinom2

BRB

2007-2025

***

0.04

nbinom2

BRO

2007-2025

NS

-0.01

nbinom2

CHA

2007-2025

***

0.06

truncated_nbinom2

CHE

2007-2025

***

0.08

truncated_nbinom2

GAR

2007-2025

***

0.08

truncated_nbinom2

GOU

2007-2025

***

0.11

truncated_nbinom2

HOT

2007-2025

***

0.02

nbinom2

LOF

2007-2025

***

0.07

truncated_nbinom2

PER

2007-2025

***

0.08

truncated_nbinom2

ROT

2007-2025

***

0.09

nbinom2

SPI

2007-2025

***

0.11

nbinom2

TAN

2007-2025

***

0.03

nbinom2

TRF

2007-2025

***

0.04

truncated_nbinom2

VAI

2007-2025

***

0.04

nbinom2

VAN

2007-2025

NS

-0.01

nbinom2

3 Sauvegarde

# save(glmm_resultats_format,
#      reg_indicateur_lrr_tendances_lm,
#      reg_indicateur_lrr_tendances_mk_st,
#      tab_glmm_resultats,
#      tab_reg_indicateur_lrr_tendances_lm,
#      tab_reg_indicateur_lrr_tendances_mk_st,
#      file = "../processed_data/mk_glmm_lm_tendances.rda")