10.4 Mise en œuvre dans R
Pour mettre en œuvre des modèles multiniveaux avec une variable dépendante continue, nous utilisons la fonction lmer
du package lme4
. Pour d’autres distributions, nous pouvons utiliser la fonction glmer
implémentant différentes familles de modèles GLM, notamment binomiale (modèle multiniveau logistique), gaussien, Gamma, inverse gaussien, Poisson, Quasi-poisson, etc. Comme pour les modèles GLMM, lorsque d’autres distributions sont nécessaires, il est possible d’utiliser le package gamlss
.
10.4.1 Le modèle vide
Dans le code R ci-dessous, la syntaxe lmer(PCTArb ~ 1 + (1| SRNOM), data = Multiniveau)
permet de construire le modèle vide avec la variable indépendante PCTArb
et SRNOM
comme variable définissant les groupes au niveau 2, soit les 312 secteurs de recensement. À titre de rappel, le modèle vide ne comprend aucune variable indépendante.
library("lme4")
library("MuMIn")
# chargement du jeu de données
load("data/multiniveau/dataArbres.RData")
# MODÈLE 1 : modèle vide (sans prédicteurs)
#------------------------------------------------------
# Écrire Y ~ 1 signifie que le modèle est vide
# 1| SRNOM : signifie que l'on fait varier la constante avec la variable SRNOM
<- lmer(PCTArb ~ 1 + (1| SRNOM), data = Multiniveau)
Modele1
# Nombre de groupes
cat("nombre de groupes =", length(unique(Multiniveau$SRNOM)))
## nombre de groupes = 312
La fonction summary(Modele1)
permet d’afficher les résultats du modèle. Dans la section intitulée Random effects
, la variance pour le niveau 2 (SRNOM (Intercept)
) est de 19,82 contre 92,93 pour le niveau 1 (Residual
). Le coefficient de corrélation intraclasse (ICC) est donc égal à \(\mbox{19,82 / (19,82+92,93)} \times \mbox{100 = 17,58}\)%.
# Résultats du modèle
summary(Modele1)
## Linear mixed model fit by REML. t-tests use Satterthwaite's method ['lmerModLmerTest']
## Formula: PCTArb ~ 1 + (1 | SRNOM)
## Data: Multiniveau
##
## REML criterion at convergence: 80299.2
##
## Scaled residuals:
## Min 1Q Median 3Q Max
## -1.9413 -0.5295 -0.2235 0.2175 8.4695
##
## Random effects:
## Groups Name Variance Std.Dev.
## SRNOM (Intercept) 19.82 4.452
## Residual 92.93 9.640
## Number of obs: 10814, groups: SRNOM, 312
##
## Fixed effects:
## Estimate Std. Error df t value Pr(>|t|)
## (Intercept) 7.3373 0.2772 314.9183 26.47 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Notez qu’il est possible d’obtenir directement la valeur de l’ICC avec la fonction icc(Modele1)
du package performance
et les statistiques d’ajustement du modèle avec les fonctions logLik
, AIC
et BIC
.
# Calcul de l'ICC (coefficient intraclasse)
::icc(Modele1) performance
## # Intraclass Correlation Coefficient
##
## Adjusted ICC: 0.176
## Unadjusted ICC: 0.176
<- performance::icc(Modele1)
ICC1 cat("Part de la variance de la variable dépendante imputable au niveau 2 : ",
round(ICC1$ICC_adjusted*100,2), "%", sep="")
## Part de la variance de la variable dépendante imputable au niveau 2 : 17.58%
# Qualité d'ajustement du modèle
cat("Statistiques d'ajustement du modèle :",
"\n-2 Log V = ", -2*logLik(Modele1),
"\nAIC =", AIC(Modele1),
"\nBIC =", BIC(Modele1))
## Statistiques d'ajustement du modèle :
## -2 Log V = 80299.22
## AIC = 80305.22
## BIC = 80327.08
10.4.2 Modèle avec les variables indépendantes du niveau 1
Le second modèle consiste à introduire les variables indépendantes mesurées pour les tronçons de rue (niveau 1). Notez comment sont centrées préalablement les variables explicatives.
# Centrage des variables indépendantes
<- c("Width","Length","AgeMed","AgeMed2","ResiPCT","DuTriPct","NoLog","Setback")
VINiv1 for (e in VINiv1){
<- paste(e, ".c", sep="")
e.c <- Multiniveau[[e]] - mean(Multiniveau[[e]])
Multiniveau[[e.c]]
}
# MODÈLE 2 : modèle avec les prédicteurs au niveau 1 (rues)
# ------------------------------------------------------
<- lmer(PCTArb ~
Modele2 # Variables indépendantes au niveau 1
+Length.c+AgeMed.c+AgeMed2.c+ResiPCT.c+DuTriPct.c+NoLog.c+Setback.c+
Width.c1| SRNOM), data = Multiniveau)
(
# Résultats du modèle
summary(Modele2)
## Linear mixed model fit by REML. t-tests use Satterthwaite's method ['lmerModLmerTest']
## Formula: PCTArb ~ Width.c + Length.c + AgeMed.c + AgeMed2.c + ResiPCT.c + DuTriPct.c + NoLog.c + Setback.c + (1 | SRNOM)
## Data: Multiniveau
##
## REML criterion at convergence: 78763.8
##
## Scaled residuals:
## Min 1Q Median 3Q Max
## -2.9065 -0.5536 -0.1941 0.2569 9.4205
##
## Random effects:
## Groups Name Variance Std.Dev.
## SRNOM (Intercept) 15.26 3.907
## Residual 80.32 8.962
## Number of obs: 10814, groups: SRNOM, 312
##
## Fixed effects:
## Estimate Std. Error df t value Pr(>|t|)
## (Intercept) 7.228e+00 2.479e-01 3.183e+02 29.151 < 2e-16 ***
## Width.c -1.292e-01 1.272e-02 1.075e+04 -10.160 < 2e-16 ***
## Length.c 1.085e-02 1.717e-03 1.073e+04 6.322 2.69e-10 ***
## AgeMed.c 1.103e+00 1.856e-01 1.080e+04 5.946 2.83e-09 ***
## AgeMed2.c -2.950e-04 4.791e-05 1.080e+04 -6.158 7.62e-10 ***
## ResiPCT.c 4.699e-02 3.466e-03 1.080e+04 13.558 < 2e-16 ***
## DuTriPct.c -1.299e-02 2.683e-03 1.070e+04 -4.842 1.30e-06 ***
## NoLog.c 1.473e-01 1.057e-02 1.080e+04 13.938 < 2e-16 ***
## Setback.c 2.018e-01 2.295e-02 1.080e+04 8.792 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Correlation of Fixed Effects:
## (Intr) Wdth.c Lngth. AgMd.c AgMd2. RsPCT. DTrPc. NoLg.c
## Width.c -0.003
## Length.c 0.011 -0.216
## AgeMed.c 0.000 0.010 -0.014
## AgeMed2.c 0.002 -0.011 0.013 -1.000
## ResiPCT.c 0.056 0.095 0.208 0.023 -0.024
## DuTriPct.c -0.010 0.022 0.086 -0.074 0.077 0.025
## NoLog.c -0.030 0.156 -0.785 -0.008 0.009 -0.269 -0.127
## Setback.c 0.048 -0.018 -0.146 0.007 -0.008 -0.014 0.035 0.038
## fit warnings:
## Some predictor variables are on very different scales: consider rescaling
# Calcul de l'ICC (coefficient intraclasse)
::icc(Modele2) performance
## # Intraclass Correlation Coefficient
##
## Adjusted ICC: 0.160
## Unadjusted ICC: 0.139
<- performance::icc(Modele2)
ICC2 cat("Part de la variance de la variable dépendante ",
"\nimputable au niveau 2 : ", round(ICC2$ICC_adjusted*100,2), "%", sep="")
## Part de la variance de la variable dépendante
## imputable au niveau 2 : 15.97%
# Calcul des R2 conditionnel et marginal avec les fonctions
# r.squaredGLMM ou r2_nakagawa du package performance
r.squaredGLMM(Modele2)
## R2m R2c
## [1,] 0.1292872 0.2683329
r2_nakagawa(Modele2)
## # R2 for Mixed Models
##
## Conditional R2: 0.268
## Marginal R2: 0.129
# Qualité d'ajustement du modèle
cat("Statistiques d'ajustement du modèle",
"\n-2 Log L = ", -2*logLik(Modele2),
"\nAIC =", AIC(Modele2),
"\nBIC =", BIC(Modele2))
## Statistiques d'ajustement du modèle
## -2 Log L = 78763.83
## AIC = 78785.83
## BIC = 78866
10.4.3 Modèle avec les variables indépendantes aux niveaux 1 et 2
Le troisième modèle comprend à la fois les variables indépendantes mesurées aux deux niveaux (tronçons et secteurs de recensement).
# MODÈLE 3 : modèle complet avec les prédicteurs aux niveaux 1 et 2
# ------------------------------------------------------
<- lmer(PCTArb ~
Modele3 # Variables indépendantes au niveau 1
+Length.c+AgeMed.c+AgeMed2.c+ResiPCT.c+DuTriPct.c+NoLog.c+Setback.c+
Width.c# Variables indépendantes au niveau 2
+UDipPCT+PCTFRAVI+PCTIMGRE+AvecEnf+FranPCT+
ValLog1| SRNOM), data = Multiniveau)
(
# Résultats du modèle
summary(Modele3)
## Linear mixed model fit by REML. t-tests use Satterthwaite's method ['lmerModLmerTest']
## Formula: PCTArb ~ Width.c + Length.c + AgeMed.c + AgeMed2.c + ResiPCT.c +
## DuTriPct.c + NoLog.c + Setback.c + ValLog + UDipPCT + PCTFRAVI + PCTIMGRE + AvecEnf + FranPCT + (1 | SRNOM)
## Data: Multiniveau
##
## REML criterion at convergence: 78742.8
##
## Scaled residuals:
## Min 1Q Median 3Q Max
## -3.0461 -0.5558 -0.1939 0.2622 9.4190
##
## Random effects:
## Groups Name Variance Std.Dev.
## SRNOM (Intercept) 12.12 3.482
## Residual 80.35 8.964
## Number of obs: 10814, groups: SRNOM, 312
##
## Fixed effects:
## Estimate Std. Error df t value Pr(>|t|)
## (Intercept) -5.175e-01 3.227e+00 3.136e+02 -0.160 0.87271
## Width.c -1.319e-01 1.271e-02 1.076e+04 -10.375 < 2e-16 ***
## Length.c 1.076e-02 1.717e-03 1.073e+04 6.265 3.87e-10 ***
## AgeMed.c 1.097e+00 1.854e-01 1.078e+04 5.920 3.31e-09 ***
## AgeMed2.c -2.936e-04 4.785e-05 1.078e+04 -6.136 8.75e-10 ***
## ResiPCT.c 4.649e-02 3.482e-03 1.078e+04 13.352 < 2e-16 ***
## DuTriPct.c -1.268e-02 2.677e-03 1.061e+04 -4.737 2.20e-06 ***
## NoLog.c 1.478e-01 1.057e-02 1.079e+04 13.985 < 2e-16 ***
## Setback.c 1.944e-01 2.307e-02 1.079e+04 8.428 < 2e-16 ***
## ValLog 1.591e-02 3.856e-03 3.127e+02 4.126 4.75e-05 ***
## UDipPCT 1.405e-02 3.546e-02 3.292e+02 0.396 0.69221
## PCTFRAVI -8.837e-02 2.958e-02 3.282e+02 -2.988 0.00302 **
## PCTIMGRE 2.367e-01 4.860e-02 3.217e+02 4.870 1.76e-06 ***
## AvecEnf 5.778e-04 3.226e-02 3.141e+02 0.018 0.98572
## FranPCT 5.213e-02 1.638e-02 3.163e+02 3.183 0.00160 **
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## fit warnings:
## Some predictor variables are on very different scales: consider rescaling
# Qualité d'ajustement du modèle
cat("Statistiques d'ajustement du modèle",
"\n-2 Log L = ", -2*logLik(Modele3),
"\nAIC =", AIC(Modele3), "\nBIC =", BIC(Modele3))
## Statistiques d'ajustement du modèle
## -2 Log L = 78742.85
## AIC = 78776.85
## BIC = 78900.75
# Calcul de l'ICC (coefficient intraclasse)
::icc(Modele3) performance
## # Intraclass Correlation Coefficient
##
## Adjusted ICC: 0.131
## Unadjusted ICC: 0.110
<- performance::icc(Modele3)
ICC3 cat("Part de la variance de la variable dépendante ",
"\nimputable au niveau 2 : ", round(ICC3$ICC_adjusted*100,2), "%", sep="")
## Part de la variance de la variable dépendante
## imputable au niveau 2 : 13.11%
# Calcul des R2 conditionnel et marginal avec les fonctions
# r.squaredGLMM ou r2_nakagawa du package performance
r.squaredGLMM(Modele3)
## R2m R2c
## [1,] 0.1598477 0.269979
r2_nakagawa(Modele3)
## # R2 for Mixed Models
##
## Conditional R2: 0.270
## Marginal R2: 0.160
10.4.4 Modèle complet avec une interaction
Le quatrième modèle consiste à ajouter au modèle complet une interaction entre deux variables des deux niveaux.
# Variance d'interaction
$PCTFRAVI_Setback <- Multiniveau$PCTFRAVI * Multiniveau$Setback.c
Multiniveau
# MODÈLE 4 : interaction aux deux niveaux
# ------------------------------------------------------
<- lmer(PCTArb ~
Modele4 # Variables indépendantes au niveau 1
+Length.c+AgeMed.c+AgeMed2.c+ResiPCT.c+DuTriPct.c+NoLog.c+Setback.c+
Width.c# Variables indépendantes au niveau 2
+UDipPCT+PCTFRAVI+PCTIMGRE+AvecEnf+FranPCT+
ValLog# Variable d'interaction
+
PCTFRAVI_Setback1| SRNOM), data = Multiniveau)
(
# Résultats du modèle
summary(Modele4)
## Linear mixed model fit by REML. t-tests use Satterthwaite's method ['lmerModLmerTest']
## Formula: PCTArb ~ Width.c + Length.c + AgeMed.c + AgeMed2.c + ResiPCT.c +
## DuTriPct.c + NoLog.c + Setback.c + ValLog + UDipPCT + PCTFRAVI +
## PCTIMGRE + AvecEnf + FranPCT + PCTFRAVI_Setback + (1 | SRNOM)
## Data: Multiniveau
##
## REML criterion at convergence: 78732.7
##
## Scaled residuals:
## Min 1Q Median 3Q Max
## -3.0148 -0.5568 -0.1922 0.2598 9.4261
##
## Random effects:
## Groups Name Variance Std.Dev.
## SRNOM (Intercept) 11.83 3.439
## Residual 80.24 8.958
## Number of obs: 10814, groups: SRNOM, 312
##
## Fixed effects:
## Estimate Std. Error df t value Pr(>|t|)
## (Intercept) -9.484e-03 3.198e+00 3.132e+02 -0.003 0.99764
## Width.c -1.357e-01 1.273e-02 1.076e+04 -10.660 < 2e-16 ***
## Length.c 1.079e-02 1.716e-03 1.073e+04 6.289 3.32e-10 ***
## AgeMed.c 1.092e+00 1.852e-01 1.078e+04 5.894 3.88e-09 ***
## AgeMed2.c -2.923e-04 4.780e-05 1.078e+04 -6.114 1.00e-09 ***
## ResiPCT.c 4.608e-02 3.480e-03 1.078e+04 13.239 < 2e-16 ***
## DuTriPct.c -1.268e-02 2.674e-03 1.059e+04 -4.742 2.14e-06 ***
## NoLog.c 1.454e-01 1.057e-02 1.079e+04 13.747 < 2e-16 ***
## Setback.c 3.443e-03 4.759e-02 1.076e+04 0.072 0.94233
## ValLog 1.582e-02 3.820e-03 3.119e+02 4.141 4.46e-05 ***
## UDipPCT 9.404e-03 3.515e-02 3.288e+02 0.268 0.78920
## PCTFRAVI -7.883e-02 2.937e-02 3.322e+02 -2.684 0.00764 **
## PCTIMGRE 2.194e-01 4.829e-02 3.261e+02 4.543 7.82e-06 ***
## AvecEnf -7.063e-03 3.199e-02 3.136e+02 -0.221 0.82542
## FranPCT 4.987e-02 1.623e-02 3.161e+02 3.072 0.00231 **
## PCTFRAVI_Setback 8.169e-03 1.779e-03 1.047e+04 4.591 4.46e-06 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## fit warnings:
## Some predictor variables are on very different scales: consider rescaling
# Qualité d'ajustement du modèle
cat("Statistiques d'ajustement du modèle",
"\n-2 Log L = ", -2*logLik(Modele4),
"\nAIC =", AIC(Modele3), "\nBIC =", BIC(Modele4))
## Statistiques d'ajustement du modèle
## -2 Log L = 78732.66
## AIC = 78776.85
## BIC = 78899.85
# Calcul de l'ICC (coefficient intraclasse)
::icc(Modele4) performance
## # Intraclass Correlation Coefficient
##
## Adjusted ICC: 0.128
## Unadjusted ICC: 0.108
<- performance::icc(Modele4)
ICC4 cat("Part de la variance de la variable dépendante ",
"\nimputable au niveau 2 : ", round(ICC4$ICC_adjusted*100,2), "%", sep="")
## Part de la variance de la variable dépendante
## imputable au niveau 2 : 12.85%
# Calcul des R2 conditionnel et marginal avec les fonctions
# r.squaredGLMM ou r2_nakagawa du package performance
r.squaredGLMM(Modele4)
## R2m R2c
## [1,] 0.1628372 0.270394
r2_nakagawa(Modele4)
## # R2 for Mixed Models
##
## Conditional R2: 0.270
## Marginal R2: 0.163
10.4.5 Comparaison des quatre modèles
Pour comparer les modèles, nous utilisons habituellement les statistiques d’ajustement du modèle vues plus haut, soit le maximum de vraisemblance (−2 Log-likelihood), l’AIC, l’ICC et les R2 marginal et conditionnel.
<- c(logLik(Modele1),logLik(Modele2),logLik(Modele3),logLik(Modele4))
c_logLik <- c(performance::icc(Modele1)$ICC_adjusted,
ICC ::icc(Modele2)$ICC_adjusted,
performance::icc(Modele3)$ICC_adjusted,
performance::icc(Modele4)$ICC_adjusted)
performance
<- c(r.squaredGLMM(Modele1)[1],
R2m r.squaredGLMM(Modele2)[1],
r.squaredGLMM(Modele3)[1],
r.squaredGLMM(Modele4)[1])
<- c(r.squaredGLMM(Modele1)[2],
R2c r.squaredGLMM(Modele2)[2],
r.squaredGLMM(Modele3)[2],
r.squaredGLMM(Modele4)[2])
print(data.frame(
Modele = c("Modèle 1 (vide)",
"Modèle 2 (VI : niv. 1)",
"Modèle 3 (VI : niv. 1 et 2)",
"Modèle 4 (interaction niv. 1 et 2"),
dl = AIC(Modele1, Modele2, Modele3, Modele4)$df,
Moins2LogLik = round(-2*c_logLik,0),
AIC = round(AIC(Modele1, Modele2, Modele3, Modele4)$AIC,0),
ICC = round(ICC,4),
R2marg = round(R2m,3),
R2cond = round(R2c,3)
))
## Modele dl Moins2LogLik AIC ICC R2marg R2cond
## 1 Modèle 1 (vide) 3 80299 80305 0.1758 0.000 0.176
## 2 Modèle 2 (VI : niv. 1) 11 78764 78786 0.1597 0.129 0.268
## 3 Modèle 3 (VI : niv. 1 et 2) 17 78743 78777 0.1311 0.160 0.270
## 4 Modèle 4 (interaction niv. 1 et 2 18 78733 78769 0.1285 0.163 0.270
Vous constaterez ci-dessus que les valeurs d’AIC et de -2 log de vraisemblance diminuent des modèles 1 à 4, signalant une amélioration progressive des modèles. Cela se traduit aussi par une augmentation du R2 conditionnel incluant à la fois les effets fixes et aléatoires. Sans surprise, la valeur du coefficient de corrélation intraclasse diminue du modèle vide au modèle complet : plus nous ajoutons de variables dépendantes, plus la capacité explicative du niveau 2 diminue.
Il est également judicieux de vérifier si un modèle est significativement différent du modèle précédent avec la fonction anova
qui compare les différences de leurs déviances. En guise d’exemple, la différence de déviance de 59 (\(\mbox{78 625}-\mbox{78 684}=\mbox{59}\)) entre les modèles 3 et 2 (modèle complet versus modèle GLMM) avec six degrés de liberté – puisque le modèle 3 inclut six variables indépendantes de plus que le précédent (\(\mbox{17}-\mbox{11}=\mbox{6}\)) – est significative (p < 0,001). Cela indique que le modèle 3 est plus performant que le précédent.
anova(Modele1, Modele2, Modele3, Modele4)
## Data: Multiniveau
## Models:
## Modele1: PCTArb ~ 1 + (1 | SRNOM)
## Modele2: PCTArb ~ Width.c + Length.c + AgeMed.c + AgeMed2.c + ResiPCT.c + DuTriPct.c + NoLog.c + Setback.c + (1 | SRNOM)
## Modele3: PCTArb ~ Width.c + Length.c + AgeMed.c + AgeMed2.c + ResiPCT.c + DuTriPct.c + NoLog.c + Setback.c + ValLog + UDipPCT + PCTFRAVI + PCTIMGRE + AvecEnf + FranPCT + (1 | SRNOM)
## Modele4: PCTArb ~ Width.c + Length.c + AgeMed.c + AgeMed2.c + ResiPCT.c + DuTriPct.c + NoLog.c + Setback.c + ValLog + UDipPCT + PCTFRAVI + PCTIMGRE + AvecEnf + FranPCT + PCTFRAVI_Setback + (1 | SRNOM)
## npar AIC BIC logLik deviance Chisq Df Pr(>Chisq)
## Modele1 3 80304 80326 -40149 80298
## Modele2 11 78706 78786 -39342 78684 1614.351 8 < 2.2e-16 ***
## Modele3 17 78659 78783 -39313 78625 59.131 6 6.758e-11 ***
## Modele4 18 78640 78771 -39302 78604 21.166 1 4.213e-06 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1