Académique Documents
Professionnel Documents
Culture Documents
Olivares Pablo
2023-04-27
Objectif et instructions
L’objectif principal de ce TP est d’aborder les SDMs d’un point de vue pratique à travers R, et
en utilisant comme exemple la modélisation de la distribution de l’espèce Vulpes vulpes
(renard roux) à l’échelle mondiale en fonction de variables bioclimatiques.
# Installation des packages s'ils ne sont pas déjà installés.
if (!require("biomod2")) install.packages("biomod2")
if (!require("raster")) install.packages("raster")
if (!require("usdm")) install.packages("usdm")
if (!require("randomForest")) install.packages("randomForest")
## randomForest 4.7-1.1
if(as.logi){
calib <- rep(FALSE, ntot)
calib[c(pres,absc)] <- TRUE
eval <- !calib
} else{
calib <- c(pres,absc)
eval <- (1:ntot)[-c(pres,absc)]
}
return(list("calibration"=calib, "evaluation"=eval))
}
#Ce tableau importé contient les coordonnées géographiques selon le système géodésique
WGS84 (World Geodetic System 1984) de chaque observation, ainsi que plusieurs colonnes
qui correspondent à différentes espèces. Nous allons extraire la colonne VulpesVulpes (la
dernière) dont les valeurs sont binaires, 1 correspondant à une présence, 0 à une absence.
Cette colonne sera ensuite utilisée pour créer notre tableau final qui servira à calibrer nos
modèles. Note that the echo = FALSE parameter was added to the code chunk to prevent
printing of the R code that generated the plot.
# Extraction de la colonne VulpesVulpes
spp <- dataSpecies[,"VulpesVulpes"]
5. Tableau final
Nous allons créer un tableau final qui contiendra les observations faunistiques et les valeurs
environnementales correspondantes retenues. Ce tableau nous servira comme base pour la
calibration de nos modèles.
# Nous joignons le vecteur de presence-absence de Vulpes vulpes (en lui donna
nt un nom; VulpesVulpes=...) et le tableau des valeurs environnementales issu
de la fonction 'extract', tout en spécifiant les colonnes qui nous souhaitons
conserver.
dataSpEnv <- data.frame(VulpesVulpes=spp,envValues[,preds])
head(dataSpEnv)
##
## Call:
## glm(formula = VulpesVulpes ~ ., family = binomial("logit"), data = dataSpE
nv)
##
## Deviance Residuals:
## Min 1Q Median 3Q Max
## -2.77454 -0.43563 -0.03528 0.49395 3.02632
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -1.0382810 0.4957519 -2.094 0.0362 *
## bio3 -0.1787175 0.0112674 -15.861 < 2e-16 ***
## bio7 0.0216655 0.0010981 19.731 < 2e-16 ***
## bio11 0.0172736 0.0010228 16.889 < 2e-16 ***
## bio12 0.0009981 0.0001358 7.351 1.96e-13 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 3442.9 on 2487 degrees of freedom
## Residual deviance: 1701.9 on 2483 degrees of freedom
## AIC: 1711.9
##
## Number of Fisher Scoring iterations: 6
Le ‘summary’ de notre modèle nous indique que tous nos coefficients ainsi que l’intercept
(ordonnée à l’origine) sont significativement différents de zéro (Pr(>|z|) < 0.05). On peut dès
lors inférer que toutes les variables retenues ont un effet significatif sur la probabilité de
présence de Vulpe vulpes. L’AIC indiqué en-bas du ‘summary’ nous permet de comparer deux
modèles construits sur les mêmes observations (la valeur en soit de l’AIC n’indique rien). Plus
la valeur est faible, plus la qualité du modèle est élevée, comparée à celle de l’autre modèle.
Rappelons ici l’importance du compromis entre biais et variance. Le biais est l’erreur du
modèle provenant de l’incapacité de l’algorithme à traduire le concept reliant la variable
réponse aux prédicteurs (sous-apprentissage ou underfit en anglais). La variance est l’erreur
due à la sensibilité aux petites fluctuations de l’échantillon utilisé pour la calibration
(surapprentissage ou overfit en anglais). Dans ce cas, l’algorithme tend à modéliser le bruit
et les modèles qui varient significativement selon l’échantillon utilisé pour la calibration ne
peuvent être généralisés. Un des objectifs principaux en modélisation est de diminuer l’une
des erreurs (biais ou variance) sans augmenter l’autre. L’AIC permet de choisir entre
plusieurs GLMs, celui qui en même temps explique le mieux les valeurs observées tout en
restant ‘parcimonieux’ et pouvant être généralisé. L’AIC ne peut être calculé sur des modèles
non-paramétriques (tels que les Random Forest) et c’est pourquoi nous allons voir plus loin
une méthode plus générale permettant de comparer la performance de modèles issus de
technique différentes.
La matrice de confusion affichée lorsque l’on exécute l’objet modRF nous indique le nombre
de présences (1) et absences (0) correctement prédites (sur nos points d’observations
utilisés pour calibrer notre modèle). L’idée est de comparer ce que l’on a observé et ce que
l’on a prédit à l’aide du modèle. Ce type de matrice sera utile par la suite pour évaluer et
comparer les performances de nos différents modèles.
## [1] 0.9304068
Le mélange, étant aléatoire, peut varier d’une fois à l’autre, c’est pourquoi il est important
d’effectuer cette opération plusieurs fois et de calculer ensuite une moyenne des valeurs
obtenues. Pour cela nous allons créer une boucle itérative. Pour une introduction sur le
fonctionnement des boucles dans R (‘loop’ en anglais), visitez la page suivante:
https://datascienceplus.com/how-to-write-the-loop-in-r/
# PredI (I pour initial) correspond aux prédictions de notre modèle (sur nos
points d'observations). Il est important de spécifier type="response" afin d'
obtenir les valeurs après transformation grâce à la fonction lien (voir théor
ie GLM). Les valeurs prédites seront comprises entre 0 et 1.
predI <- predict(modGLM,type="response")
# Nombre d'itérations.
nIter <- 10
# Vecteur vide dans lesquels nous allons sauvegarder les valeurs obtenues à c
haque itération, dont la longeur correspond au nombre d'itérations.
varImpVect <- vector(mode="numeric",length=nIter)
# Boucle (la valeur de i changera à chaque itération et ira de 1 au nombre dé
fini dans nIter)
for(i in 1:nIter){
# Mélange de bio7: Afin de ne pas modifier notre tableau de base, nous allo
ns en faire une copie appelée dataSpEnvM (M pour modifié).
dataSpEnvM <- dataSpEnv
# La fonction sample nous permet d'extraire un échantillon aléatoire. Dans
notre cas, nous spécifions que la taille de l'échantillon doit correspondre
au nombre de ligne de notre tableau et que chaque élément ne peut être séléct
ionner plus d'une fois. Ceci revient à 'mélanger' les valeurs de la colonne c
oncernée.
dataSpEnvM$bio7 <- sample(dataSpEnvM$bio7,size=nrow(dataSpEnvM),replace=FAL
SE)
# Prédiction avec variable mélangée
predM <- predict(modGLM,newdata=dataSpEnvM,type="response")
# Calcul de l'importance relative (la fonction max, permet de considérer n'
importe quel coefficient négatif comme étant nulle).
varImp <- 1-max(cor(predM,predI),0)
# Sauvegarde de la valeur dans l'objet varImpVect à la position i
varImpVect[i] <- varImp
}
# Calcul de la moyenne de toutes les valeurs obtenues
varImpMoy <- mean(varImpVect)
print(varImpMoy)
## [1] 0.9326423
Maintenant, nous allons appliquer le même principe pour tous les prédicteurs. Nous allons
donc créer un tableau dont les lignes correspondront aux différentes itérations et les
colonnes aux différents prédicteurs. Ce tableau sera rempli comme précédemment, de
manière itérative, mais cette fois, nous allons avoir une double boucle (imbrication), une sur
les prédicteurs, puis une autre sur les itérations.
# PredI (I pour initial) correspond aux prédictions de notre modèle (sur nos
points d'observations). Il est important de spécifier type="response" afin d'
obtenir les valeurs après transformation grâce à la fonction lien (voir théor
ie GLM). Les valeurs prédites seront comprises entre 0 et 1.
predI <- predict(modGLM,type="response")
# Nombre d'itérations.
nIter <- 10
# Tableau vide dans lequel nous allons sauvegarder les valeurs obtenues à cha
que itération, dont les lignes correspondent aux itérations et les colonnes a
ux variables. Nous créons d'abord une matrice remplie de NA, pour laquelle il
est facile de spécifier le nombre de lignes (nrow=) et le nombre de colonnes
(ncol=). Nous transformons ensuite cette matrice en data.frame.
varImpVectTable <- data.frame(matrix(NA,nrow=nIter,ncol=length(preds)))
colnames(varImpVectTable) <- preds
# Boucle (la valeur de p changera à chaque itération et correspondra aux noms
de variables contenues dans l'objet preds)
for(p in preds){
for(i in 1:nIter){
# Mélange de la variable p. Afin de ne pas modifier notre tableau de base,
nous allons en faire une copie appelée dataSpEnvM (M pour modifié).
dataSpEnvM <- dataSpEnv
# La fonction sample nous permet d'extraire un échantillon aléatoire. Dans
notre cas, nous spécifions que la taille de l'échantillon doit correspondre
au nombre de ligne de notre tableau et que chaque élément ne peut être séléct
ionner plus d'une fois. Ceci revient à 'mélanger' les valeurs de la colonne c
oncernée. L'opération sera effectuée sur la colonne p.
dataSpEnvM[,p] <- sample(dataSpEnvM[,p],size=nrow(dataSpEnvM),replace = FAL
SE)
# Prédiction avec variable mélangée
predM <- predict(modGLM,newdata=dataSpEnvM,type="response")
# Calcul de l'importance relative (la fonction max, permet de considérer n'
importe quel coefficient négatif comme étant nulle)
varImp <- 1-max(cor(predM,predI),0)
# Sauvegarde de la valeur dans le tableau, à la ligne i (numéro de l'itérat
ion) et à la colonne p (correspondante à une des variables)
varImpVectTable[i,p] <- varImp
}
}
# Calcul des moyennes avec la fonction apply (fonction qui s'opère sur un dat
a frame). La valeur 2 signifie que l'on souhaite exécuter une opération par c
olonne, et 'mean' correspond à l'opération que l'on souhaite réaliser.
varImpMoy <- apply(varImpVectTable,2,mean)
# Barplot, ylim permet de fixer l'axe des y, ce que permet de pouvoir compare
r les graphiques entre eux (GLM vs Random Forest).
barplot(varImpMoy, ylab="Relative variable importance", main="Vulpes vulpes (
GLM)",ylim=c(0,1))
Nous voyons que les variables bio3 et bio7 sont largement plus importantes que les variables
bio11 et bio12, cette dernière étant presque négligeable. En d’autres termes, les variables
bio3 et bio7 ont permis de bien mieux discriminer les présences des absences que les
variables bio11 et bio12. Nous allons effectuer exactement la même opération pour le modèle
Random Forest.
# PredI (I pour initial) correspond aux prédictions de notre modèle (sur nos
points d'observations). Nous sélectionnons la deuxième colonne qui correspond
aux probabilités de présence.
predI <- predict(modRF,type="prob")[,2]
# Nombre d'itérations
nIter <- 10
# Tableau vide dans lequel nous allons sauvegarder les valeurs obtenues à cha
que itération, dont les lignes correspondent aux itérations et les colonnes a
ux variables. Nous créons d'abord une matrice remplie de NA, pour laquelle il
est facile de spécifier le nombre de lignes (nrow=) et le nombre de colonnes
(ncol=). Nous transformons ensuite cette matrice en data.frame.
varImpVectTable <- data.frame(matrix(NA,nrow=nIter,ncol=length(preds)))
colnames(varImpVectTable) <- preds
# Boucle (la valeur de p changera à chaque itération et correspondra aux chaî
nes de charactères contenues dans l'objet preds)
for(p in preds){
for(i in 1:nIter){
# Mélange de la variable p. Afin de ne pas modifier notre tableau de base,
nous allons en faire une copie appelée dataSpEnvM (M pour modifié).
dataSpEnvM <- dataSpEnv
# La fonction sample nous permet d'extraire un échantillon aléatoire. Dans
notre cas, nous spécifions que la taille de l'échantillon doit correspondre
au nombre de ligne de notre tableau et que chaque élément ne peut être séléct
ionner plus d'une fois. Ceci revient à 'mélanger' les valeurs de la colonne c
oncernée. L'opération sera effectuée sur la colonne p.
dataSpEnvM[,p] <- sample(dataSpEnvM[,p],size=nrow(dataSpEnvM),replace = FAL
SE)
# Prédiction avec variable mélangée
predM <- predict(modRF,newdata=dataSpEnvM,type="prob")[,2]
# Calcul de l'importance relative (la fonction max, permet de considérer n'
importe quel coefficient négatif comme étant nulle)
varImp <- 1-max(cor(predM,predI),0)
# Sauvegarde de la valeur dans le tableau, à la ligne i (numéro de l'itérat
ion) et à la colonne p (correspondante à une des variables)
varImpVectTable[i,p] <- varImp
}
}
# Calcul des moyennes avec la fonction apply (fonction qui s'opère sur un dat
a frame). La valeur 2 signifie que l'on souhaite exécuter une opération par c
olonne, et 'mean' correspond à l'opération que l'on souhaite réaliser.
varImpMoy <- apply(varImpVectTable,2,mean)
# Barplot, ylim permet de fixer l'axe des y, ce que permet de pouvoir compare
r les graphiques entre eux
barplot(varImpMoy, ylab="Relative variable importance", main="Vulpes vulpes (
RF)",ylim=c(0,1))
Nous pouvons évaluer les différences selon la technique de modélisation utilisée. Avec le
Random Forest, l’importance des variables est plus homogène qu’avec le GLM. Ceci peut
s’expliquer par le fait que dans le Random Forest, des interactions complexes entre les
variables peuvent être prises en compte, ce qui peut potentiellement équilibrer l’importance
relative de chacune des variables.
# Nous allons maintenant remplacer les valeurs de la colonne bio3 par des val
eurs correspondant à un gradient allant de la valeur minimum à la valeur maxi
mum, dont la longueur correspond aux nombre de lignes de notre tableau. Nous
calculons ce gradient sur la base des valeurs initiales (dataSpEnv).
gradient <- seq(min(dataSpEnv$bio3),max(dataSpEnv$bio3),length.out = nrow(dat
aSpEnv))
dataSpEnvM$bio3 <- gradient
# Prédiction sur le tableau modifié.
predM <- predict(modGLM,newdata=dataSpEnvM,type="response")
# Plot de la courbe réponse. En 'x' le gradient, en 'y' les prédictions.
plot(x=dataSpEnvM$bio3,y=predM,type="l",ylab="Presence probability",xlab="bio
3",main="Response curve (GLM)",col="blue",ylim=c(0,1))
Nous voyons ici l’effet de la variable bio3 le long de son gradient sur la probabilité de
présence de notre espèce. Nous allons appliquer le même principe pour toutes les variables
et pour les deux techniques de modélisation. Nous allons programmer une boucle itérative
nous permettant d’afficher toutes les courbes réponses pour chacun des techniques.
# Afin de ne pas modifier notre tableau de base, nous allons en faire une cop
ie appelée dataSpEnvM (M pour modifié).
dataSpEnvM <- dataSpEnv
# Boucle permettant de fixer les valeurs de chaque colonne (d'attribuer la mê
me valeur à chaque ligne). A chaque itération, nous prenons un colonne et nou
s attribuons la valeur médiane à toutes les lignes.
for(p in preds){
dataSpEnvM[,p] <- median(dataSpEnvM[,p])
}
# La fonction imbriquée suivante (en commentaire) est une méthode alternative
à la boucle précédente (elle est plus rapide et donne exactement le même résu
ltat). La partie apply calcule la médiane par colonne, et la fonction sapply
applique la fonction 'rep' au résultat de la fonction apply, à savoir, elle v
a répéter chacune de ces valeurs un nombre de fois qui correspond au nombre d
e lignes de notre tableau.
# dataSpEnvM[,preds] <- sapply(apply(dataSpEnvM[,preds],2,median),rep,times=n
row(dataSpEnvM))
# Comme nous avons 4 variables, nous allons changer les paramètre graphiques
de telle manière à pouvoir afficher sur la même fenêtre les 4 courbes réponse
s (2 lignes et 2 colonnes)
par(mfrow=c(2,2))
# Modèle GLM: boucle itérative sur les prédicteurs.
for(p in preds){
# Afin de ne pas modifier notre tableau de médiane, nous allons en faire un
e copie appelée dataSpEnvMG (G pour gradient)
dataSpEnvMG <- dataSpEnvM
# Nous allons maintenant remplacer les valeurs de la colonne i par des vale
urs correspondant à un gradient allant de la valeur minimum à la valeur maxim
um, dont la longueur correspond aux nombre de lignes de notre tableau. Nous c
alculons ce gradient sur la base des valeurs initiales (dataSpEnv).
gradient <- seq(min(dataSpEnv[,p]),max(dataSpEnv[,p]),length.out = nrow(dat
aSpEnv))
dataSpEnvMG[,p] <- gradient
# Prédiction sur le tableau modifié
predM <- predict(modGLM,newdata=dataSpEnvMG,type="response")
# Plot de la courbe réponse. En 'x' le gradient, en 'y' les prédictions.
plot(x=dataSpEnvMG[,p],y=predM,type="l",ylab="Presence probability",xlab=p,
main="Response curve (GLM)",col="blue",ylim=c(0,1))
}
par(mfrow=c(2,2))
# Modèle RF: boucle itérative sur les prédicteurs.
for(p in preds){
# Afin de ne pas modifier notre tableau de médiane, nous allons en faire un
e copie appelée dataSpEnvMG (G pour gradient)
dataSpEnvMG <- dataSpEnvM
# Nous allons maintenant remplacer les valeurs de la colonne i par des vale
urs correspondant à un gradient allant de la valeur minimum à la valeur maxim
um, dont la longueur correspond aux nombre de lignes de notre tableau. Nous c
alculons ce gradient sur la base des valeurs initiales (dataSpEnv).
gradient <- seq(min(dataSpEnv[,p]),max(dataSpEnv[,p]),length.out = nrow(dat
aSpEnv))
dataSpEnvMG[,p] <- gradient
# Prédiction sur le tableau modifié. Nous sélectionnons la deuxième colonne
qui correspond aux probabilité de présence.
predM <- predict(modRF,newdata=dataSpEnvMG,type="prob")[,2]
# Plot de la courbe réponse. En 'x' le gradient, en 'y' les prédictions.
plot(x=dataSpEnvMG[,p],y=predM,type="l",ylab="Presence probability",xlab=p,
main="Response curve (RF)",col="blue",ylim=c(0,1))
}
Nous observons que les courbes réponses du Random Forest ne sont pas aussi lisses que celle
du GLM. Ceci est dû au fait que les arbres décisionnels se forment sur la base de partition à
partir de seuils (ex. température > 5°C). Nous observons donc des ruptures, parfois abruptes.
Nous avons là donc deux vecteurs binaires, celui des observations et celui des prédictions, et
nous serions donc capables de remplir la matrice de confusion. Plusieurs indices peuvent être
calculés sur la base de cette matrice, par exemple la sensibilité (pourcentage de présences
correctement prédites), la spécificité (pourcentage d’absences correctement prédites), ou
encore des indices composés tel que l’indice True Skill Statistics (TSS) qui n’est autre que la
somme de la sensibilité et de la spécificité moins 1 (SE+SP-1).
# La fonction Find.Optim.Stat nous permet de calculer plusieurs indices de pe
rformance prédictive d'un modèle. Pour cela, il faut une vecteur de prédictio
n (en probabilités) et un vecteur d'observation (binaire). En l'occurence, no
us avons décidé de fixer le seuil à 0.5, et la fonction s'occupera de transfo
rmer nos probabilités en valeurs binaires (comme nous l'avont fait précédemme
nt).
tss <- bm_FindOptimStat("TSS",eval$VulpesVulpes,predTest,nb.thresh = 0.5)
print(tss)
Le résultat de cette fonction nous informe sur la valeur de l’indice TSS (best.stat), le seuil
utilisé (cutoff), la sensibilité et la spécificité. Pour cet indice, une valeur entre 0.5 et 0.7
indique que le modèle est ‘bon’, entre 0.7 et 0.85 ‘très bon’, et au-delà de 0.85 il est considéré
‘excellent’. Dans cet exemple, nous avons défini un seuil de manière arbitraire, mais d’autres
seuils pourraient potentiellement améliorer notre indice. La même fonction permet de tester
différents seuils.
# La fonction Find.Optim.Stat nous permet de calculer plusieurs indices de pe
rformance prédictive d'un modèle. Pour cela, il faut une vecteur de prédictio
n (en probabilités) et un vecteur d'observation (binaire). Contrairement à l'
étape précédente, nous allons demander à la fonction de tester différents seu
ils, allant de 0 à 1 avec un pas de 0.01 .
tss <- bm_FindOptimStat("TSS",eval$VulpesVulpes,predTest,threshold = seq(0,1,
by = 0.01))
print(tss)
Nous avons là l’indication du seuil qui maximisme cet indice (cutoff) et la valeur de l’indice
en tenant compte de ce seuil (best.stat). Un autre indice fréquemment utilisé est l’AUC (Area
Under the Curve) basée sur le ROC (Relative Operating Characteristic). Au-delà de ces termes
techniques, le principe est relativement simple. On place deux axes, le taux de faux positifs
(égal au pourcentage d’absences mal prédites) sur l’axe des X et le taux de vrais positifs
(pourcentage de présences bien prédites) sur l’axe des Y. Chaque seuil donné correspondra
à un point différent sur le graphique. Par exemple, le seuil de 0 (une probabilité supérieure à
0 devient 1; 100% de présence) rendra le taux de faux positifs ainsi que le taux de vrais
positifs maximums. Le point serait donc placé dans le coin en haut à droite du graphique. En
effet, toutes les absences seront codées comme étant des présences (taux de faux positifs =
1), mais toutes les présences seront codées comme étant présentes (taux de vrais positifs =
1). A l’inverse, un seuil de 1 éliminerait les faux positifs mais il n’y aurait pas non plus de vrais
positifs. La courbe sera donc celle qui reliera tous les points obtenus selon tous les seuils
possibles. Et plus la courbe se rapprochera de la prédiction parfaite (taux de faux positifs de
0 et taux de vrais positifs de 1), plus l’aire sous la courbe (AUC) sera proche de 1, plus notre
modèle sera considéré comme étant bon. La même fonction Find.Optim.Stat permet d’obtenir
la valeur de l’AUC. Le ‘cutoff’ indiqué dans ce cas sera celui qui maximise la sensibilité et la
spécifité, mais il n’a pas d’influence sur l’AUC, qui est calculé en tenant compte de tous les
seuils.
# La fonction Find.Optim.Stat nous permet de calculer l'AUC (appelé ROC dans
le cas de cette fonction).
auc <- bm_FindOptimStat("ROC",eval$VulpesVulpes,predTest)
## Setting levels: control = 0, case = 1
print(auc)
La séparation en deux parties de notre tableau initial se fait de manière aléatoire. Les valeurs
de TSS, d’AUC ou d’autres indices peuvent donc varier. Il est dès lors important de répéter la
même opération plusieurs fois afin d’observer une tendance fiable. Nous allons donc
effectuer un ‘split’ (une partition) une dizaine de fois. A chaque itération nous allons calibrer
un GLM et un Random Forest puis nous allons calculer les valeurs de TSS. Les résultats seront
sauvegardés dans un tableau.
# Nombre d'itérations
nIter <- 10
# Création d'un tableau dont les lignes correspondent au nombre d'itération e
t les colonnes aux deux techniques, GLM et RF. Nous créons d'abord une matric
e remplie de NA, pour laquelle il est facile de spécifier le nombre de lignes
(nrow=) et le nombre de colonnes (ncol=). Nous transformons ensuite cette mat
rice en data.frame.
tssTable <- data.frame(matrix(NA,nrow=nIter,ncol=2))
# On nomme les colonnes.
colnames(tssTable) <- c("GLM","RF")
# Itération (i prendra la valeur de l'itération, de 1 au nombre indiqué plus
haut).
for(i in 1:nIter){
# Nous allons utiliser la fonction sampleMat2 du package 'biomod2' qui perm
et de séparer de manière aléatoire un vecteur de présence-absence (binair
e) de telle manière à maintenir la même prévalence (pourcentage de présence)
dans les deux groupes. Un paramètre 'ratio' permet de définir la proportion d
'observation que l'on souhaite garder pour la calibration. En règle générale,
cette proportion va de 0.6 à 0.8.
calibEval <- SampleMat2(dataSpEnv$VulpesVulpes,ratio = 0.7)
# L'objet issu de la fonction sampleMat2 est une liste de deux vecteurs. Le
premier (appelé calibration) indique les numéros des lignes prévus pour la ca
libration et le deuxième (appelé evaluation), le numéro des lignes prévus pou
r le test.
# On crée un tableau (déstiné à la partie calibration) avec les lignes du t
ableau initial indiquées par le vecteur calibEval$calibration.
calib <- dataSpEnv[calibEval$calibration,]
# On crée un tableau (déstiné à la partie test) avec les lignes du tableau
initial indiquées par le vecteur calibEval$evalution.
eval <- dataSpEnv[calibEval$evaluation,]
# GLM
# Calibration du GLM. Le nom de la variable réponse en fonction de toutes l
es variables (~.) contenues dans le tableau (data=). Nous spécifions aussi la
famille de distribution (binomial) dont la fonction lien est la fonction 'log
it'. Cette fois-ci, nous spécifions data=calib.
modGLM <- glm(VulpesVulpes~.,data=calib,family = binomial("logit"))
# Prédiction sur la partie test. Les valeurs environnementales du tableau '
eval' sont utilisées par le modèle pour prédire. Il est important de spécifie
r type="response" afin d'obtenir les valeurs après transformation grâce à la
fonction lien (voir théorie GLM). Les valeurs prédites seront comprises entre
0 et 1.
predTest <- predict(modGLM,newdata=eval,type="response")
# Calcul du TSS comme vu précédemment. Nous sauvegardons le premier élément
[1] de l'objet issu de la fonction bm_FindOptimStat qui correspond à la valeu
r du TSS.
tss <- bm_FindOptimStat("TSS",eval$VulpesVulpes,predTest,threshold = seq(0,
1,by = 0.01))[1]
# Nous sauvegardons la valeur de l'objet tss à la ligne i qui correspond un
numéro de l'itération en cours et à la colonne "GLM"
tssTable[i,"GLM"] <- tss
# Random Forest
# Calibration du Random Forest. Nous aimerions utiliser le mode 'classifica
tion', pour cela nous devons spécifier que la colonne VulpesVulpes est en fac
tor (catégorie 1 et catégorie 0). Nous calibrons notre modèle sur le jeu de d
onnées 'calib'.
modRF <- randomForest(as.factor(VulpesVulpes)~.,data=calib)
# Prédiction sur la partie test. Les valeurs environnementales du tableau '
eval' sont utilisées par le modèle pour prédire. Nous sélectionnons la deuxiè
me colonne qui correspond aux probabilité de présence.
predTest <- predict(modRF,newdata=eval,type="prob")[,2]
# Calcul du TSS comme vu précédemment. Nous sauvegardons le premier élément
[1] de l'objet issu de la fonction bm_FindOptimStat qui correspond à la valeu
r du TSS.
tss <- bm_FindOptimStat("TSS",eval$VulpesVulpes,predTest,threshold = seq(0,
1,by = 0.01))[1]
# Nous sauvegardons la valeur de l'objet tss à la ligne i qui correspond un
numéro de l'itération en cours et à la colonne "RF"
tssTable[i,"RF"] <- tss
}
Nous pouvons dès lors comparer les valeurs de TSS (validation croisée) obtenues selon les
deux techniques.
# Distribution des valeurs selon la technique.
boxplot(tssTable$GLM,tssTable$RF,names=c("GLM","RF"),ylab="TSS")
# Test statistique permettant de montrer que les deux techniques donnent des
valeurs de TSS significativement différentes (si p-value < 0.05).
print(wilcox.test(tssTable$GLM,tssTable$RF))
##
## Wilcoxon rank sum exact test
##
## data: tssTable$GLM and tssTable$RF
## W = 0, p-value = 1.083e-05
## alternative hypothesis: true location shift is not equal to 0
Selon les valeurs de TSS obtenues, nous pouvons conclure, dans notre cas, que les deux
techniques donnent de très bons résultats. Cependant, le Random Forest semble supérieur
en termes de performance prédictive avec un TSS médian très élevé.