Chapitre 12 Step 4. Interprétation et visualisation
12.1 Interprétation de notre modèle
Regardons de plus près notre modèle final en utilisant la fonction summary()
. Comment pouvons-nous interpréter ces informations?
# Maintenant nous sommes prêts pour l'interprétation et la
# visualisation. Regardons de plus près notre modèle final
# en utilisant la fonction `summary()`.
<- summary(M8)) (summ_M8
## Linear mixed model fit by REML ['lmerMod']
## Formula: Z_TP ~ Z_Length + (1 + Z_Length | Fish_Species) + (1 | Lake)
## Data: fish.data
##
## REML criterion at convergence: 21.7
##
## Scaled residuals:
## Min 1Q Median 3Q Max
## -2.77187 -0.60166 0.05589 0.64239 2.27776
##
## Random effects:
## Groups Name Variance Std.Dev. Corr
## Lake (Intercept) 0.20504 0.4528
## Fish_Species (Intercept) 0.86715 0.9312
## Z_Length 0.02466 0.1570 1.00
## Residual 0.05039 0.2245
## Number of obs: 180, groups: Lake, 6; Fish_Species, 3
##
## Fixed effects:
## Estimate Std. Error t value
## (Intercept) -0.0009059 0.5687733 -0.002
## Z_Length 0.4222697 0.0922117 4.579
##
## Correlation of Fixed Effects:
## (Intr)
## Z_Length 0.929
## optimizer (nloptwrap) convergence code: 0 (OK)
## boundary (singular) fit: see help('isSingular')
Allons-y section par section et essayons de comprendre ce que nous regardons.
La sortie est divisée en descriptions des effets aléatoires (ce qui peut varier en fonction de la distribution normale) et les effets fixes (ce que nous estimons comme pour une régression classique) :
Effets aléatoires:Groups
: facteurs de regroupementName
:(Intercept)
pour l’ordonnée à l’origine, ou le nom de la variable sur lequel porte l’effet mixe dans le cas d’une pente aléatoire, (Z_length
dans notre exemple)Variance
la variance estimée de l’effet (Std.Dev.
est l’écart type de cette valeur)Corr
indique la corrélation entre la pente aléatoire et l’ordonnée à l’origine aléatoire pour un groupement donné (voir cette discussion)
Cette partie présente l’estimation des effets fixes. Une valeur de la statistique T (test de Student) est retournée sans valeur de p (c’est un choix des auteurs du package, voir pourquoi dans cette discussion).
Cette statistique peut être utilisée telle quelle. Vous pouvez aussi calculer l’intervalle de confiance (IC) à 95% avec cette table en utilisant:
\[ IC = Estimate \pm 1.96*Std.Error \]
Si 0 est dans cet interval, alors le paramètre n’est pas significativement différente de zéro au seuil \(\alpha\) = 0.05.
En utilisant notre exemple: Pour déterminer si la pente, et donc l’effet de la longueur sur la position trophique, est significativement différente de zéro, vous devez d’abord calculer l’intervalle de confiance (IC) du paramètre de la pente (estimation pour Z_Length dans la section des effets fixes = 0,4223). CI = l’erreur-type de l’estimation x 1,96 plus ou moins l’estimation du paramètre. Si l’IC inclut zéro, la pente n’est pas significativement différente de zéro au seuil de 0,05.
Quelques fonctions utiles
coef(M8)
etranef(M8)
retournent les effets aléatoires du modèle M8coef(summary(M8))
retourne les effets fixessigma(M8)
retourne l’écart type des résidusfitted(M8)
retourne les valeurs prédites par le modèleresiduals(M8)
retourne les résidus
12.2 Défi 6
1. Quelle est la pente et son intervalle de confiance de la variable Z_Length dans le modèle M8?
2. Est-ce que la pente de Z_Length est significativement différente de 0 ?
Défi 6 Solution:
1. Quelle est la pente et son intervalle de confiance de la variable Z_Length dans le modèle M8?
pente = 0.422;
limite supérieure de l’IC = 0.4223 + 0.09*1.96 = 0.5987
limite inférieure de l’IC = 0.4223 - 0.09*1.96 = 0.2459
2. Est-ce que la pente de Z_Length est significativement différente de 0 ?
- Oui, car l’IC [0.2459, 0.5987] n’inclut pas 0
12.3 Défi 7
Il est possible de visualiser graphiquement les différentes ordonnées à l’origine et pentes du modèle pour mieux interpréter les résultats?
Prenez 2 minutes pour réfléchir aux différentes façons pour représenter les résultats de M8.
Indice: considérez les différents “niveaux” du modèle
Défi 7 Solution:
Il est possible de visualiser graphiquement les différentes ordonnées à l’origine et pentes du modèle pour mieux interpréter les résultats?
Oui! Nous pourrions le faire en générant:
Figure avec toutes les données regroupées
Figure par espèce
Figure par lac
Pour faire ces figures, il nous faut (1) les coefficients du modèle complet qui sont dans le résumé du modèle, (2) les coefficients pour chaque niveau du modèle qu’on obtient avec la fonction coef
.
# Défi 7 : *Il est possible de visualiser graphiquement les
# différentes ordonnées à l'origine et pentes du modèle
# pour mieux interpréter les résultats ?
# Solution du défi 7 : Oui ! Nous pourrions le faire en
# générant les figures suivantes. a) Figure avec toutes
# les données regroupées b) Figure par espèce c) Figure par
# lac
# Pour produire ces figures, nous avons d'abord besoin des
# coefficients du modèle complet qui se trouvent dans le
# résumé du modèle.
$coefficients summ_M8
## Estimate Std. Error t value
## (Intercept) -0.0009058974 0.56877327 -0.001592722
## Z_Length 0.4222697238 0.09221166 4.579352788
# Intercept = Intercept = 9.0589745 × 10^4 Slope =
# 0.4222697
# Nous avons également besoin des coefficients pour chaque
# niveau du modèle, qui peuvent être obtenus avec la
# fonction `coef`.
coef(M8)
## $Lake
## (Intercept) Z_Length
## L1 -0.085984071 0.4222697
## L2 0.002205209 0.4222697
## L3 -0.301816557 0.4222697
## L4 -0.574039728 0.4222697
## L5 0.218650140 0.4222697
## L6 0.735549622 0.4222697
##
## $Fish_Species
## (Intercept) Z_Length
## S1 -1.0752985 0.2410746
## S2 0.5597871 0.5168300
## S3 0.5127938 0.5089046
##
## attr(,"class")
## [1] "coef.mer"
Maintenant, faisons nos figures!
- Figure avec toutes les données regroupées
# Maintenant, faisons nos figures !
# a) Figure avec toutes les données groupées Créez un thème
# ggplot simplifié
<- theme_bw() + theme(panel.grid.minor = element_blank(),
fig panel.grid.major = element_blank(), panel.background = element_blank()) +
theme(strip.background = element_blank(), strip.text.y = element_text()) +
theme(legend.background = element_blank()) + theme(legend.key = element_blank()) +
theme(panel.border = element_rect(colour = "black", fill = NA))
<- ggplot(aes(Z_Length, Z_TP), data = fish.data)
plot <- plot + geom_point() + xlab("Length (mm)") + ylab("Trophic position") +
Plot_AllData labs(title = "All data") + fig
+ geom_abline(intercept = summ_M8$coefficients[1,
Plot_AllData 1], slope = summ_M8$coefficients[2, 1])
# Vous pouvez également écrire les chiffres comme ceci :
# Plot_AllData + geom_abline(intercept = -0.0009059, slope
# = 0.4222697)
- Figure par espèce
# b) Figure par espèce Mettre les coefs dans un tableau
# pour les rendre plus faciles à manipuler
<- coef(M8)$Lake
Lake.coef colnames(Lake.coef) <- c("Intercept", "Slope")
<- coef(M8)$Fish_Species
Species.coef colnames(Species.coef) <- c("Intercept", "Slope")
<- plot + geom_point(aes(colour = factor(Fish_Species)),
Plot_BySpecies size = 4) + xlab("Longueur (mm)") + ylab("Position trophique") +
labs(title = "Par espèce") + fig
# Ajoutez les lignes de régression pour chaque espèce
+ geom_abline(intercept = Species.coef[1, 1],
Plot_BySpecies slope = Species.coef[1, 2], col = "coral2") + geom_abline(intercept = Species.coef[2,
1], slope = Species.coef[2, 2], col = "green4") + geom_abline(intercept = Species.coef[3,
1], slope = Species.coef[3, 2], col = "blue1")
- Figure par lac
# c) Figure par lac
<- plot + geom_point(aes(colour = factor(Lake)),
Plot_ByLake size = 4) + xlab("Length (mm)") + ylab("Trophic Position") +
labs(title = "By Lake") + fig
# Ajouter les lignes de régression avec les ordonnées à
# l'origine spécifiques à chaque lac
+ geom_abline(intercept = Lake.coef[1, 1], slope = Lake.coef[1,
Plot_ByLake 2], col = "coral2") + geom_abline(intercept = Lake.coef[2,
1], slope = Lake.coef[2, 2], col = "khaki4") + geom_abline(intercept = Lake.coef[3,
1], slope = Lake.coef[3, 2], col = "green4") + geom_abline(intercept = Lake.coef[4,
1], slope = Lake.coef[4, 2], col = "darkgoldenrod") + geom_abline(intercept = Lake.coef[5,
1], slope = Lake.coef[5, 2], col = "royalblue1") + geom_abline(intercept = Lake.coef[6,
1], slope = Lake.coef[6, 2], col = "magenta3")
12.4 Défi 8
Vérifions nos connaissances en envisageant un autre scénario.
Vous avez inventorié la richesse dans 1000 quadrats qui sont dans 10 sites différents qui sont également dans 10 forêts différentes. Vous avez de plus mesuré la productivité dans chaque quadrat.
Vous désirez savoir si la productivité est un bon prédicteur de biodiversité. Quel modèle mixte pourriez-vous utiliser pour ce jeu de données?
Défi 8 Solution:
lmer(Biodiv ~ Productivity + (1 | Forest/Site))
Ici les effets aléatoires sont nichés (i.e. Sites dans forêt) et non croisés.
Pourquoi utiliser (1 | Foret / Site)
plutôt que (1 | Foret) + (1 | Site)
?
Regardez cette réponse!