# 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](https://www.youtube.com/watch?v=QuGcoOJKXT8).&#x20;

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).

## lme4

Ce package a été développé par Bates et al. (2015 ; nombreuses mises à jour) pour l'analyse de modèles linéaires mixtes et de modèles linéaires mixtes généralisés.

{% hint style="info" %}
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.
{% endhint %}

### Syntaxe

Comme R fonctionne par lignes de commandes, les auteurs du lme4 ont essayé de simplifier les choses en proposant la syntaxe suivante :&#x20;

`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 :&#x20;

`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`.&#x20;

`~` 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.&#x20;

{% hint style="info" %}
**Petite subtilité** : plutôt que d'écrire `facteur.fixe.1 + facteur.fixe.2 + facteur.fixe.1:facteur.fixe.2`, j'aurais aussi pu écrire : `facteur.fixe.1*facteur.fixe.2`. Le `*` permet de stipuler tous les effets de tous les ordres des facteurs stipulés autour de lui.&#x20;

`facteur.fixe.1*facteur.fixe.2*facteur.fixe.3` est la même chose que `facteur.fixe.1+facteur.fixe.2+facteur.fixe.3+facteur.fixe.1:facteur.fixe.2+facteur.fixe.1:facteur.fixe.3+facteur.fixe.2+facteur.fixe.3+facteur.fixe.1+facteur.fixe.2:facteur.fixe.3`
{% endhint %}

`(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"

### Syntaxe, les effets aléatoires

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.&#x20;

### Test et interprétation du modèle

`lme4` ne vous **donnera pas de valeurs&#x20;**_**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.&#x20;

Heureusement, il existe des alternatives :&#x20;

* 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&#x20;

{% hint style="info" %}
Sans entrer dans les détails, l'approximation de Satterthwaite est peu coûteuse et souvent utilisée pour des modèles relativement simples 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.&#x20;
{% endhint %}



## nlme

Ce package a été développé par Pinheiro & Bates (2000 ; nombreuses mises à jour) pour l'analyse de modèles linéaires et non linéaires mixtes.

{% hint style="info" %}
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.&#x20;
{% endhint %}

### Syntaxe

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 :&#x20;

`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`.&#x20;

`~` 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.&#x20;

{% hint style="info" %}
**Petite subtilité** : plutôt que d'écrire `facteur.fixe.1 + facteur.fixe.2 + facteur.fixe.1:facteur.fixe.2`, j'aurais aussi pu écrire : `facteur.fixe.1*facteur.fixe.2`. Le `*` permet de stipuler tous les effets de tous les ordres des facteurs stipulés autour de lui.&#x20;

`facteur.fixe.1*facteur.fixe.2*facteur.fixe.3` est la même chose que `facteur.fixe.1+facteur.fixe.2+facteur.fixe.3+facteur.fixe.1:facteur.fixe.2+facteur.fixe.1:facteur.fixe.3+facteur.fixe.2+facteur.fixe.3+facteur.fixe.1+facteur.fixe.2:facteur.fixe.3`
{% endhint %}

Petite différence toutefois pour les effets aléatoires :&#x20;

`random = ~ 1 | sujet` est différent de lmer mais veut dire la même chose.

### 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.&#x20;

{% hint style="info" %}
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 ?
{% endhint %}

### 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.&#x20;

## Comparaison des deux packages\[EN CONSTRUCTION]

<table><thead><tr><th width="117"></th><th>lme4</th><th>nlme</th></tr></thead><tbody><tr><td>Usage</td><td>Se veux super rigoureux et précis</td><td>Se veut pratique</td></tr><tr><td>Modèles</td><td>Modèles linéaires et non linéaires mixtes</td><td>Modèles linéaires mixtes &#x26; modèles linéaires généralisés mixtes</td></tr><tr><td>Méthode d'estimation</td><td>ML &#x26; REML</td><td>ML &#x26; REML</td></tr><tr><td>Effets aléatoires</td><td>Peut modéliser les structures les plus complexes</td><td>Peut modéliser les structures les plus courantes</td></tr><tr><td>Tests d'effets fixes</td><td>Fournit des valeurs <em>p</em> sur la base de tests de Wald</td><td>N'en fournit pas<br>Utiliser <code>lmerTest</code></td></tr></tbody></table>



