# M2 Sasha ## Réunion - 16/02/2024 - Objectifs du M2 : - essayer de reproduire par simulation l'évolution entre 1950 et 2015 observée dans une parcelle de ST : est-on capable ? par quelle méthode ? pourquoi ? - comparer les deux méthodes rangeshifter et SMA - inconvénients et avantages des deux méthodes - Choix de la parcelle - Critères : - monospécifique + - dynamique++ - historique pastoralisme ? - **Parcelle 716 (RNN Eyne)** ? 214 ? 370/524 (Orlu) - Grandes tâches - Etape 1 : sélection parcelle - Etape 2 : identifier l'ensemble des informations disponibles sur le site (images, archives ST, etc) et sur l'espèce, se faire une idée de ce qu'il manque + données nécessaires - Etape 3 : historique de la parcelle (évolution + déterminants -- pratiques RN) + gestion de la forêt ? replantation ? - Etape 4 : Processus à simuler -> qu'est ce qu'on peut implementer ? [modèles / biblio] - **Etape 5 : lancer les simulations ; comparer les résultats (rétrospective)** - Etape 6 : choix des scénarios exploratoires ## Réunion - 02/04/2024* /Présentation en avril devant labos/ Avancement surtout bibliographique (variables) **Objectifs semaine 1:** - informations sur la parcelle (topograhie, géologie, couverture + évolution) - (+ explorer le sharedoc!) - continuer bibliographie thématique (variables) - faire l'exercice pratique présenté dans le manuel de Rangeshifter (prise en main) **Variables** (liste en cours...) - Climatique P,T, rayonnement -- min, max, moy, stress hydrique, vent + gradient orographique - exposition - Alt, pente, MOS, geol, - Distance à l'océan - Evenements ponctuels : feux ? mouvements de terrain ? - Influences anthropiques : paturage, feux, entretien, plantation - Forme de la treeline [Notes : Chevauchement des cycles phéno avec cdts météo Non linéarié des phénomènes dans le temps modification productivité allogement durée saison croissance avancement des événements phénologiques Csq sequestration carbone CC Baisse seq Hausse CC] *Recommandation biblio / tutoriels / manuels R ?* - Carto R : https://rcarto.github.io/cartographie_avec_r/ - Géomatique avec R : https://rcarto.github.io/geomatique_avec_r/ - Initiation stat : https://tfeuillet.gitpages.huma-num.fr/cours/ - Régression : https://tfeuillet.gitpages.huma-num.fr/cours/cours_ed - Geomorphons : https://rzine.fr/docs/20230425_geomorphon/index.html ## Notes utilisation du package Rangeshifter sur R Notes accessibles ici : - https://hackmd.io/m0w-hqeOQCy-QSDyumfURw - https://docs.google.com/document/d/1G39S3ImcJNQedb6JhxmgZxd8Z78tTNTfR9fMFeaTGUw/edit?usp=sharing https://rangeshifter.github.io/RangeshiftR-tutorials/overview_0.html https://nsojournals.onlinelibrary.wiley.com/doi/10.1111/ecog.05689 ## Réunion 04/04/24 - Photo-interprétation - Visio 9h30 vendredi 12 ## Divers Checker + savoir si peut être une approche pertinente ? https://pro.arcgis.com/fr/pro-app/latest/tool-reference/spatial-statistics/how-presence-only-prediction-works.htm ## Réunion 12/04/2024 ### Avancement et questions : Données : - check des données sur le sharedoc - **Question** : quel MNT utilisé jusqu'ici ? - RGE ALTI IGN 1m - téléchargement : - BD ORTHO : 2021, 2018, 2015,2012 - Photos historiques -- à géoréférencer - 1953 - 1965 - 1966 - 1969 - 1985 - 1995 - 53, 65, 85, 95, 15, 18, 21 - **Questions** : - Toutes les retenir ? (8 dates entre 1953 et 2015 (+2)) - Méthode pour treeline : digit ou classif type basée sur objet / SCP ? - Quelle méthodo dans thèse de Déborah ? Question autre : Comment prendre en compte directement le climat et l'impact anthropique dans RS ? Pas possible ou attente SMA ? ### Bilan réunion : MNT : RGE 1m Images : 53, 65, 85, 95, 15, 18, 21 (alternance 10 - 20 ans + précision après 2015) - Faire géoréférencement - Faire essai digit ou classification RangeShifter : 2 étapes identifiées - Traits spécifiques de l'espèce - Telabotanica - TRY Plant Trait Database (mondial) - BROT (Bassin méditérannéen) - (Données Matthieu Alpes du Sud) - Mise en place de la carte habitat : - Modèles aire de viabilité d'une espèce / quelles sont les cdts écologiques dans lesquelles l'espèce est présente / optimum écologique ==> une seule information (0 - 1 : 0 - 100) - BioMod2 ou MaxEnt (ArcGis) - Permet de prendre en compte plusieurs variables pour obtenir une carte de la qualité des habitats - Limite : considère habitat vivable là où sont déjà implantés les individus (présence) - Décisions - StageStructure (3 stades : juvénils, jeune individu, mature) test multicolinéarité ? (utilisé par https://environmentalsystemsresearch.springeropen.com/articles/10.1186/s40068-022-00248-6) ------ ## Géoréférencement Erreurs | Date | Nb points | Méthode |Inverse |Inverse-avant| |:-------- |:--------:| --------:|---------:|---------:| |1962|94|Ajuster|0,019 | 0,007| |1974|131|Ajuster|0,103| 0,082| |1985|106|Ajuster|0,101|0,078| |1995|36|Ajuster|0,008|0,014| Ajustement sur base 1953 Garder : - 1953 - 1962 - 1974 - 1985 - 1995 - 2012 - 2015 - 2021 ------------------- ## Classification Résultats variables... 2018 plûtot cohérent // 2021...compliqué ! Taux de validation pas très parlant ? ![image](https://hackmd.io/_uploads/rkS0ErdWA.png =400x) ![Ombres](https://hackmd.io/_uploads/H1w_XB_-0.png =600x) ![image](https://hackmd.io/_uploads/SJDtiWK-A.png =400x) ## à voir : Deux types de données à intégrer : - les données de présence de l'espèce (ici, les pins) : intégrées par une couche d'entités ponctuelles ? (Ce qui nécessite donc de créer la couche en "poitant" chaque pin à chaque date -- la classification d'occupation du sol étant faite en entités surfaciques) Et des variables relatives à l'environnement : 1 - celles qui seraient intéresantes mais qui ne sont pas utiles à notre échelle de travail ou indisponibles (climat, ensoleillement, humidité du sol, utilisation du sol...) **2 - celles qui varient dans le temps et dont on a accès à la donnée -> occupation du sol - qui pourra être obtenue par la classification des images aériennes : sol nu / herbacé / forêt ouverte / fermée ?) + est ce que ces classes sont cohérentes ? ** 3 - celles qui ne varient """pas""" dans le temps et dont on a l'accès ("pas" car ...pas d'informations historiques) -> MNT => altitude, pente, exposition (+ géomorphons ?) ==> PAYSAGE DYNAMIQUE ? ## Réunion 26/04 - Validation du géoréférencement - Discussion classification : - Essai d'une classification non supervisée (résultats assez bons) - Essayer classification supervisée emboitée - Faire plus de classes puis les regrouper ensuite - Toutes dates pour validation du modèle ultérieurement - Discussion carte de viabilité : - SOL : A faire sur 2021 (aide BRGM ?) : différents types de sols (éboulis, roches, sol nu, sol occ herbe, sol riche occ forêt) - Choix 2021 car permet de tenir compte de l'emprise maximale connue - Choix du sol et non de l'occupation du sol : type de sol (ou présence / absence) définit probabilité d'expansion des arbres - Discussion autour de l'impossible intégration de données climatiques : postulat que le gradient orographique n'est pas un facteur limitant puisque des arbres sont présents dans les plus hautes altitudes de la parcelle - RELIEF : Pentes, exposition, géomorphons - Tester la multicolinéarité - Pointer chaque arbre (2021) -------------- Données accessibles ici : https://drive.google.com/drive/folders/1adbtS_DqthEYI9ovEQ5yE0KUX57RhfZr?usp=sharing ## Bilan 22/05 ![Carte_viabilité (1)](https://hackmd.io/_uploads/B1LGNIqmC.png, =200x) ![image](https://hackmd.io/_uploads/rkbqZ7i70.png, =200x) ![image](https://hackmd.io/_uploads/H1AjbQimR.png, =200x) ![image](https://hackmd.io/_uploads/ByyJMXjQA.png, =200x) ![image](https://hackmd.io/_uploads/BJ6EfmjQ0.png, =200x) Bilan : à régler : - [x] Modifier exposition - [x] Reclassifier les rasters d'occupation du sol : - Sol nu, roches, éboulis, végétation - [x] Tests VIF - [ ] Relancer les modèles - [x] Checker comment faire pour insérer toutes les dates dans le modèle ## Test colinéarité Y = pente ``` library(raster) library(usdm) library(terra) #Chargement raster NS expoNS <- rast("D:/A_STAGE/DATA_SIG/B_Carto_viab/Entrees/EL_RELIEF/Expo_NS.tif") expoNS # Garder uniquement valeurs relatives à l'expo NS expoNS <- (expoNS$Expo_NS_1) expoNS plot(expoNS) #Chargement raster EO expoEO <- rast("D:/A_STAGE/DATA_SIG/B_Carto_viab/Entrees/EL_RELIEF/Expo_EO.tif") # Garder uniquement valeurs relatives à l'expo EO expoEO <- (expoEO$Expo_EO_1) plot(expoEO) # Passer de SpatRaster à RasterLayer expoNS <- raster(expoNS) expoEO <- raster(expoEO) summary(expoNS) par(mfrow = c(1,2)) plot(expoNS, main="Exposition Nord-Sud") plot(expoEO, main ="Exposition Est-Ouest") ##Charger rasters : Geomorphons et Pentes #Geomorphons #Raster geom <- rast("D:/A_STAGE/DATA_SIG/B_Carto_viab/Entrees/EL_RELIEF/Geomorph716.tif") #Conversion vers RasterLayers library(raster) geom <- raster(geom) #Pentes #Rasters pentes <- rast("D:/A_STAGE/DATA_SIG/B_Carto_viab/Entrees/EL_RELIEF/Pentes716.tif") #Conversion pentes <- raster(pentes) ### TEST MULTICOLINEARITE library(raster) library(usdm) #1 : Empiler les rasters #1.1 : Corriger étendue des rasters # 1.1.a : définir étendue de référence etendue_ref <- geom # 1.1.b : Resampler les autres rasters RexpoEO <- resample(expoEO, etendue_ref) RexpoNS <- resample(expoNS, etendue_ref) Rpentes <- resample(pentes, etendue_ref) #1.2 : verification étendues print(extent(RexpoEO)) print(extent(RexpoNS)) print(extent(geom)) print(extent(Rpentes)) #2 : Empiler les raters Stack <- stack(RexpoEO, RexpoNS, Rpentes, geom) #3 : Extraction des valeurs de pixels + conversion vers df Valeurs <- as.data.frame(getValues(Stack)) #3 : Calcul de la matrice de corrélation Matrice_cor <- cor(Valeurs, use = 'complete.obs') print(Matrice_cor) ### Test VIF # Supp NA ValeursNA <- na.omit(Valeurs) # Créer un modèle library(car) lmP <- lm(ValeursNA$Pentes716~ ValeursNA$Expo_EO_1 + ValeursNA$Expo_NS_1 + ValeursNA$Geomorph716) summary(lmP) # Calcul VIF vifP <- vif(lmP) vifP NOMP <- c("Expo E-O", "Expo N-S", "Géomorphons") plot(vifP, pch = 16, main = "VIF", xlab = "Variables", ylab = "Valeurs", xlim=c(1,3), ylim=c(0,3), xaxt="n") axis(side=1, at=1:length(NOMP), labels=NOMP) abline(h=2, lty=2, col="red") text(1:length(vifP), vifP, labels = round(vifP, 2), pos = 3, cex=1.2) par(mfrow = c(2,4)) #VIF Relief + Types Sol S1953 <- raster("D:/A_STAGE/DATA_SIG/B_Carto_viab/Entrees/TYPE_SOL/Sol1953.tif") RS1953 <- resample(S1953,etendue_ref) Stack1953 <- stack(RS1953, RexpoEO, RexpoNS, Rpentes, geom) Val1953 <- as.data.frame(getValues(Stack1953)) Matrice_cor1953 <- cor(Val1953, use = 'complete.obs') print(Matrice_cor1953) ValeursNA53 <- na.omit(Val1953) lmP1953 <- lm(ValeursNA53$Pentes716 ~ ValeursNA53$Expo_EO_1 + ValeursNA53$Expo_NS_1 + ValeursNA53$Geomorph716 + ValeursNA53$TYPE) summary(lmP1953) vifP1953 <- vif(lmP1953) vifP1953 NOM2 <- c("ExpoE-O", "Expo N-S", "Géomorphons", "Type sol") plot(vifP1953, pch = 16, main = "VIF1953", xlab = "Variables", ylab = "Valeurs", xlim=c(1,4), ylim=c(0,3), xaxt="n") axis(side=1, at=1:length(NOM2), labels=NOM2) abline(h=2, lty=2, col="red") text(1:length(vifP1953), vifP1953, labels = round(vifP1953, 2), pos = 3, cex=0.7) S1962 <- raster("D:/A_STAGE/DATA_SIG/B_Carto_viab/Entrees/TYPE_SOL/Sol1962.tif") RS1962 <- resample(S1962,etendue_ref) Stack1962 <- stack(RS1962, RexpoEO, RexpoNS, Rpentes, geom) Val1962 <- as.data.frame(getValues(Stack1962)) Matrice_cor1962 <- cor(Val1962, use = 'complete.obs') print(Matrice_cor1962) ValeursNA62 <- na.omit(Val1962) lmP1962 <- lm(ValeursNA62$Pentes716 ~ ValeursNA62$Expo_EO_1 + ValeursNA62$Expo_NS_1 + ValeursNA62$Geomorph716 + ValeursNA62$TYPE) summary(lmP1962) vifP1962 <- vif(lmP1962) vifP1962 plot(vifP1962, pch = 16, main = "VIF1962", xlab = "Variables", ylab = "Valeurs", xlim=c(1,4), ylim=c(0,3), xaxt="n") axis(side=1, at=1:length(NOM2), labels=NOM2) abline(h=2, lty=2, col="red") text(1:length(vifP1962), vifP1962, labels = round(vifP1962, 2), pos = 3, cex=0.7) etc. ``` ![image](https://hackmd.io/_uploads/rJfssSQNR.png, =500x) ![image](https://hackmd.io/_uploads/Skpiw87NR.png) ## Biomod2 ``` ### BIOMOD library(biomod2) library(sf) library(raster) library(terra) library(ggplot2) library(gridExtra) #Charger données Arbres2021 <- st_read("D:/A_STAGE/DATA_SIG/A_IMAGES/5_CENTROIDES/Arbres_2021.shp") EO<- raster("D:/A_STAGE/DATA_SIG/B_Carto_viab/Entrees/EL_RELIEF/A_Export/EO_Q.tif") GeomF <- raster("D:/A_STAGE/DATA_SIG/B_Carto_viab/Entrees/EL_RELIEF/A_Export/Geo_Q.tif") Pentes <- raster("D:/A_STAGE/DATA_SIG/B_Carto_viab/Entrees/EL_RELIEF/A_Export/Pentes_Q.tif") NS <- raster("D:/A_STAGE/DATA_SIG/B_Carto_viab/Entrees/EL_RELIEF/A_Export/NS_Q.tif") s21 <- raster("D:/A_STAGE/DATA_SIG/B_Carto_viab/Entrees/TYPE_SOL/Sol2021.tif") GeomF <- as.factor(GeomF) s21 <- as.factor(s21) str(GeomF) str(s21) # Corriger étendue des rasters #définir étendue de référence etendue_ref <- GeomF #: Resampler les autres rasters EO <- resample(EO, etendue_ref) NS<- resample(NS, etendue_ref) Pentes <- resample(Pentes, etendue_ref) s21 <- resample(s21, etendue_ref) #: verification étendues print(extent(EO)) print(extent(NS)) print(extent(GeomF)) print(extent(Pentes)) #Stack variables environnementales Stackbio <- stack(Pentes, NS, EO, GeomF, s21) summary(Stackbio) str(Stackbio) #Coordonnées CoodArbres <- st_coordinates(Arbres2021) #Df Présence DataPresence <- data.frame(longitude=CoodArbres[,1], latitude =CoodArbres[,2], species_presence = rep(1, nrow(CoodArbres))) #Formatage des données pour Biomod1 PresenceArbres <- BIOMOD_FormatingData(resp.var=DataPresence$species_presence, expl.var = Stackbio, resp.xy = DataPresence[,c('longitude', 'latitude')], resp.name = "ArbresBiomod", #Nom du projet PA.nb.rep = 1, #nb de répétition de points de pseudoabs PA.nb.absences = 530,#nb de points, ici ratio 3:1 PA.strategy='disk', PA.dist.min = 10) #Aléatoire (hors points de présence) PresenceArbres summary(PresenceArbres) library(tidyterra) library(ggtext) ``` ![image](https://hackmd.io/_uploads/BJnwpTaHA.png) ``` #Paramètres des modèles OptDef <- BIOMOD_ModelingOptions( MAXENT= list(path_to_maxent_jar = "D:/A_STAGE/DATA_SIG/B_Carto_viab/A_TestMulticol /maxent/maxent/maxent.jar")) # Lancement Models <- BIOMOD_Modeling( bm.format = PresenceArbres, modeling.id = "Modeles", models=c('GLM','GAM','GBM','CTA','ANN','SRE','FDA','MARS','RF','MAXENT','MAXNET','XGBOOST'), bm.options=OptDef, CV.strategy = 'random', CV.nb.rep = 10, CV.perc = 0.7, metric.eval = c('ROC', 'TSS', 'KAPPA'), var.import = 3, seed.val = 42) # Evaluation eval <- get_evaluations(Models) eval_df <- as.data.frame(eval) print(colnames(eval_df)) head(eval_df) tss_scores <- eval_df %>% filter(metric.eval == "TSS") %>% select(full.name, PA, run, algo, cutoff, sensitivity, specificity, calibration, validation) tss_scores$run <- factor(tss_scores$run, levels = c("RUN1", "RUN2", "RUN3", "RUN4", "RUN5", "RUN6", "RUN7", "RUN8", "RUN9", "RUN10")) couleurs <- c("#1f77b4", "#ff7f0e", "#2ca02c", "#d62728", "#9467bd", "#8c564b", "#e377c2", "#7f7f7f", "#bcbd22", "#17becf") point_tss <- ggplot(tss_scores, aes(x = run, y = calibration, color = algo)) + geom_point(size = 2, position = position_jitter(width = 0.2, height = 0)) + geom_text(aes(label = sprintf("%.3f", calibration), color = algo), size = 3, vjust = -1.5, position = position_jitter(width = 0.2, height = 0)) + labs(title = "Scores de calibration par Run et par Modèle", x = "Run", y = "Score de calibration", color = "Algorithme") + scale_color_manual(values = couleurs) + # Utiliser les couleurs personnalisées scale_shape_manual(values = 1:length(unique(tss_scores$algo)), breaks = unique(tss_scores$algo)) + theme_minimal() + theme(axis.text.x = element_text(angle = 45, hjust = 1), legend.position = "right") # Positionner la légende à droite print(point_tss) bm_PlotEvalMean(Models, group.by="algo", metric.eval = c("ROC", "TSS"), xlim=c(0.8,1), ylim=c(0.8, 1)) ``` ![image](https://hackmd.io/_uploads/BkvExATHC.png) ![image](https://hackmd.io/_uploads/S1iueCTHC.png) ``` # Courbes de réponse CourbesRF <- c("ArbresBiomod_PA1_RUN1_RF", "ArbresBiomod_PA1_RUN2_RF", "ArbresBiomod_PA1_RUN3_RF", "ArbresBiomod_PA1_RUN4_RF", "ArbresBiomod_PA1_RUN5_RF", "ArbresBiomod_PA1_RUN6_RF", "ArbresBiomod_PA1_RUN7_RF", "ArbresBiomod_PA1_RUN8_RF", "ArbresBiomod_PA1_RUN9_RF", "ArbresBiomod_PA1_RUN10_RF") RF <- bm_PlotResponseCurves(bm.out = Models, models.chosen = CourbesRF) ``` ![image](https://hackmd.io/_uploads/B1npxRpSC.png)