PROCÉDURE POUR DÉTÉRMINER LES DETENTES DE CROISSANCE PAR LA MÉTHODE DU BOUNDARY LINE

Étape 1 : Définir les variables de l’équation

\(x\) (Prior Growth - PG) : C’est la croissance antérieure. Il s’agit de la moyenne des largeurs de cernes des années précédant l’année que l’on analyse (souvent la moyenne des 3 à 10 années précédentes).

\(Y\) (Boundary Line) : C’est la valeur théorique maximale du ratio de changement de croissance (ou de la croissance actuelle, selon la normalisation de l’article) que l’arbre pourrait atteindre pour une croissance antérieure \(x\) donnée. Le coefficient \(1523.7\) est un paramètre spécifique au sapin dans cette étude.

\(e\) : La constante mathématique (environ \(2.718\)).

Étape 2 : Calculer la croissance antérieure (\(x\)) et la croissance actuelle

Pour une année donnée \(t\) :

Calculez la croissance antérieure moyenne (\(x\)) : moyenne des largeurs de cernes des années \(t-1\) à \(t-3\) (ou \(t-10\), selon le protocole exact de l’article).

Calculez le changement de croissance réel observé pour l’année \(t\). Souvent, on calcule un ratio de croissance en pourcentage : \[ \text{Ratio}_{\text{réel}} = \frac{\text{Croissance antérieure moyenne } (x)}{\text{Croissance en année } t} \times 100 \]

Étape 3 : Calculer la ligne de frontière (\(Y\))

Intégrez votre valeur \(x\) dans l’équation de l’article : \[ Y = 1523.7 \cdot e^{-1.414 x} \]

Étape 4 : Déterminer s’il y a détente (Release) ou non

Pour savoir s’il y a une détente, on compare le ratio de croissance réel de l’arbre à un pourcentage de la ligne de frontière \(Y\). Dans la méthode de Black & Abrams, on distingue généralement deux types de détentes :

Si la croissance réelle de l’arbre dépasse \(50\%\) de la ligne de frontière (\(Y\)).

Condition : \[ \text{Ratio}_{\text{réel}} > 0.5 \times Y \]

Si la croissance réelle est supérieure à un seuil bas (souvent \(10\%\) ou \(20\%\) de \(Y\)) mais inférieure à \(50\%\).

Condition : \[ 0.2 \times Y \leq \text{Ratio}_{\text{réel}} < 0.5 \times Y \]

Si la croissance réelle est inférieure au seuil de détente mineure (ex : \(\text{Ratio}_{\text{réel}} < 0.2 \times Y\)).

CODAGE DANS R

Mes données

str(bai.GC)
tibble [55,439 × 10] (S3: tbl_df/tbl/data.frame)
 $ Site  : Ord.factor w/ 8 levels "T87"<"T52"<"T77"<..: 5 5 5 5 5 5 5 5 5 5 ...
 $ Esp   : Factor w/ 3 levels "BOP","ERR","SAB": 1 1 1 1 1 1 1 1 1 1 ...
 $ Id    : chr [1:55439] "APY8A" "APY8A" "APY8A" "APY8A" ...
 $ Year  : int [1:55439] 1783 1784 1785 1786 1787 1787 1788 1788 1789 1789 ...
 $ bai   : num [1:55439] 80.7 93.6 127.2 118.2 75.5 ...
 $ Source: chr [1:55439] "BOPT83_comb.rwl2" "BOPT83_comb.rwl2" "BOPT83_comb.rwl2" "BOPT83_comb.rwl2" ...
 $ Fin   : int [1:55439] 2023 2023 2023 2023 2023 2023 2023 2023 2023 2023 ...
 $ M1    : num [1:55439] 69.8 75.1 82.6 86.2 74.8 ...
 $ M2    : num [1:55439] 99.4 95.4 90.5 84 82 ...
 $ GC    : num [1:55439] 42.37 27.03 9.6 -2.52 9.67 ...

On Modifie les BD et on filtrer les especes

bai_brute_3 <- all_rwl_3_unite_2 %>% 
                    relocate(Site, Esp, Id, Year, Rwl) %>% 
                    mutate(
                           Esp = factor(Esp),   # Espèce → factor
                           Site = factor(Site)) %>%   # Site → factor (pour ggplot)
                           filter(Esp %in% c("ERR","BOP","SAB"))

