Chapter 4 Les MLM sous R[EN CONSTRUCTION]
Nous allons enfin voir comment stipuler et tester un modèle sur R. Mais nous avancerons pas à pas, sans trop nous brusquer. Ne serait-ce que parce que R est t’Rifiant (on peut en faire plein des comme ça). Mais paradoxalement, je trouve que R a été pour moi, bien meilleur pédagogue concernant les MLM que Jamovi ou pire, SPSS.
Alors nous allons emprunter le même chemin que j’ai moi-même emprunté. Il y aura des embuches, mais je vais tâcher de vous déblayer le terrain au mieux.
4.1 Deux packages
R fonctionne par packages. Un package est un ensemble d’algorithme, de commandes et autres permettant des opérations plus ou moins complexes. En gros, R peut faire des trucs tout seul mais pour faire des MLM, il vaut mieux passer par des packages. Mais les packages sont développés par qui veut. Ce qui signifie qu’il y des bons packages et des mauvais packages. Les bons packages sont des packages qui… enfin bon, vous voyez la suite.
Classiquement, pour réaliser un MLM sous R, on utilise soit lme4
, soit nlme
. Voyons leurs spécificités (pas de panique, un tableau comparatif est proposé à la fin, vous pouvez y bondir de suite).
4.1.1 lme4
Ce package a été développé par Bates et al. (2005) pour l’analyse de modèles linéaires mixtes et de modèles linéaires mixtes généralisés (MLMg).
La différence entre les MLM et les MLMG se fait sur la VD : pour les MLMG, la VD peut ne pas suivre une distribution normale, contrairement aux MLM.
4.1.1.1 Syntaxe générale
Comme R fonctionne par lignes de commandes, les auteurs du lme4 ont essayé de simplifier les choses en proposant la syntaxe suivante :
model <- lmer(y ~ facteur.fixe.1 + facteur.fixe.2 + facteur.fixe.1:facteur.fixe.2 + (1|subjets), data=bdd, REML=F)
Détaillons cette commande :
model<-
un grand classique de R qui signifie : “ce qui arrive après la”<-” sera enregistré dans un objet appelé “model”.
lmer()
est la fonction issue du package lme4 pour construire le modèle. y est notre VD. La lettre doit être remplacée par le nom de la variable tel qu’il apparaît dans la base de donnée bdd.
~
signifie “voilà par quoi j’aimerais prédire ma VD”.
facteur.fixe.1
et facteur.fixe.2
sont évidemment nos facteurs fixes. Comme pour la VD, nous devons utiliser leurs noms tels qu’ils apparaissent dans la base de données bdd.
+
signifie : “ajoute l’argument (le facteur fixe) suivant” :
signifie : “interaction”. + facteur.fixe.1:facteur.fixe.2
signifie donc : “ajoute l’interaction entre le facteur fixe 1
et le facteur fixe 2
”.
Petite subtilité : plutôt que d’écrire facteur.fixe.1 + facteur.fixe.2 + facteur.fixe.1:facteur.fixe.2
, j’aurais pu écrire : facteur.fixe.1*facteur.fixe.2
. Le *
permet de stipuler tous les effets de tous les ordres des facteurs autour de lui : les effets simples et les effets d’interaction.
(1|sujets)
stipule les effets aléatoires. Ici, nous avons “j’autorise chaque sujet à avoir son propre intercept”.
data=bdd
Nous permet de dire à partir de quelle base de données nous voulons construire le modèle.
REML=F
Veut dire “n’utilise pas la méthode REML, utilise plutôt la méthode ML”.
4.1.1.2 Syntaxe : les effets aléatoires[EN CONSTRUCTION]
Avec la fonction lmer()
, nous pouvons spécifier des relations entre les facteurs aléatoires. C’est l’exemple du sujet qui appartient à une classe qui appartient à une école, etc. Nous verrons des exemples de syntaxe un peu plus tard.
4.1.1.3 Test et interprétation du modèle
lme4
ne vous donnera pas de valeurs p. Quoi quoi quoi ??? Mais mais mais ??? La raison est statistique mais relève aussi d’un choix des auteurs. Pour faire simple : calculer les ddl (qui conditionnent les valeurs p) pour les différents coefficients (facteurs) est aussi simple dans les MLM que de compter le nombre de pièces de Lego dans une construction. Les relations entre les facteurs sont complexes, les observations souvent corrélées, etc. Or, pour se baser sur une statistique appelant une valeur p, il faut bien des ddl.
Heureusement, il existe des alternatives :
- Utiliser le package
lmerTest
qui fournit des valeurs p approximatives basées sur des ddl à la Satterthwaite ou Kenward-Roger - Utiliser les indices de vraisemblance
alors que l’approximation de Kenward-Roger est plus pertinente pour des modèles assez complexes, notamment au niveau des effets aléatoires. D’expérience, les ddl diffèrent mais pas la décision statistique.
4.1.2 nlme
Ce package a été développé par Pinheiro & Bates (2000) pour l’analyse de modèles linéaires et non linéaires mixtes.
Comme le nom l’indique, les modèles non linéaires mixtes permettent de stipuler des liens…non linéaires (un peu comme le lien entre la consommation d’alcool et la créativité). Oui, dit comme ça, c’est idiot mais c’est aussi un peu idiot de considérer que nos variables sont liées de manière linéaire, non ? Mais étant dans un livre portant sur les MLM, nous allons considérer que ce n’est pas si idiot que ça.
4.1.2.1 Syntaxe générale
Là aussi, les auteurs ont été sympas avec les utilisateurs et ils ont proposé une syntaxe pour construire et analyser nos modèles. Et en plus, elle ressemble fortement à celle de lme4
:
model <- lme(y ~ facteur.fixe.1 + facteur.fixe.2, random = ~ 1 | sujet, data = bdd)
La syntaxe étant similaire, son interprétation équivaut à celle de lmer
:
model<-
un grand classique de R qui signifie : “ce qui arrive après la <-
sera enregistré dans un objet appelé model
”.
lmer()
est la fonction issue du package lme4
pour construire le modèle.
y
est notre VD. La lettre doit être remplacée par le nom de la variable tel qu’il apparaît dans la base de donnée bdd.
~
signifie “voilà par quoi j’aimerais prédire ma VD”.
facteur.fixe.1
et facteur.fixe.2
sont évidemment nos facteurs fixes.
Comme pour la VD, nous devons utiliser leurs noms tels qu’ils apparaissent dans la base de données bdd.
+
signifie : “ajoute l’argument (le facteur fixe) suivant”.
:
signifie : “interaction”. + facteur.fixe.1:facteur.fixe.2
signifie donc : “ajoute l’interaction entre le facteur fixe 1 et le facteur fixe 2.
Petite subtilité : Pareil que pour lmer ! Plutôt que d’écrire facteur.fixe.1 + facteur.fixe.2 + facteur.fixe.1:facteur.fixe.2
, j’aurais pu écrire : facteur.fixe.1*facteur.fixe.2
. Le *
permet de stipuler tous les effets de tous les ordres des facteurs autour de lui : les effets simples et les effets d’interaction.
Petite différence toutefois pour les effets aléatoires :
random = ~ 1 | sujet
est différent de lmer mais veut dire la même chose.
4.1.2.2 Syntaxe : les effets aléatoires
Tout comme la fonction lmer()
, la fonction lme()
permet de stipuler l’emboîtement de facteurs aléatoire. Mais en plus, elle permet de modéliser les corrélation entre ces facteurs.
En vérité, lmer()
peut également le faire, dans une certaine mesure. Il suffit de stipuler des interactions entre les facteurs aléatoires, de la même manière que pour les effets fixes :(random1:random2|random2)
. Je n’ai jamais testé, ni avec lmer()
ni avec lme()
. D’une part, je m’intéresse tout de même plus aux effets fixes qu’aux effets aléatoire et d’autre part, plus le modèle est complexe, plus il faut de données. Dans ce cas, autant privilégier la complexité des relations entre les effets fixes, non ?
4.1.2.3 Test et interprétation du modèle
Avec le package nlme
, nous pouvons avoir nos fameuses valeur p. Pourquoi ? Parce que c’est plus simple pour l’utilisateur. L’argument paraît simpliste mais pas tant que ça en réalité. nlme
utilise également une approximation mais au niveau des tests inférentiels appliqués aux effets (les tests de Wald). Le hic, c’est que ces tests offrent une approximation plutôt fiable surtout dans les cas de modèles plutôt simples et d’échantillons plutôt élevés. Notez que je dis “plutôt”, simplement parce que je n’ai pas trouvé de valeurs seuils fiables et consensuels sur la complexité du modèle ou le nombre d’observations nécessaires. Cela étant dit, je n’ai pas souvent noté de grandes différences entre les deux packages sur mes propres modèles.
4.1.3 Comparaison des deux packages
lme4 | nlme | |
---|---|---|
Usage | Se veut super rigoureux et précis | Se veut pratique |
Modèles | Modèle linéaires et non linéaires mixtes | Modèles linéaires mixtes et modèles linéaires généralisés mixtes |
Méthodes d’estimation | ML & REML | ML & REML |
Effets aléatoires | Peut modéliser les structures les plus complexes | Peut modéliser les structures les plus courantes |
Tests d’effets fixes | Fournit des valeurs p sur la base de tests de Wald | Utiliser lmerTest pour des valeurs p, sinon indices de vraisemblance |
4.2 Respiration avant de plonger
Je pense que c’est le bon moment pour commencer à manipuler concrètement un jeu de données. Pour cela, nous allons traiter la même bdd en utilisant d’abord, le package lme4
puis, le package nlme.
Il y aura pas mal de redondance. Aussi, si vous savez déjà quel package vous voulez utiliser, vous pouvez aller directement à la section correspondante.
4.2.1 La base de données
4.2.1.1 L’étude
La base de données que nous utiliserons est très largement utilisée dans les tutoriels. Dans cette étude, nous cherchons à prédire la réussite en mathématiques en fonction de différentes variables : le genre, l’âge, la taille de la classe, l’expérience de l’enseignant, etc. L’intérêt de cette étude est qu’elle se base sur un échantillonnage d’écoles puis de classes au sein des différentes écoles puis d’élèves au sein des classes : c’est là tout l’intérêt de la modélisation des facteur aléatoires.
4.2.1.2 La base de données
Vous avez ici les premières lignes de la bdd :
childid | sex | minority | mathkind | mathgain | ses | yearstea | mathknow | housepov | mathprep | classid | schoolid |
---|---|---|---|---|---|---|---|---|---|---|---|
1 | 1 | 1 | 448 | 32 | 0.46 | 1 | NA | 0.082 | 2.00 | 160 | 1 |
2 | 0 | 1 | 460 | 109 | -0.27 | 1 | NA | 0.082 | 2.00 | 160 | 1 |
3 | 1 | 1 | 511 | 56 | -0.03 | 1 | NA | 0.082 | 2.00 | 160 | 1 |
4 | 0 | 1 | 449 | 83 | -0.38 | 2 | -0.11 | 0.082 | 3.25 | 217 | 1 |
5 | 0 | 1 | 425 | 53 | -0.03 | 2 | -0.11 | 0.082 | 3.25 | 217 | 1 |
6 | 1 | 1 | 450 | 65 | 0.76 | 2 | -0.11 | 0.082 | 3.25 | 217 | 1 |
7 | 0 | 1 | 452 | 51 | -0.03 | 2 | -0.11 | 0.082 | 3.25 | 217 | 1 |
8 | 0 | 1 | 443 | 66 | 0.20 | 2 | -0.11 | 0.082 | 3.25 | 217 | 1 |
- childid : identifiants des enfants
- classid : identifiants des classes
- schoolid : identifiants des écoles
- sex : 0 = garçon ; 1 = fille
- minority : 0 = élève non issu d’une minorité ethnique ; 1 = élève issu d’une minorité ethnique
- mathgs : score de l’élève en maths en grande section
- mathgain : gain sur le score en maths entre la grande section et CP (la VD principale)
- ses : statut socio-économique de l’élève
- yearstea : années d’expérience de l’enseignant
- mathknow : niveau de connaissance en maths de l’enseignant
- housepov : proportion de foyers dans le quartier de l’école en dessous du seuil de pauvreté
- mathprep : préparation en mathématiques des enseignants du premier degré : nombre de cours sur le contenu et les méthodes des mathématiques
4.2.1.3 La démarche
Nous n’utiliserons pas toutes les variables. Ce qui nous intéresse ici n’est pas tant l’hypothèse à tester que la manière de la tester. Au maximum, nous nous efforcerons de prendre des trajectoires similaires avec les deux packages. Ce ne sera pas toujours possible mais les différences seront relativement minimes