On calcule le GC pour chaque individus

On calcul le Ratio et BL (bounadary line) pour chaque individus et chaque année

bai.GC_BL <- bai_brute_GC %>%
              arrange(Year) %>%  # trie Year croissant PAR GROUPE
              group_by(Site,Esp,Id) %>%   # On regroupe les données par Site, Esp et Id et Year
              mutate(
                 Ratio = (Rwl*100)/M1 ,        ## On calcule le ratio réel (M1 est le x ou prior = moyenne du bai des 10 années précédentes)
                
                 BL = case_when(
                             Esp == "SAB" ~ 1523.7 * exp(-1.414 * M1),  # ON CALCUL LE BL QUE POUR pour SAB
                              TRUE      ~ NA_real_                        # NA pour les autres espèces
                             ), 
                      
                 Release = case_when(                                              # On travail sur les seuils pour définir les détentes 
                                    Ratio > 0.5 * BL                  ~ "Major",     # Détente majeure
                                    Ratio >= 0.2 * BL & Ratio <= 0.5 * BL ~ "Moderate",  # Détente mineure/modérée
                                    Ratio < 0.2 * BL                  ~ "RAS",     # Pas de détente (Sans détente)
                                          TRUE                    ~ "RAS"      # Sécurité pour les valeurs manquantes (NA)
                                      ), 
                 Seuil_Moderate = 0.2 * BL,       
                 Seuil_major = 0.5 * BL
             ) %>%    
             filter(Esp=="SAB") %>% 
             ungroup()  # On degroupe les données dans la BD
ggplot(bai.GC_BL) +
  # Les points colorés selon le type de Release
  geom_point(aes(M1, GC, color = Release)) +
  
  # Ajout de la courbe théorique BL (100%)
  geom_function(fun = function(x) 1523.7 * exp(-1.414 * x), 
                color = "black",      
                linewidth = 1,         
                linetype = "solid") +  
  
  # Ajout de la courbe Major (0.5 * BL)
  geom_function(fun = function(x) 0.5 * 1523.7 * exp(-1.414 * x), 
                color = "red", 
                linewidth = 0.6, 
                linetype = "solid") +  
  
  # Ajout de la courbe Moderate (0.2 * BL)
  geom_function(fun = function(x) 0.2 * 1523.7 * exp(-1.414 * x), 
                color = "orange", 
                linewidth = 0.6, 
                linetype = "solid") +
  
  # Noms des axes
  labs(x = "M1 (Prior growth)", y = "GC (percent growth change)", color = "Type de détente") +
  
  theme_minimal() +
  # Personnalisation pour forcer l'affichage des axes x et y
  theme(
    # Ajoute les lignes continues pour les axes x et y
    axis.line = element_line(color = "black", linewidth = 0.5),
    # Ajoute les petites graduations (ticks) sur les axes
    axis.ticks = element_line(color = "black"),
    axis.ticks.length = unit(2, "pt"),
    # Met en forme le texte des axes (les chiffres)
    axis.text = element_text(color = "black", size = 10),
    # Met en gras les titres des axes
    axis.title = element_text(color = "black", size = 12, face = "bold")
  )

Représentation graphique

Représentation graphique de tous les sites

ggplot(bai.GC_BL) +
  # Les points colorés selon le type de Release
  geom_point(aes(M1, GC, color = Release)) +
  # Ajout de la courbe théorique
  geom_function(fun = function(x) 1523.7 * exp(-1.414 * x), 
                color = "black",      
                linewidth = 1,         
                linetype = "solid") +  
  # Noms des axes
  labs(x = "M1 (Prior growth)", y = "GC (percent growth change)", color = "Type de détente") +
  # Limiter les axes pour ne commencer qu'à 0 (optionnel, si pertinent pour vos données)
  # xlim(0, NA) + ylim(0, NA) +
  
  theme_minimal() +
  # Personnalisation pour forcer l'affichage des axes x et y
  theme(
    # Ajoute les lignes continues pour les axes x et y
    axis.line = element_line(color = "black", linewidth = 0.5),
    # Ajoute les petites graduations (ticks) sur les axes
    axis.ticks = element_line(color = "black"),
    axis.ticks.length = unit(2, "pt"),
    # Met en forme le texte des axes (les chiffres)
    axis.text = element_text(color = "black", size = 10),
    # Met en gras les titres des axes
    axis.title = element_text(color = "black", size = 12, face = "bold")
  )

Interpetation : Il n’y a un problème car la boundary line qui doit être la limite supérieure et donc etre toujours supérieur à la de des valeurs mais elle est quasi

Représentation par site

Calcul GC & BL par Espèce par année

bai.GC_BL_YearMean <- bai.GC_BL %>%
           group_by(Site, Esp, Year) %>%  # Regrouper les données par site, espèce et année
            summarise(
                        n_obs = n(),  # Nombre d’observations dans chaque groupe
                        Mean.GC = mean(GC, na.rm = TRUE),  # Moyenne de GC en ignorant les valeurs manquantes
                        Mean.BL = mean(BL, na.rm = TRUE),  # Moyenne de GC en ignorant les valeurs manquantes
                        Mean.Ratio = mean(Ratio, na.rm = TRUE),  # Moyenne de GC en ignorant les valeurs manquantes
                        SE.GC = case_when(
                                  n_obs > 1 ~ sd(GC, na.rm = TRUE) / sqrt(n_obs),  # Erreur standard si au moins 2 observations
                                  TRUE ~ 0  # Sinon, erreur standard nulle (ou NA_real_ si tu préfères)
                                                                 ),
                        SE.BL = case_when(
                                   n_obs > 1 ~ sd(BL, na.rm = TRUE) / sqrt(n_obs),  # Erreur standard si au moins 2 observations
                                    TRUE ~ 0  # Sinon, erreur standard nulle (ou NA_real_ si tu préfères)
                                                                 ),
                        SE.Ratio = case_when(
                                    n_obs > 1 ~ sd(Ratio, na.rm = TRUE) / sqrt(n_obs),  # Erreur standard si au moins 2 observations
                                    TRUE ~ 0  # Sinon, erreur standard nulle (ou NA_real_ si tu préfères)
                                                      ),
                        IC_inf_GC = Mean.GC - 1.96 * SE.GC,  # Borne inférieure de l’intervalle de confiance à 95 %
                        IC_sup_GC = Mean.GC + 1.96 * SE.GC,  # Borne supérieure de l’intervalle de confiance à 95 %
                                               
                        IC_inf_BL = Mean.BL - 1.96 * SE.BL,  # Borne inférieure de l’intervalle de confiance à 95 %
                        IC_sup_BL = Mean.BL + 1.96 * SE.BL,  # Borne supérieure de l’intervalle de confiance à 95 %
                                               
                        IC_inf_Ratio = Mean.Ratio - 1.96 * SE.Ratio,  # Borne inférieure de l’intervalle de confiance à 95 %
                        IC_sup_Ratio = Mean.Ratio + 1.96 * SE.Ratio,  # Borne supérieure de l’intervalle de confiance à 95 %
                  
                        .groups = "drop"  # Retirer le regroupement après le résumé
                         )

ON CLACUL POUR CHAQUW POINT, LA VALEUR DU SEIL POUR ETRE CONSIDÉRÉ COMME DETENTE

bai.GC_BL_YearMean2 <- bai.GC_BL_YearMean %>%
                      mutate(
                        Release = case_when(
                                   Mean.Ratio > 0.5  * Mean.BL                  ~ "Major",     # Détente majeure
                                   Mean.Ratio >= 0.2 * Mean.BL & Mean.Ratio <= 0.5 * Mean.BL ~ "Moderate",  # Détente mineure/modérée
                                   Mean.Ratio < 0.2  * Mean.BL                  ~ "RAS",     # Pas de détente (Sans détente)
                                   TRUE                              ~ "RAS"      # Sécurité pour les valeurs manquantes (NA)
                                            ), 
                        
                        Seuil_Moderate = 0.2 * Mean.BL,
                        Seuil_Major = 0.5 * Mean.BL
                        
                      )

Graphique

En rouge, la coube de Ratio et en vers celle de %GC