Ateliers R du CSBQ

Cette série de 10 ateliers guide les participants à travers les étapes requises afin de maîtriser le logiciel R pour une grande variété d’analyses statistiques pertinentes en recherche en biologie et en écologie. Ces ateliers en libre accès ont été créés par des membres du CSBQ à la fois pour les membres du CSBQ et pour la grande communauté d’utilisateurs de R.

Le contenu de cet atelier a été révisé par plusieurs membres du CSBQ. Si vous souhaitez y apporter des modifications, veuillez SVP contacter les coordonnateurs actuels de la série, listés sur la page d'accueil

Atelier 7: Modèles linéaires généralisés (mixtes)

Développé par : Cédric Frenette Dussault, Vincent Fugère, Thomas Lamy, Zofia Taranu

Résumé: Les modèles linéaires généralisés sont des outils importants afin de surmonter un problème récurrent des modèles linéaires, c.-à-d. les variables de réponse n’ayant pas une distribution normale des résidus. Dans cet atelier, vous apprendrez les distributions principales en fonction de la nature de la variable de réponse, le concept de fonction de lien, et comment vérifier les suppositions de base de ces modèles. Nous allons également nous baser sur ce qui a été appris durant le dernier cours afin d’introduire les modèles linéaires généralisés avec effets mixtes.

Lien vers la présentation Prezi associée : Prezi

Téléchargez le script R et les données pour cet atelier :

  1. glmm_funs (fonctions additionelles pour la section GLMM)

Pour illustrer l'utilité des modèles linéaires généralisés (GLMs en anglais), il est important de d'abord comprendre les limites des modèles linéaires (non-généralisés!), soit ceux présentés lors des ateliers 4 et 6. À cet effet, chargeons des données et appliquons quelques modèles linéaires:

| charger les données
setwd("~/Desktop")
mites <- read.csv('mites.csv')

Le jeu de données que vous venez de charger contient une partie du jeu de données des “mites Oribatidae”. Ce dernier a été utilisé par plusieurs ouvrages sur R (p.ex. Borcard, Gillet & Legendre, Numerical Ecology with R) et est disponible dans la bibliothèque “vegan”. Le jeu de données contient 70 échantillons de mousse et de mites provenant de la Station de Biologie des Laurentides de l'Université de Montréal, à Saint-Hippolyte, QC. Chaque échantillon contient des valeurs pour 5 variables environnementales de même que l'abondance de 35 taxa de mites. Le jeu de données que nous utiliserons pour cet atelier contient l'abondance d'un seul taxon de mite, “Galumna sp.”, de même que les valeurs pour les 5 variables environnementales. Notre objectif est de modéliser l'abondance, la présence, et la proportion de Galumna en fonction des 5 variables environnentales. Nous avons donc créé une variable binaire présence/absence (1=présent, 0=absent) et une variable proportion (abondance de Galumna/abondance totale de mites).

| explorer les données
head(mites)
str(mites)
 
# 70 communautés de mites échantillonées à partir de carottes de mousse prises à la Station de Biologie des Laurentides, QC.
# Pour chaque carotte/échantillon, les valeurs suivantes sont fournies
# $Galumna: abondance de mites du genre Galumna
# $pa: présence (1) ou absence (0) de Galumna, peu importe l'abondance
# $totalabund: abondance totale de mites, toutes espèces confondues
# $prop: proportion de Galumna dans la communauté de mites, i.e. Galumna/totalabund
# $SubsDens: densité du substrat
# $WatrCont: contenu d'eau de la carotte
# $Substrate: type de substrat
# $Shrub: abondance de buissons. Traité comme un facteur (une variable qualitative).
# $Topo: microtopographie du sol. "couverture" (blanket) ou "hammac" (hummock).

Regardons si nous pouvons voir une relation entre Galumna et les variables environnementales à l'aide d'une simple matrice de diagrammes:

| matrice de diagrammes
plot(mites)

Il semble y avoir une relation négative entre l'abondance de Galumna et le contenu d'eau (WatrCont). La présence (pa) et la proportion (prop) de Galumna semblent aussi montrer une corrélation négative avec le contenu d'eau. Nous pouvons regarder ça de plus près en représentant dans des diagrammes les relations entre ces 3 variables réponses et avec le contenu d'eau:

| 3 variables réponses vs. contenu d'eau
par(mfrow=c(1,3)) #division de la fenêtre de diagramme en une ligne et 3 colonnes pour avoir 3 diagrammes sur la même figure.
plot(Galumna ~ WatrCont, data = mites, xlab = 'Water content', ylab='Abundance')
boxplot(WatrCont ~ pa, data = mites, xlab='Presence/Absence', ylab = 'Water content')
plot(prop ~ WatrCont, data = mites, xlab = 'Water content', ylab='Proportion')
par(mfrow=c(1,1)) #retour aux paramètres par défaut (un seul diagramme par figure)

En effet, Galumna montre une relation négative avec le contenu d'eau, ce qui suggère que Galumna préfère les sites moins humides. Nous pouvons utiliser des modèles linéaires (fonction “lm”) pour voir si ces relations sont statistiquement significatives.

| modèles linéaires
lm.abund <- lm(Galumna ~ WatrCont, data = mites)
summary(lm.abund)
lm.pa <- lm(pa ~ WatrCont, data = mites)
summary(lm.pa)
lm.prop <- lm(prop ~ WatrCont, data = mites)
summary(lm.prop)

Oui, il y a une forte relation significative pour les 3 variables réponses! Ça y est, on soummet à Nature. Attends une minute… Validons d'abord ces modèles pour voir s'ils respectent les suppositions des modèles linéaires, en commençant par le modèle d'abondance.

| modèle d'abondance
plot(Galumna ~ WatrCont, data = mites)
abline(lm.abund) 

Le modèle ne représente pas très bien les données. Il prédit des valeurs négatives d'abondance lorsque le contenu d'eau excède 600, ce qui est insensé. En plus, le modèle ne prédit pas bien les valeurs élevées d'abondance lorsque le contenu d'eau est faible.

| diagrammes diagnostiques
plot(lm.abund)

Les diagrammes diagnostiques montrent que le modèle ne respecte pas les suppositions d'homogénéité de la variance (le diagramme à gauche montre que les rédidus sont plus grands pour les valeurs prédites élevées) ni de normalité (le diagramme à droite indique que les résidus ne sont pas distribués tel que prédit par une distribution normale, i.e. plusieurs points sont loin de la ligne pointillée). En conséquence, il nous faut rejeter ce modèle; nous ne pouvons pas l'utiliser pour conclure que l'abondance de Galumna varie en fonction du contenu d'eau. Les diagrammes diagnostiques indiquent que les modèles pour présence-absence et proportion sont eux aussi innapropriés:

| autres MLs
#Proportion
plot(prop ~ WatrCont, data = mites)
abline(lm.prop)
plot(lm.prop)
#Présence/Absence
plot(pa ~ WatrCont, data = mites)
abline(lm.pa)
plot(lm.pa)

C'est très commun que les jeux de données biologiques ne respectent pas les suppositions d'homogénéité de la variance ou de normalité. Ces deux suppositions constituent les problèmes principaux des modèles linéaires, et sont la raison principale pourquoi nous avons besoin des modèles linéaires généralisés. Revoyons l'équation de base d'un modèle linéaire pour mieux comprendre d'où viennent ces suppositions. Cette équation est:

yi = β0 + β1xi + εi, où:

  • yi est la valeur prédite pour la variable réponse,
  • β0 est l'ordonnée à l'origine de la droite de régression entre y et x,
  • β1 est la pente de la droite de régression entre y et x,
  • xi est la valeur de la variable indépendante,
  • εi sont les résidus du modèle, qui proviennent d'une distribution normale avec une moyenne variable mais une variance constante.

Ce dernier point à propos de εi est important. C'est de là que proviennent les suppositions de normalité et d'homogénéité de la variance (homoscédasticité). Ceci veut dire que les residus du modèle (les distances entre chaque observation et la droite de régression) peuvent être prédits en pigeant de façon aléatoire des valeurs dans une distribution normale. Souvenez-vous que toutes les distributions/lois normales ont deux paramètres, soit μ (la moyenne de la distribution) et σ2 (la variance de la distribution):

Dans un modèle linéaire, μ change selon la valeur de x (la variable indépendante), mais σ2 garde la même valeur pour toutes les valeurs de yi. En effet, une autre équation pour représenter un modèle linéaire est la suivante:

yi ~ N(μ = β0 + β1xi, σ2),

ce qui signifie littéralement que chaque observation (yi) provient d'une distribution normale avec les paramètres μ (qui dépend de la valeur de xi) et σ2. Éssayons de prédire l'abondance de Galumna en fonction du contenu d'eau en utilisant cette équation et les paramètres que nous avons estimé plus tôt avec la fonction lm(). D'abord, il nous faut des valeurs pour β0 et β1 (les coéfficients de régression), que nous pouvons obtenir ainsi:

| coeffs ML
coef(lm.abund)
#(Intercept)     WatrCont 
#3.439348672 -0.006044788

Ce modèle prédit que pour un contenu d'eau de disons 300, nous devrions obtenir une abondance de Galumna de 1.63:

3.44 + (-0.006 x 300) = 1.63.

1.63 est l'abondance prédite s'il n'y avait pas de variance résiduelle (i.e. si notre modèle avait un r2 de 1). Pour modéliser les valeurs prédites, nous devons donc ajouter εi, i.e. la distance entre les valeurs observées et la droite de régression. C'est ici que nous utilisons la distribution normale. Pour x = 300, notre modèle prédit que εi devrait suivre une distribution normale avec une moyenne = 1.63. Lorsque le contenu d'eau = 400, εi devrait suivre une distribution normale avec une moyenne = 3.44 + (-0.006 x 400) = 1.02. Chaque valeur de yi est modélisée en utilisant une distribution normale différente, chacune avec une moyenne distincte qui dépend de xi. Par contre, la variance de toutes ces distributions (σ2) reste toujours la même. La fonction lm() trouve la valeur de σ2 optimale pour minimiser la somme des carrés résiduelle et utilise ensuite cette valeur pour toutes les distributions normales servant à modéliser y. Nous pouvons trouver la valeur de σ2 de notre modèle dans le résumé du modèle:

| sigma
summary(lm.abund)$sigma

Nous trouvons que sigma est plus ou moins 1.51. Nous avons maintenant tous les coéfficients nécessaires pour modéliser manuellement l'abondance de Galuman comme le ferait la fonction lm(). À un contenu d'eau de 300, les résidus devraient suivre une distribution normale avec les paramètres μ = 1.63 et σ2 = 1.51. À un contenu d'eau de 400, les résidus devraient suivre une distribution normale avec les paramètres μ = 1.02 et σ2 = 1.51, etc. Graphiquement, ça ressemble à ça:

Les quatres lois normales sur ce graphique donnent la probabilité d'observer toutes valeurs possibles de Galumna à 4 contenus d'eau différents. La moyenne de la distribution varie selon le contenu d'eau (donc μ diminue avec le contenu d'eau), mais σ2 est toujours 1.51. La variance est donc homogène pour toutes les valeurs de x. Ce modèle est inadéquat pour au moins deux raisons:

1. Les valeurs prédites sont en moyenne plus loin de la droite de régression lorsque le contenu d'eau est faible. Ceci signifie que la variance résiduelle est plus grande lorsque x est faible, ce qui revient à dire que εi varie en fonction de x et que la variance n'est donc pas homogène. Il est innaproprié ici d'utiliser une valeur constante de σ2: les distributions normales utilisées pour prédire y devraient être plus larges (avoir une plus grande variance) lorsque x est faible que lorsqu'il est élevé. Malheureusement, les modèles linéaires ne permettent pas ceci.

2. C'est innaproprié d'utiliser une distribution normale pour prédire y en fonction de x. Notre variable réponse est l'abondance qui, par définition, doit être un nombre entier. Pourtant, lorsque le contenu d'eau = 300, notre modèle prédit que l'abondance la plus probable est 1.63! Nous savons pourtant que la probabilité d'observer une telle valeur (ou toute autre fraction) est 0. Nos valeurs prédites devraient être modélisées en utilisant une distribution qui ne contient que des nombres entiers, plutôt qu'avec une distribution continue telle que la distribution normale. Ceci est un problème courant car les variables biologiques peuvent être distribuées de bien d'autres façon que ce qui est prédit par la distribution normale.

Les modèles linéaires généralisés peuvent résoudrent ces deux problèmes. Poursuivez votre lecture!

Les statisticiens ont développé une foule de lois de probabilité (ou distributions) correspondant à divers types de données. Une loi de probabilité donne la probabilité d'observer chaque issu possible d'une expérience ou campagne d'échantillonage (par. ex. abondance = 8 Galumna est un issu d'un échantillonage). Les lois “discrètes” n'incluent que des nombres entiers dans leur ensemble d'issus, alors que les lois “continues” incluent aussi des fractions (par. ex. la loi normale). Toutes les lois ont des paramètres qui déterminent la forme de la loi/distribution (par. ex. μ et σ2 pour la loi normale). Pour un excellent survol des lois de probabilités utiles en écologie, nous vous recommandons le chapitre 4 du livre de Ben Bolker Ecological Models and Data in R. Ici nous ne présenterons que brièvement quelques distributons utiles pour les GLMs.

Nous avons déjà vu que notre variable “abondance de Galumna ” ne peut prendre comme valeur que des nombres entiers, et serait donc mieux modélisée par une loi discrète qu'une loi continue. Une loi utile pour modéliser les données d'abondance est la loi de “Poisson”, nommé en l'honneur du statisticien Siméon Denis Poisson. La loi de Poisson est une loi discrète avec un seul paramètre: λ (lambda), qui détermine et la moyenne et la variance de la distribution (la moyenne et la variance d'une loi de Poisson sont donc égales). Voici 3 exemples de lois de Poisson avec des valeurs différentes de λ, ce qui correspond ici au nombre moyen de Galumna retrouvé dans un ensemble fictif d'échantillons:

Remarquez que lorsque λ est faible (c.-à-d. lorsque la moyenne s'approche de zéro), la distribution est décalée vers la gauche, alors que lorsque λ est élevée, la distribution est symmétrique. La variance augmente aussi avec la moyenne (puisque les deux ont la même valeur), les valeurs prédites sont toujours des nombres entiers, et l'ensemble d'issus d'une loi de Poisson est strictement positif. Toutes ces propriétés sont utiles pour modéliser les données de dénombrement, p.ex. l'abondance d'un taxon, le nombre de graines dans une parcelle, etc. Notre variable mites$Galumna semble suivre une loi de Poisson avec une basse valeur de λ (en effet, si nous calculons l'abondance moyenne de Galumna pour l'ensemble des échantillons avec la fonction mean(), nous observons que cette valeur est proche de 0):

| histogramme pour abondance de Galumna
hist(mites$Galumna)
mean(mites$Galumna)

La variable mites$pa (présence-absence) prend une autre forme. Cette variable n'inclue que des 0s et des 1s, de telle sorte que la loi de Poisson ne serait pas plus appropriée pour cette variable que la loi normale.

| histogramme pour présence-absence de Galumna
hist(mites$pa)

Nous avons besoin d'une distribution qui n'inclut dans son ensemble que deux issus possibles: 0 ou 1. La loi de “Bernoulli” est une distribution de la sorte. C'est souvent la première loi de probabilité qu'on nous présente dans les cours de statistiques, pour prédire la probabilité d'obtenir “pile” ou “face” en tirant à… pile ou face. Cette loi n'a qu'un paramètre: p, la probabilité de succès. Nous pouvons utiliser la loi de Bernouilli pour calculer la probabilité d'obtenir l'issu “Galumna présent” (1) vs. “Galumna absent” (0). Voici des exemples de distributions de Bernoulli avec différentes probabilités de présence (p):

Nous pouvons calculer le nombre de sites où Galumna est présent par rapport au nombre total de sites pour obtenir un estimé de ce que p pourrait être dans cet exemple:

| p pour Galumna présence-absence
sum(mites$pa) / nrow(mites)

p pour la variable mites$pa est plus ou moins 0.36, de tel sorte qu'environ deux fois plus de sites montrent l'issu “Galumna absent” (0) que l'issu “Galumna présent” (1).

Lorsqu'il y a plusieurs épreuves (chacune avec un succès/échec), la loi de Bernoulli se transforme en loi binomiale, qui inclue le paramètre additionel n, le nombre d'épeuves. La loi binomiale prédit la probabilité d'observer une certaine proportion de succès, p, sur le nombre total d'épreuves, n. Un “succès” pourrait être, par exemple, la présence d'un taxon à un site (comme pour Galumna), le nombre d'individus qui survit pendant une année, etc. Voici des exemples de lois binomiales avec n = 50 et trois valeurs différentes de p:

Remarquez que la loi binomiale est assymétrique et décalée à gauche lorsque p est faible, mais elle est décalée à droite lorsque p est élevé. C'est la différence principale avec la loi de Poisson: l'étendu de la loi binomial a une limite supérieure, correspondant à n. Conséquemment, la loi binomiale est utilisée pour modéliser des données lorsque le nombre de succès est donné par un nombre entier, et lorsque le nombre d'épreuves est connu. Nous pouvons utiliser la distribution binomiale pour modéliser nos données de proportion, où chaque mite échantillonée pourrait être considérée comme une épreuve. Si la mite est du genre Galumna, l'épreuve est un succès (1), sinon, c'est un échec (0). Dans ce cas, le nombre d'épreuves n varie pour nos 70 échantillons selon l'abondance totale de mites dans l'échantillon, alors que p, la probabilité de succès, est donné par la proportion de Galumna dans chaque échantillon.

Pourquoi tout cette discussion à propos des lois de distribution? Parce que n'importe quelle loi peut être utilisée pour remplacer la loi normale lorsqu'on calcule les valeurs estimées dans un modèle linéaire. Par exemple, nous pouvons utiliser la loi de Poisson pour modéliser nos valeurs d'abondance en utilisant l'équation suivante:

yi ~ Poisson(λ = β0 + β1xi)

Remarquez que λ varie selon x (contenu d'eau), ce qui signifie que la variance dans les résidus variera aussi selon x (car pour la loi de Poisson variance = aussi λ). Ceci veut dire que nous venons de nous défaire de la supposition d'homogénéité de la variance! Aussi, les valeurs estimées seront désormais des nombres entiers plutôt que des nombres décimaux car ils seront tirés de lois de Poisson avec différentes valeurs de λ. Ce modèle ne prédiera jamais de valeurs négatives car l'ensemble d'une loi de Poisson est toujours strictement positif. En changeant la distribution des résidus (εi) de normale à Poisson, nous avons corrigé presque tous les problèmes de notre modèle linéaire pour l'abondance de Galumna.

Ce modèle est presqu'un GLM de Poisson, qui ressemble à ça:

Remarquez que les probabilités d'observer différentes valeurs estimées (en orange) sont maintenant des nombres entiers, et qu'autant la variance que la moyenne de la distribution declinent lorsque λ diminue avec le contenu d'eau. Pourquoi la droite de régression est-elle courbée? Pourquoi est-ce que ce modèle se nomme un “modèle linéaire généralisé”? Continuez votre lecture!

Les variables binaires sont fréquentes en écologie : on observe un phénomène X ou son “absence”. Par exemple, on note souvent la présence ou l'absence d'espèces lors d'études de terrain. Le but est généralement de déterminer si la présence d'une espèce est influencée par différentes variables environnementales. D'autres exemples courants sont la présence/absence d'une maladie au sein d'une population sauvage, l'observation/non-observation d'un comportement spécifique et la survie/mort d'un individu. Un modèle de régression qui utilise une variable binaire comme variable réponse est l'un de plusieurs modèles linéaires généralisés (GLM) et est appelé régression logistique ou modèle logit.

Dans R, la présence (ou succès, survie…) est habituellement codée par un 1 et une absence (ou échec, mort…) par un 0. On effectue une régression logistique (ou n'importe quel GLM) à l'aide de la fonction glm(). Cette fonction diffère un peu de la fonction de base lm(), car elle permet de spécifier une distribution statistique autre que la distribution normale. Nous avons déjà vu que les variables binaires ne sont pas distribuées normalement (i.e. on observe un pic à 0 et un pic à 1 et rien entre les deux). La dernière section a montré que la distribution de Bernoulli est appropriée pour modéliser les variables réponses binaires. La moyenne de cette distribution est représentée par la probabilité p d'observer un résultat et la variance est calculée par p*(1 - p). Le terme (1 - p) représente la probabilité de ne pas observer un résultat. Dans R, on spécifie la distribution statistique du modèle avec l'argument family. Pour la régression logistique, on l'indique de la façon suivante : family = 'binomial'. Rappelez-vous que la distribution de Bernoulli est un cas spécifique de la distribution binomiale lorsque le nombre de répétitions est égal à 1: R “comprend” qu'il faut utiliser une distribution de Bernoulli.

Lorsqu'on prédit la probabilité d'observer un phénomène Y qui est une variable binaire, la valeur prédite doit se trouver entre 0 et 1 : c'est l'étendue possible d'une probabilité ! Si on utilise un modèle linéaire de base pour modéliser une variable binaire en fonction de variables explicatives, il est fort possible qu'on obtienne des valeurs prédites qui se retrouvent en dehors de l'intervalle [0,1], ce qui ne fait aucun sens. L'exemple suivant va vous permettre de mieux comprendre pourquoi un modèle linéaire traditionnel est inapproprié. La prochaine sous-section va vous montrer comment éviter ce problème avec une fonction de lien. Brièvement, une fonction de lien est utilisée pour linéariser la relation entre les valeurs prédites d'un modèle et le prédicteur linéaire (voir sous-section suivante).

| Utilisation inappropriée d'un modèle linéaire
model.lm <- lm(pa ~ WatrCont + Topo, data = mites)
fitted(model.lm)
# La fonction "fitted()" extraie les valeurs prédites de la variable réponse du modèle linéaire.
# Certaines valeurs sont en-dessous de 0, ce qui ne fait pas de sens pour une régression logistique.
# Essayong le même modèle, mais avec une distribution binomiale cette fois-ci.
# Remarquez l'argument "family" pour spécifier la distribution.
model.glm <- glm(pa ~ WatrCont + Topo, data = mites, family = binomial)
fitted(model.glm)
# Toutes les valeurs sont comprises entre 0 et 1.

Le concept de la fonction de lien

Afin d'éviter les biais reliés aux modèles linéaires de base, nous avons besoin de spécifier deux choses : une distribution statistique pour les résidus du modèle et une fonction de lien pour les valeurs prédites par ce même modèle. Nous avons déjà vu la distribution de Bernoulli dans la section précédente, alors nous passerons directement à l'explication du rôle de la fonction de lien.

Pour un modèle de régression linéaire d'une variable réponse continue distribuée normalement, l'équation suivante nous permet d'obtenir les valeurs prédites de la variable réponse :

μ =

μ est la valeur prédite de la réponse variable, X est la matrice du modèle (i.e. ça représente les variables explicatives) et β correspond aux paramètres estimés à partir des données (i.e. l'intercept et la pente). Le terme est appelé le prédicteur linéaire. En termes mathématiques, c'est le produit matriciel de la matrice du modèle X et du vecteur des paramètres estimés β. Regardons cela de plus près dans R :

| Illustration du concept de prédicteur linéaire
# Chargez le jeu de données CO2 utilisé dans un atelier précédent
data(CO2)
head(CO2)
# Construisez un modèle linéaire de l'absorption de CO2 en fonction de la concentration ambiante de CO2.
model.CO2 <- lm(uptake ~ conc, data = CO2)
# On extraie la matrice du modèle avec la fonction model.matrix().
X <- model.matrix(model.CO2)
# Les paramètres estimés sont extraits ainsi :
B <- model.CO2$coefficients
# On multiple X et B pour obtenir le prédicteur linéaire.
# Le symbole "%*%" indique qu'on veut effectuer le produit matriciel.
XB <- X %*% B
# On compare les valeurs de XB aux valeurs obtenues avec la fonction fitted().
# Toutes les déclarations devraient être vraies (i.e. TRUE).
# On utilise la fonction round() pour que tous les éléments aient cinq décimales.
round(fitted(model.CO2), digits = 5) == round(XB, digits = 5)

Lorsqu'on crée un modèle linéaire simple avec une variable réponse continue distribuée normalement, le prédicteur linéaire est égal aux valeurs attendues de la variable réponse. Ceci n'est pas exact si la variable réponse n'est pas distribuée normalement. Si c'est le cas, il faut appliquer une transformation sur les valeurs prédites, i.e. une fonction de lien. La fonction de lien peut être vue comme une transformation des valeurs prédites pour obtenir une relation linéaire entre celles-ci et le prédicteur linéaire :

g(μ) =

g(μ) est la fonction de lien des valeurs prédites. Ceci permet d'enlever la contrainte de distribution normale des résidus. Lorsque la variable réponse est une variable binaire, la fonction de lien est la fonction logit et est représentée par l'équation suivante :

logit(μ) = log (μ / 1-μ) =

μ représente les valeurs prédites (i.e. la probabilité que Y = 1, car on observe la présence d'une espèce, d'une maladie, d'un succès ou d'un autre événement). Le ratio μ / 1-μ représente la cote (odds en anglais) qu'un événement se produise. Cela transforme les valeurs prédite sur une échelle de 0 à l'infini. Par exemple, si on a une probabilité de 0,8 d'observer une espèce X, la cote est donc de 4 : il est 4 fois plus probable d'observer l'espèce que de ne pas l'observer - 0.8/(1-0.8) = 4. La transformation log (on appelle maintenant ce ratio le log odds) permet aux valeurs d'être distribuées de moins l'infini à l'infini. Donc, la fonction de lien logit prend les valeurs prédites du modèle et les transforme en une variable continue sans borne. Les valeurs prédites peuvent ainsi être reliées à un prédicteur linéaire. C'est pour cette raison qu'on appelle ce modèle un modèle linéaire généralisé même si la relation entre la variable réponse et la variable explicative ne ressemble pas nécessairement à une “ligne droite” !

| Un exemple simple de régression logistique
# On construit un modèle de régression de la présence/absence d'une espèce de mite (Galumna sp.) 
# en fonction du contenu en eau du sol et de la topographie.
# On utilise la fonction glm() et on spécifie l'argument "family".
logit.reg <- glm(pa ~ WatrCont + Topo, data = mites, family = binomial(link = "logit"))
# La fonction de lien "logit" est la fonction par défaut pour une régression logistique, 
# ce qui signifie qu'il n'est pas nécessaire de l'indiquer avec l'argument "family":
logit.reg <- glm(pa ~ WatrCont + Topo, data = mites, family = binomial)
summary(logit.reg)

DÉFI 1

En utilisant le jeu de données bacteria (du paquet MASS), modélisez la présence de H. influenzae en fonction du traitement (trt) et de la semaine de test (week). Commencez avec un modèle saturé et réduisez-le jusqu'à obtenir le modèle le plus parcimonieux possible.

Défi 1 : Solution

Interpréter la sortie d'une régression logistique

La sortie du modèle de régression logistique indique que les deux variables explicatives (WatrCont et Topo) sont significatives, mais comment interprète-on les coefficients estimés ? Rappelez-vous que nous avons effectué une transformation des valeurs prédites par le modèle (i.e. la probabilité que Y = 1), alors il faut utiliser une fonction inverse pour pouvoir interpréter correctement les résultats. On peut utiliser la fonction exponentielle ex pour obtenir la cote de probabilité pour chaque variable explicative.

| Interpréter la sortie d'une régression logistique
# Pour obtenir les pentes, il faut utiliser la fonction exponentielle exp().
# Ceci mettra les coefficients sur l'échelle des cotes.
# Mathématiquement, ceci correspond à :
# exp(model coefficients) = exp(log(μ / (1 - μ)) = u / (1 - μ)
# C'est notre rapport de cotes !
exp(logit.reg$coefficients[2:3])
#  WatrCont    TopoHummock 
#  0.9843118   8.0910340
# Pour obtenir l'intervalle de confiance sur l'échelle des cotes :
exp(confint(logit.reg)[2:3,])
#               2.5 %      97.5 %
#  WatrCont     0.9741887  0.9919435
#  TopoHummock  2.0460547  38.6419693

Prenez note que la cote pour une variable explicative est calculée lorsque les autres variables sont gardées constantes. La topographie a une cote de 8.09. Ceci signifie que la probabilité d'observer Galumna sp. est 8.09 fois plus vraisemblable lorsque la topographie est de type hummock plutôt que blanket.

Lorsque la cote est inférieure à 1, l'interprétation est un peu plus compliquée. Si c'est le case, il faut prendre la valeur inverse de la cote (i.e. 1 divisé par la cote) pour faciliter l'interprétation. L'interprétation revient à dire comment l'observation d'un phénomène est MOINS probable. Pour le contenu en eau du sol, la cote est de 0.984. L'inverse est 1 / 0.984 = 1.0159. Ceci signifie que l'augmentation d'une unité en contenu en eau diminue la vraisemblance d'observer la présence de Galumna sp. de 1.0159. On peut aussi l'exprimer en pourcentage en soustrayant 1 à cette valeur : (1.0159 - 1) * 100 = 1.59 %. Il est 1.59 % moins vraisemblable d'observer Galumna sp. avec une augmentation d'une unité de contenu en eau. Pour se convaincre qu'on fait la bonne interprétation, on peut représenter graphiquement les résultats de la présence de Galumna sp. en fonction du contenu en eau du sol. On voit qu'en moyenne la présence de Galumna sp. est plus élevée lorsque le contenu en eau est faible

Lorsqu'un paramètre estimé est entre 0 et 1 sur l'échelle des cotes, la relation entre la variable réponse et la variable explicative est négative. Si la valeur est supérieure à 1, cela indique une relation positive entre les variables. Si l'intervalle de confiance inclut la valeur 1, la relation entre les variables n'est pas significative. Rappelez-vous qu'une valeur de 1 sur l'échelle des cotes signifie que la probabilité d'observer un phénomène Y est la même que celle de ne pas observer ce phénomène (i.e. quand p = 0.5, 0.5/(1-0.5) = 1).

Pour obtenir une probabilité au lieu d'une cote pour chaque variable explicative, il faut utiliser la fonction logit inverse :

logit-1 = 1/(1+1/exp(x))

où x est le paramètre à transformer de l'échelle log odds à l'échelle de probabilité. Pour le modèle logit.reg, le paramètre estimé pour la topographie est de 2.091 sur l'échelle log odds. Donc, la probabilité est donnée par :

1/(1+1/exp(2.091)) = 0.89 ce qui équivaut à 1/(1+1/8.09). Rappelez-vous que la valeur 8.09 est sur l'échelle des cotes. On a une probabilité de 0.89 d'observer Galumna sp. lorsque la topographie est de type hummock.

| Un peu de mathématique sur la fonction logit inverse
# On commence avec la valeur de cote pour la topographie du modèle logit.reg :
µ/ (1 - µ) = 8.09
# On réarrange pour isoler µ :
µ = 8.09(1 - µ) = 8.09 - 8.09µ
8.09µ + µ = 8.09
µ(8.09 + 1) = 8.09
µ = 8.09 / (8.09 + 1)
µ = 1 / (1 + (1 / 8.09)) = 0.89
# On obtient le même résultat sans utiliser la fonction logit inverse !

Pouvoir prédictif et validation du modèle

Une façon simple et intuitive d'estimer le pouvoir explicatif d'un GLM est de comparer la déviance du modèle à celle d'un modèle nul. La déviance peut être vue comme une généralisation du concept de la somme des carrés résiduelle lorsque le modèle est estimé par maximisation de la vraisemblance (i.e. la méthode par laquelle on estime les paramètres d'un GLM). Ceci nous permet de calculer un pseudo-R2, une statistique similaire au R2 dans une régression des moindres carrés (i.e. la méthode utilisée pour estimer les paramètres d'une régression linéaire de base). Le modèle nul correspond à un modèle sans variable explicative. Dans R, on l'indique de la façon suivante : null.model <- glm(Response.variable ~ 1, family = binomial). La forme générique pour calculer un pseudo-R2 est :

Pseudo-R2 = (déviance du modèle nul – déviance résiduelle) / déviance résiduelle

où “déviance du modèle nul” est la déviance du modèle nul et “déviance résiduelle” est la déviance résiduelle du modèle d'intérêt. La différence est divisée par la déviance du modèle nul afin de contraindre le pseudo-R2 entre 0 et 1.

| Le pseudo-R2 d'une régression logistique
# Les déviances résiduelle et nulle sont déjà enregistrées dans un objet de type glm.
objects(logit.reg)
pseudoR2 <- (logit.reg$null.deviance – logit.reg$deviance) / logit.reg$null.deviance
pseudoR2
# [1]  0.4655937

Les variables explicatives du modèle expliquent 46.6% de la variabilité de la variable réponse.

Récemment, Tjur (2009) a proposé une nouvelle statistique, le coefficient de discrimination (D), afin d'évaluer le pouvoir prédictif d'une régression logistique. Intuitivement, D évalue si la régression logistique peut classer adéquatement chaque résultat comme un succès ou un échec. Mathématiquement, c'est la différence entre la moyenne des valeurs prédites des succès (i.e. Y = 1) et des échecs (i.e. Y = 0) :

D = overline{π}_1 - overline{π}_0

overline{π}_1 est la moyenne attendue des probabilités lorsqu'un événement est observé et overline{π}_0 est la moyenne attendue des probabilités lorsqu'un événement n'est pas observé. Une valeur de D près de 1 indique que le modèle accorde une probabilité élevée d'observer un événement lorsque celui-ci a été observé et une probabilité faible d'observer un événement lorsque celui-ci n'a pas été observé. Une valeur de D près de 0 indique que le modèle n'est pas utile pour distinguer entre les observations et les “non-observations” d'un résultat. Le code suivant montre comment obtenir la valeur de D et comment représenter visuellement les valeurs de overline{π}_1 et overline{π}_0.

| Le coefficient de discrimination et sa visualisation
install.packages("binomTools")
library("binomTools")
# La fonctions Rsq calcule indices d'ajustement
# dont le coefficient de discrimination.
# Pour plus d'information sur les autres indices, consultez Tjur (2009).
# Les histogrammes montrent la distribution des valeurs attendues lorsque le résultat est observé
# et non observé.
# Idéalement, le recouvrement entre les deux histogrammes doit être minimal.
fit <- Rsq(object = logit.reg)
fit
# R-square measures and the coefficient of discrimination, 'D':
#
#    R2mod     R2res     R2cor     D
#    0.5205221 0.5024101 0.5025676 0.5114661
#
# Number of binomial observations:  70
# Number of binary observation:  70
# Average group size:  1 
plot(fit, which = "hist")

Pour évaluer l'ajustement (i.e. goodness-of-fit) d'une régression logistique, les graphiques de diagnostic ne sont pas très utiles (voir atelier 4). On utilise plutôt un test de Hosmer-Lemeshow pour évaluer si un modèle est approprié ou non. Ce test sépare les valeurs attendues (ordonnées de la plus faible à la plus grande) en groupes de même taille. Dix groupes est généralement le nombre de groupes recommandé. Pour chaque groupe, on compare les valeurs observées aux valeurs attendues. Le test est similaire à un test de khi-carré avec G - 2 degrés de liberté (G est le nombre de groupes). Dans R, ce test est disponible dans le paquet binomTools.

| Le test de Hosmer-Lemeshow
fit <- Rsq(object = logit.reg)
HLtest(object = fit)
# La valeur de p est de 0.9051814. Donc, on ne rejète pas notre modèle.
# L'ajustement du modèle est bon.

DÉFI 2

Évaluez l'ajustement et le pouvoir prédictif du modèle model.bact2. Comment pouvez-vous améliorer le pouvoir prédictif du modèle ?

Défi 2 : Solution

Représentation graphique des résultats

Lorsque le modèle a été validé, il peut être utile de représenter les résultats graphiquement afin de voir comment la variable est influencée par les variables explicatives. Une façon de faire est de mettre à la fois les valeurs observées et prédites de la variable réponses en fonction d'une variable explicative sur un même graphique. Voici un exemple avec le paquet ggplot2. Revoir l'atelier 3 pour plus d'informations sur ce paquet.

| Représenter graphiquement les résultats d'une régression logistique
library(ggplot2)
ggplot(mites, aes(x = WatrCont, y = pa)) + geom_point() + 
stat_smooth(method = "glm", family= "binomial", se = FALSE) + xlab("Water content") +
ylab("Probability of presence") + 
ggtitle("Probability of presence of Galumna sp. as a function of water content")

Un exemple avec des données de proportions

Les données de proportions sont plus près des variables binaires que vous ne l'imaginez ! Supposons que vous êtes sur le terrain pour estimer la prévalence d'une maladiechez le cerf de Virginie le long d'un gradient environnemental de disponibilité en ressources. Vous échantillonnez dix individus dans dix populations différentes pour estimer la prévalence de la maladie. Votre feuille de données comporte dix lignes avec l'information suivante : code de la population et nombre d'individus infectés dans la population. À première vue, on dirait des données d'occurrences (i.e. count data), mais ce n'est pas correct de le voir ainsi : vous savez combien d'individus vous avez échantillonnés dans chaque population. Vous avez donc des données de proportions : c'est le nombre d'individus infectés sur dix individus échantillonnés. Si vous vous rappelez ce que vous avez lu dans la section sur les distributions, vous devez choisir une distribution binomiale pour modéliser ces données. Illustrons ceci avec un exemple :

| Un GLM avec des données de proportions
# Commençons par générer des données en se basant sur l'exemple précédent :
# On choisit un nombre aléatoire entre 1 et 10 pour déterminer le nombre de cerfs infectés (objet 'n.infected').
# On échantillonne dix individus dans dix populations différentes (objet 'n.total').
# 'res.avail' est un indice de qualité de l'habitat (disponibilité de ressources).
set.seed(123)
n.infected <- sample(x = 1:10, size = 10, replace = TRUE)
n.total <- rep(x = 10, times = 10)
res.avail <- rnorm(n = 10, mean = 10, sd = 1)
# Ensuite, on spécifie le modèle. Prenez note comment on spécifie la variable réponse.
# Il faut indiquer le nombre de fois où la maladie a été détectée
# et le nombre de fois où celle-ci n'a pas été détectée.
prop.reg <- glm(cbind(n.infected, n.total - n.infected) ~ res.avail, family = binomial)
summary(prop.reg)
# Si vos données sont déjà sous la forme de proportions, voici comment faire dans R :
# Créons tout d'abord un vecteur de proportions :
prop.infected <- n.infected / n.total
# On doit spécifier l'argument "weights" de la fonction glm() pour indiquer le nombre d'essais par site.
prop.reg2 <- glm(prop.infected ~ res.avail, family = binomial, weights = n.total)
summary(prop.reg2)
# Les sommaires des modèles prop.reg et prop.reg2 sont identiques !

Afin d'illustrer l'utilisation des GLMs avec des données d'abondance, nous allons utiliser un nouveau jeux de données; faramea.

| loading data
faramea <- read.csv(‘faramea.csv’, header = TRUE)

Ce jeux de données s'intéresse à l'espèce d'arbre Faramea occidentalis sur l'île Barro Colorado au Panama. 43 transects ont été utilisés afin de mesurer le nombre d'arbre le long d'un gradient environnemental. Des caractéristiques environnementales, comme l'élévation du terrain et la précipitation, ont aussi été mesurées au niveau de chaque transect. Examinons maintenant à quoi ressemble la distribution du nombre d'arbres par transect.

| plot the data
hist(faramea$Faramea.occidentalis, breaks=seq(0,45,1), xlab=expression(paste("Number of ", 
italic(Faramea~occidentalis))), ylab="Frequency", main="", col="grey")

Nous pouvons remarquer qu'il n'y a que des valeurs entières et positives. Etant donné cette spécificité propore aux données de dénombrement, la distribution de Poisson, décrite ci dessus, semble un choix approprié pour modéliser ces données.

GLM avec une distribution de Poisson

Comme nous l'avons vu plus haut, la distribution de Poisson est particulièrement appropriée pour modéliser des données de dénombrement car :

  • elle ne spécifie des probabilités que pour des valeurs entières
  • P(y<0) = 0, en d'autres termes la probabilité d'observer une valeur négative est nulle
  • la relation entre la moyenne et la variance permet de manipuler des données hétérogènes (e.g. quand la variance dans les données augmente avec la moyenne)

Dans notre exemple, nous voulons tester si l'élévation (une variable explicative continue) influence l'abondance de Faramea occidentalis. Il est généralement bien de commencer par utiliser un GLM et une distribution de Poisson lorsque nous cherchons à modéliser des données d'abondance. Nous allons donc commencer par ajuster ce type de modèle pour modéliser l'abondance de Faramea occidentalis en fonction de l'élévation.

Mais qu'est ce qui se cache derrière un tel GLM ?
un GLM avec une distribution de Poisson considère que les valeurs yi de la variable réponse ont été générées par une distribution de Poisson dont la moyenne et la variance sont égales à µi.

Yi ∼ Poisson(µi)

Avec E(Yi) = Var(Yi) = µi

Souvenez vous qu'un GLM est composé de deux parties, le prédicteur linéaire et la fonction de lien. Le prédicteur linéaire est utilisé comme une combinaison linéaire des différentes variables explicatives dont les effets sont estimés à travers les paramètres β. Le prédicteur linéaire peut être défini comme :

β0 + Xi.β

X est la matrice des variables explicatives, β0 l'ordonnée à l'origine et β le vecteur des paramètres estimés.

La fonction de lien, entre le prédicteur linéaire et la moyenne de la distribution µi est la fonction logarithmique (relation log-linéaire) :

  • log(µi) = β0 + Xi.β

ou

  • µi = exp(β0 + Xi.β)

La distribution de Poisson donne la probabilité qu'une valeur Yi soit observée étant donné une moyenne µi = exp(β0 + Xi.β). Dans ce modèle, les paramètres inconnus sont inclus dans le vecteur des coefficients de régression β (plus l'ordonnée à l'origine β0) et seront estimés à l'aide du maximum de vraisemblance.

Pour ajuster un GLM avec une distribution de Poisson sous R, il suffit de spécifier family = poisson dans la fonction glm(). Par défaut la fonction de lien est la fonction logarithmique.

| fit a Poisson GLM
glm.poisson = glm(Faramea.occidentalis~Elevation, data=faramea, family=poisson) 
summary(glm.poisson)

Le résumé est similaire à celui de la fonction 'lm' (voir atelier 4) et donne les estimations des paramètres. Vous pouvez aussi récupérer les estimations des paramètres à l'aide des fonctions suivantes :

| parameter estimates
# ordonnée à l'origine
summary(glm.poisson)$coefficients[1,1]
# coefficient de regression de l'élévation
summary(glm.poisson)$coefficients[2,1] 

La validation du modèle et le problème de la surdispersion

Un aspect important du résumé se trouve dans les dernières lignes :

| Poisson GLM summary
summary(glm.poisson)
# Null deviance: 414.81  on 42  degrees of freedom
# Residual deviance: 388.12  on 41  degrees of freedom

L'estimation du maximum de vraisemblance est utilisé afin d'estimer les paramètres. Nous avons déjà mentionné que la déviance est l'équivalent en maximum de vraisemblance des sommes des carrés dans un modèle linéaire. Ici vous pouvez considérer la déviance nulle et la déviance résiduelle comme les équivalents de la somme totale des carrés et de la somme des carrés résiduelle. La déviance résiduelle correspond à deux fois la différence entre la log-vraisemblance de deux modèles : un modèle qui s'ajuste parfaitement aux données (i.e. un modèle saturé) et le modèle que nous voulons tester. Si notre modèle est correct, la distribution de la déviance résiduelle est estimée selon une distribution du χ² avec n-p-1 degrés de liberté (où n correspond au nombre d'observations et p correspond au nombre de variables explicatives). Une implication très importante en ce qui nous concerne est que la déviance résiduelle doit être égale au nombre de degrés de liberté résiduels. Dans notre example, la déviance résiduelle vaut 388.12, tandis que nous avons 41 (43-1-1) degrés de liberté. La déviance est 9.5 fois supérieure au nombre de dégrés de liberté. Le modèle peut alors être qualifié de surdispersé.

La surdispersion La surdispersion peut être évaluée à l'aide du paramètre de surdispersion φ qui se mesure donc de la facon suivante :

                      φ = déviance résiduelle / dégrés de liberté résiduels
* φ < 1 indique qu'il y a sousdispersion
* φ = 1 indique que la dispersion est conforme aux attendus 
* φ > 1 indicates qu'il y a surdispersion

Mais pourquoi un GLM présente-il de la surdispersion ? En fait, des modèles GLM sont surdispersés quand la variance dans les données est encore plus grande que ce qu'autorise la distribution de Poisson. Par exemple, cela peut se produire lorsque les données contiennent de nombreux zeros ou beaucoup de très grosses valeurs. Si nous revenons sur la distribution de nos données (ci dessus) nous pouvons remarquer que ces deux problèmes sont présents et que la distribution de Poisson n'était peut être pas le choix idéal. La surdispersion peut aussi survenir lorsque des variables explicatives ou des termes d'intéractions sont absentes ou bien encore lorsque qu'il y a des problèmes de valeurs aberrantes.

La distribution de Poisson peut tenir compte de l'hétérogénéité présente dans des données grace à la relation entre sa moyenne et sa variance. Toutefois dans certains cas la variance augmente bien plus rapidement par rapport à la moyenne si bien que la distribution de Poisson n'est plus appropriée. Pour nous convaincre une dernière fois d'abandonner la distribution de Poisson pour modéliser l'abondance de l'espèce faramea nous pouvons rapidement calculer la moyenne et la variance dans notre jeux de données :

| mean and variance of the data
mean(faramea$Faramea.occidentalis)
var(faramea$Faramea.occidentalis)

Dans la pratique, les GLMs basés sur la distribution de Poisson sont très pratique pour décrire la moyenne µi mais vont sous-estimer la variance dans les données dès qu'il y a de la surdispersion. Par conséquent, les tests qui découlent du modèle seront trop laxistes. Il y a deux moyens de traiter les problèmes de surdispersion que nous allons détailler ci-dessous :

  • corriger la surdispersion en utilisant un GLM quasi-Poisson
  • choisir une nouvelle distribution comme la binomiale négative

GLM avec une correction "quasi" Poisson

Le principe d'un GLM avec une correction “quasi” Poisson est très simple; le paramètre de surdispersion (φ) est ajouté dans l'équation qui spécifie la variance du modèle :

E(Yi) = µi

Var(Yi) = φ.µi

Le prédicteur linéaire, ainsi que la fonction de lien (log) restent les mêmes. La seule différence est que φ va être estimé afin de corriger le modèle. Les estimations des paramètres seront eux aussi inchangés, mais leurs écarts-types seront multiplés par √φ. Ainsi, certains paramètres qui étaient marginalement significatifs peuvent ne plus le rester.

Dans R, la famille 'quasipoisson' peut être utilisée pour traiter ces problèmes de surdispersion (de la même manière la famille quasibinomial' peut être utilisée). L'estimation de φ sera donné dans le résumé du modèle GLM quasi Poisson. Nous pouvons ajuster ce modèle de deux manières différentes :

| fit a new quasi-Poisson GLM
# Option 1, nous ajustons un nouveau modèle GLM quasi-Poisson
glm.quasipoisson = glm(Faramea.occidentalis~Elevation, data=faramea, family=quasipoisson)
# Option 2, nous actualisons le modèle précédent :
glm.quasipoisson = update(glm.poisson,family=quasipoisson)
# regardons le résumé
summary(glm.quasipoisson)

En examinant le résumé du modèle nous pouvons voir que φ est estimé à 15.97. Nous avons donc eu raison de corriger le modèle afin de prendre en compte la surdispersion. Par contre, si nous regardons la significativité du coefficient de regression associé à l'élévation, nous remarquons qu'il n'est plus significatif. Cependant, 15.97 indique que la surdispersion est forte et en général un GLM quasi-Poisson est favorisé lorsque φ est compris entre 1 et 15. Dans un soucis pédagogique, nous allons considérer que nous ne sommes pas satisfait avec ce modèle et que nous voulons maintenant ajuster une distribution binomiale négative à nos données.

Deux points sont importants à garder en tête lorsque vous utilisez un GLM quasi-Poisson afin de corriger la surdispersion :

  • Les GLMs quasi-Poisson n'ont pas d'AIC. En effet, la vraisemblance d'un modèle GLM quasi-Poisson ne peut pas être spécifiée et s'appuie sur une procédure de pseudo-maximum de vraisemblance. Par conséquence les GLMs quasi-Poisson n'ont pas d'AIC, et ce critère ne peut pas être utilisé afin de comparer différents modèles. Toutefois des alternatives ont été developpées pour gérer cette situation (e.g. quasi-AIC).
  • La surdispersion influence la comparaison de modèles. En effet, la surdispersion influence la comparaison de deux modèles emboités et doit donc être prise en considération. Par exemple, considérons que nous voulons comparer le modèle GLM1, qui contient p1 paramètres avec le modèle GLM2, qui contient p2 paramètres. GLM1 est emboité dans GLM2 et p2 > p1. La comparaison des deux modèles est basées sur le test du rapport des vraisemblances des deux modèles, D1 et D2 respectivement. Si la surdispersion est connue, les déviances doivent être corrigées de manière approprié selon D* = D/φ, et le test final sera basé sur le critère D1* - D*2 qui est supposé être distributé selon une distribution du χ² avec p2-p1 degrés de liberté lorsque le modèle GLM1 est correct.
  • Mais dans certain cas φ n'est pas connu. Par exemple, lorsque vous spécifiez un GLM avec un distribution normale. Dans ce cas, φ peut être estimé a posteriori en utilisant la déviance résiduelle du plus gros modèle de telle sorte que le critière de comparaison devienne [(D1-D2)/(p2-p1)]/[D2/(n-p2)]. Ce critère est supposé suivre une distribution F avec p2-p1 et n-p2 degrés de liberté.

GLM avec une distribution binomiale négative

Un GLM avec une distribution binomiale négative (BN) est utilisé lorsque la surdispersion est très forte. La distribution BN contient un paramètre supplémentaire, k, qui va être très utile pour gérer les problèmes de surdispersion. Avant de rentrer dans les détails sur R, voyons rapidement ce qui se cache derrière la distribution BN. En fait, la distribution BN est la combinaison de deux distributions; une distribution de Poisson et une distribution Gamma. La distribution BN définie la distribution d'une variable aléatoire discrète de la même manière qu'une distribution de Poisson mais autorise la variance à être différente de la moyenne. Le mélange entre la distribution de Poisson et la distribution Gamma peut se résumer à l'aide de deux paramètres, µ et k qui spécifie la distribution de la facon suivante :

Y ~ BN(µ, k)

E(Y) = µ et Var(Y) = µ + µ²/k

De cette manière nous pouvons voir comment cette distribution va gérer la surdispersion dans les modèles GLM. Le deuxième terme de la variance de la distribution BN va déterminer le degré de surdispersion. En effet, la surdispersion est indirectement déterminée par k, que représente le paramètre de dispersion. Si k est grand (par rapport à μ²), la deuxième partie de la variance, µ²/k va s'approcher de 0, et la variance de Y sera μ. Dans ce cas la distribution BN converge vers la distribution de Poisson et vous pourriez tout aussi bien utiliser cette dernière. Par contre, plus k sera petit et plus la surdispersion sera grande. Comme avec toutes les autres distributions, un GLM avec une distribution BN se spécifie en trois étapes. Tout d'abord le modèle fait l'hypothèse que les Yi suivent une distribution BN de moyenne μi et de paramètre k.

Yi ∼ BN(µi, k)

E(Yi) = µi et Var(Yi) = µi + µi²/k

Les deux dernières étapes définissent le prédicteur linéaire ainsi que la fonction de lien entre la moyenne des Yi et le prédicteur linéaire. La fonction de lien utilisée par les GLMs avec une distribution BN est le logarithme ce qui permet de s'assurer que les valeurs prédites soient toujours positives.

  • log(µi) = β0 + Xi.β

ou

  • µi = exp(β0 + Xi.β)

La distribution NB n'est pas dans la fonction glm(), il faut donc installer et charger la librairie MASS. Si vous ne vous souvenez plus si cette librairie R est déjà installée, pas de problème utilisez la fonction suivante :

| 'Mass' est il installé?
ifelse(length(which(installed.packages() == "MASS")) == 0,
      {print("MASS not installed. Installing... "); install.packages("MASS")},
      print("MASS already installed"))

Sinon, si vous savez que cette librairie n'est pas installée, vous pouvez directement taper la commande :

| Installer 'MASS'
install.packages("MASS")

Souvenez vous de charger la librairie

| Charger 'MASS'
library("MASS")

Vous pouvez ajuster un GLM avec une distribution BN à l'aide de la fonction glm.nb() :

| Ajuster un GLM avec un BN'
glm.negbin = glm.nb(Faramea.occidentalis~Elevation, data=faramea) 
summary(glm.negbin)

Le résumé du modèle et similaire à celui des autres GLMs (e.g. GLMs Poisson). Cependant vous avez maintenant un nouveau paramètre, theta, qui est le paramètre k de la variance de votre distribution. L'écart-type de ce paramètre est aussi fourni, mais attention à son interprétation car l'intervalle n'est pas symétrique.

Représentation graphique du modèle final

Le GLM avec une distribution BN semble être le meilleur modèle pour modéliser nos données. Nous voulons maintenant représenter la relation entre le nombre de Faramea occidentalis et l'élévation.

| Représenter le GLM'
# représenter les données observées
plot(faramea$Elevation, faramea$Faramea.occidentalis, xlab="Elevation (m)", ylab=expression(paste("Number of", "  ", italic(Faramea~occidentalis))), pch=16, col=rgb(4,139,154,150,maxColorValue=255))
 
# récupérons les valeurs de l'ordonnée à l'origine et de beta à partir du résumé et ajoutons les dans l'équation du modèle
curve(exp(summary(glm.negbin)$coefficients[1,1]+summary(glm.negbin)$coefficients[2,1]*x),from=range(faramea$Elevation)[1],to=range(faramea$Elevation)[2],add=T, lwd=2, col="orangered")
 
# récupérons les écarts-types pour construire l'intervalle de confiance du modèle
curve(exp(summary(glm.negbin)$coefficients[1,1]+1.96*summary(glm.negbin)$coefficients[1,2]+summary(glm.negbin)$coefficients[2,1]*x+1.96*summary(glm.negbin)$coefficients[2,2]),from=range(faramea$Elevation)[1],to=range(faramea$Elevation)[2],add=T,lty=2, col="orangered")
curve(exp(summary(glm.negbin)$coefficients[1,1]-1.96*summary(glm.negbin)$coefficients[1,2]+summary(glm.negbin)$coefficients[2,1]*x-1.96*summary(glm.negbin)$coefficients[2,2]),from=range(faramea$Elevation)[1],to=range(faramea$Elevation)[2],add=T,lty=2, col="orangered")

Nous pouvons voir que le nombre de Faramea occidentalis diminue de manière significative avec l'élévation. Toutefois, l'intervalle de confiance autour de notre modèle est assez large, notamment pour à faible élévation.

Conclusion sur les GLM avec des données d'abondance

Tous les GLMs que nous venons de voir pour modéliser des données de d'abondance (Poisson, quasi-Poisson et BN) utilisent la même relation log-linéaire entre moyenne et prédicteur linéaire (log(µ) = X.β). Toutefois ils vont autoriser différentes relations entre la moyenne et la variance et vont aussi se reposer sur des méthodes d'estimation de la vraisemblance différentes. Les GLMs Quasi-Poisson ou BN sont privilégiés afin de traiter la surdispersion. Malheureusement dans certains cas les données peuvent contenir trop de zeros et d'autres modèles seront plus éfficaces pour traiter ces situations. C'est par exemple le cas des “zero-augmented models” (e.g. zero-inflated Poisson [ZIP]) qui vont traiter les zéros indépendamment des autres valeurs.

On vient de voir que les variables réponses binaires et d'abondance peuvent être modélisées de façon plus appropriée en laissant tomber la supposition que les résidus doivent suivre une distribution normale en spécifiant une distribution pour les résidus (par exemple Poisson ou binomiale négative). Toutefois, que devrions-nous faire s'il existe une structure nichée dans les données ou des corrélations entre les observations qui causent certaines observations à être plus semblables les unes aux autres que les observations échantillonnées dans différents sites ou points dans le temps ? Comme nous l'avons vu dans l'atelier 6, cette non-indépendance peut être expliquée en ajoutant des termes à effets aléatoires dans le modèle. Rappelez-vous que les intercepts et / ou pentes peuvent varier en fonction des effets aléatoires (facteurs de regroupement) et que l’écart entre ces pentes et / ou intercepts suit une distribution normale. Les effets aléatoires sont également nommés “estimations de rétrécissement” parce qu'ils représentent une moyenne pondérée des données et de l’effet global (effet fixe). La quantité de rétrécissement vers l'effet global est plus sévère si la variabilité intra-groupe est large par rapport à la variabilité inter-groupe (i.e. quand nous avons moins confiance en l'estimation aléatoire, en raison de la faible taille de l'échantillon ou d'une haute variabilité intra-groupe, l'estimation est 'tirée' vers l'effet fixe).

Les propriétés des modèles linéaires mixtes (atelier 6) qui incorporent des effets aléatoires et celles des modèles linéaires généralisés (vu ci-dessus), qui permettent de spécifier une distribution statistique autre que la distribution normale, peuvent être combinées dans le cadre des modèles linéaires mixtes généralisés (GLMMs). L'extension des GLM qui spécifie cette structure supplémentaire suit des étapes similaires à celles présentées dans l'atelier sur les modèles linéaires mixte.

Pour donner un bref aperçu des GLMM, nous allons voir une étude de cas présentée par Bolker et al. (2009) et par la suite Bolker et al. (2011) où les observations échantillonnées dans différentes populations ont créé une structure (ou manque d'indépendance) dans le jeu de données. Plus précisément, les auteurs ont évalué comment l'abondance d'Arabidopsis thaliana (arabette des dames) varie en fonction de variables environnementales (disponibilité d'éléments nutritifs et herbivorie) et en fonction de leur population d'origine et / ou de leur génotype.

En utilisant l’ensemble des données d'Arabidopsis, nous allons maintenant examiner l'effet des niveaux de nutriments, d'herbivorie et leur interaction (effets fixes) sur la production de fruits d'Arabidopsis thaliana et la variabilité de ces relations à travers différentes populations et / ou génotypes (effets aléatoires).

| Charger les données
# Chargez et affichez le jeu de données
dat.tf <- read.csv("Banta_TotalFruits.csv")
str(dat.tf)
 
# X         numéro d'observation
# reg       facteur pour l'une des trois régions; Pays-Bas, l'Espagne ou la Suède
# popu      facteur avec un niveau pour chaque population (effet aléatoire)
# gen       facteur avec un niveau pour chaque génotype (effet aléatoire)
# rack      facteur de nuisance pour l'un des deux racks placés dans la serre
# nutrient  facteur à deux niveaux précisant une faible (valeur = 1) ou haute (valeur = 8) concentration 
#           de nutriments (effet fixe)
# amd       facteur à deux niveaux précisant l'absence ou la présence d'herbivorie (lésions sur le méristème apical)
#           (effet fixe)
# status    facteur de nuisance pour la méthode de germination
# total.fruits  variable réponse; nombre entier indiquant le nombre de fruits par plante
 
# 2-3 génotypes imbriqués dans chacune des neuf populations
table(dat.tf$popu,dat.tf$gen)
 
# Entretien : changer nombres entiers en facteurs, rajuster les niveaux d'herbivorie (amd) et renommer les 
#             niveaux de nutriments
dat.tf <- transform(dat.tf,
                    X=factor(X),
                    gen=factor(gen),
                    rack=factor(rack),
                    amd=factor(amd,levels=c("unclipped","clipped")),
                    nutrient=factor(nutrient,label=c("Low","High")))
 
# Installer / charger les librairies
if(!require(lme4)){install.packages("lme4")}
require(lme4)
if(!require(coefplot2)){install.packages("coefplot2",repos="http://www.math.mcmaster.ca/bolker/R",type="source")}
require(coefplot2)     
if(!require(reshape)){install.packages("reshape")}
require(reshape) 
if(!require(ggplot2)){install.packages("ggplot2")}
require(ggplot2)
if(!require(plyr)){install.packages("plyr")}
require(plyr)
if(!require(gridExtra)){install.packages("gridExtra")}
require(gridExtra)
if(!require(emdbook)){install.packages("emdbook")}
require(emdbook)
source("glmm_funs.R")

La structure du jeu de données

Lorsque nous examinons l'interaction entre les éléments nutritifs et l'herbivorie (clipping) à travers les neuf populations différentes, nous constatons que le nombre de fruits est toujours plus élevé dans le traitement élevé (High) en nutriments. L'effet de clipping est plus faible, même que dans certaines populations nous notons une pente négative.

facet par popu
ggplot(dat.tf,aes(x=amd,y=log(total.fruits+1),colour=nutrient)) +
  geom_point() + 
  stat_summary(aes(x= as.numeric(amd)),fun.y=mean,geom="line") +
  theme_bw() + theme(panel.margin=unit(0,"lines")) +
  scale_color_manual(values=c("#3B9AB2","#F21A00")) + # de la palette Wes Anderson Zissou
  facet_wrap(~popu)

Un graphique similaire peut être fait pour les 24 génotypes différents (en changeant facet_wrap(~gen)).

Choisir une distribution pour les résidus

La variable réponse représente des données d'occurrences, donc nous devons choisir une distribution de Poisson pour modéliser cette variable. Rappelez-vous qu’une propriété importante de la distribution de Poisson est que la variance est égale à la moyenne. Cependant, comme nous le verrons ci-dessous, la variance de chaque groupe augmente beaucoup plus rapidement que la moyenne attendue sous la distribution de Poisson.

| Hétérogénéité entre les groupes
# Créez de nouvelles variables qui représentent toutes les combinaisons de 
# nutriments x facteur clipping x facteur aléatoire
dat.tf <- within(dat.tf,
{
  # génotype x nutriments x clipping
  gna <- interaction(gen,nutrient,amd)
  gna <- reorder(gna, total.fruits, mean)
  # population x nutriments x clipping
  pna <- interaction(popu,nutrient,amd)
  pna <- reorder(pna, total.fruits, mean)
})
 
 
# Boîte à moustaches du total de fruits vs. nouvelle variable (génotype x nutriments x clipping)
ggplot(data = dat.tf, aes(factor(x = gna),y = log(total.fruits + 1))) +
   geom_boxplot(colour = "skyblue2", outlier.shape = 21, outlier.colour = "skyblue2") + 
   theme_bw() + theme(axis.text.x=element_text(angle=90)) + 
   stat_summary(fun.y=mean, geom="point", colour = "red") 
 
# Boîte à moustaches du total des fruits vs. nouvelle variable (population x nutriments x clipping)
ggplot(data = dat.tf, aes(factor(x = pna),y = log(total.fruits + 1))) +
  geom_boxplot(colour = "skyblue2", outlier.shape = 21, outlier.colour = "skyblue2") + 
  theme_bw() + theme(axis.text.x=element_text(angle=90)) + 
  stat_summary(fun.y=mean, geom="point", colour = "red") 

Tel qu'illustré ci-dessus, il existe une importante hétérogénéité parmi la variance de chaque groupe même lorsque la variable réponse est transformée. Nous notons également que certains groupes ont une moyenne et variance de zéro.

Pour identifier la famille de distribution la plus appropriée , nous pouvons examiner un graphique de diagnostic de la variance de chaque groupe par rapport à leurs moyennes. Nous présentons un exemple ci-dessous pour le regroupement par génotype x nutriments x herbivore (clipping).

  1. Si nous observons une relation linéaire entre la variance et la moyenne avec une pente = 1, une famille de Poisson serait appropriée,
  2. Si nous observons une relation moyenne-variance linéaire avec une pente> 1 (c. Var = φµ où φ > 1), la famille quasi-Poisson (tel que présenté ci-dessus) doit être utilisée,
  3. Enfin, une relation quadratique entre la variance et la moyenne (c. Var = µ(1 + α

) ou µ(1 + µ/k)), est caractéristique des données surdispersées résultant d'une hétérogénéité sous-jacente entre les échantillons. Dans ce cas, la distribution binomiale négative (Poisson-gamma) serait plus appropriée.

En examinant la figure ci-dessus, nous constatons qu'une distribution quasi-Poisson linéaire peut être meilleure que la distribution binomiale négative, mais nous aurions besoin de modélisation supplémentaire pour le confirmer.

Un GLMM avec une distribution de Poisson

On crée un GLMM en utilisant la fonction glmer() de la librairie lme4. On spécifie le modèle avec un intercepte aléatoire pour les facteurs génotype et population. Nous incluons les variables de nuisance (rack et la méthode de germination) comme effets fixes. Compte tenu de la relation entre la moyenne et la variance que nous avons observée ci-dessus, nous aurons probablement besoin d'un modèle avec surdispersion, mais nous allons commencer par un modèle avec une distribution de Poisson.

| Poisson GLMM
mp1 <- glmer(total.fruits ~ nutrient*amd + rack + status +
               (1|popu)+
               (1|gen),
             data=dat.tf, family="poisson")

Nous pouvons vérifier la surdispersion en utilisant la fonction overdisp_fun fournie par Bolker et al. (2011) qui divise les résidus de Pearson par les degrés de liberté des résidus et vérifie si les valeurs diffèrent de façon significative (i.e. si le rapport entre la déviance et les degrés de liberté est significativement différent de 1). Une faible valeur de p indique que les données sont surdispersées (i.e. le ratio est significativement différent de 1).

| Vérification de la surdispersion
# Surdispersion?
overdisp_fun(mp1)
 
# On peut aussi l’estimer en divisant la déviance résiduelle par les degrés de liberté des 
# résidus
summary(mp1)
# déviance résiduelle = 18253.7 and dl resid = 616

Le ratio est » 1, donc comme on s'y attendait, nous devons utiliser une distribution différente où la variance augmente plus rapidement que la moyenne, tels que la distribution binomiale négative.

Un GLMM avec un distribution binomiale négative

Rappelez-vous que la distribution binomiale négative (ou Poisson-gamma) satisfait la supposition que la variance est proportionnelle au carré de la moyenne .

| NB
# Note : Ce modèle converge si vous utilisez la version 3.0.2 de R, mais peut ne pas converger avec des 
# versions plus récentes. Si vous avez des problèmes de convergence, essayez le code suivant avec la
# version 3.0.2.
 
mnb1 <- glmer.nb(total.fruits ~ nutrient*amd + rack + status + 
               (1|popu)+
               (1|gen),
             data=dat.tf, control=glmerControl(optimizer="bobyqa"))
# Le nouvel argument «control», bien qu’au-delà de la portée de cet atelier, spécifie la façon dont nous
# optimisons les valeurs des paramètres (c. en prenant la dérivée d'une fonction ou en procédant par itération).
# Si ce n’est pas possible de prendre la dérivée de la fonction, un algorithme itératif comme bobyqa 
# (Bound Optimization BY Quadratic Approximation) est utilisé.
 
# Surdispersion?
overdisp_fun(mnb1)

Le rapport est maintenant beaucoup plus près de 1 (bien que la valeur p est encore inférieur à 0,05).

Un GLMM avec une distribution "Poisson-lognormal"

Une autre option que nous n’avons pas encore décrit est la distribution Poisson-lognormal. Cette approche aborde le problème de la surdispersion en appliquant un effet aléatoire au niveau de l'observation (voir Harrison (2014)), et modèle la variation Poisson supplémentaire de la variable de réponse en utilisant un effet aléatoire avec un niveau de chaque observation unique.

Un modèle Poisson-lognormal peut être construit en modélisant les εi avec une distribution a priori lognormal. Une distribution Poisson-lognormal avec une moyenne µ et une variance a priori lognormal σ2 est donné par :

var(y) = µ + µ2 [exp(σ2) - 1]

En revanche, nous avons vu que la distribution binomiale négative (Poisson-gamma) était donné par:

var(y) = µ + µ2/k

En générale, la variance σ2 dans la distribution Poisson-lognormal dépendra du niveau de regroupement que nous sélectionnons (i.e. au niveau individuel, génotype ou de la population). Donc, le modèle de Poisson-lognormal nous permet d'assigner l'agrégation observée à différentes sources d'hétérogénéité. Ici, afin d'évaluer un effet aléatoire au niveau de l'observation, nous allons l'évaluer au niveau individuel.

| PL GLMM
mpl1 <- glmer(total.fruits ~ nutrient*amd + rack + status + 
               (1|X) +
               (1|popu)+
               (1|gen),
             data=dat.tf, family="poisson", control=glmerControl(optimizer="bobyqa"))
 
overdisp_fun(mpl1)

Nous avons réussi! Le rapport entre la déviance et les degrés de liberté est maintenant conforme avec notre critère (en fait, il est plus petit 1).

Intercepts aléatoires

Maintenant que nous avons la distribution d'erreur appropriée, nous pouvons tester l'importance des interceptes aléatoires (pour population et génotype) en comparant des modèles nichés avec et sans les effets aléatoires d'intérêt en utilisant soit:

  1. l'approche théorique d'information (tel que le Critère d'Information d'Akaike; AIC), qui, comme nous l'avons vu dans l'atelier 6 examine plusieurs hypothèses concurrentes (modèles) simultanément pour identifier le modèle avec le pouvoir prédictif le plus élevé compte tenu des données. Nous allons encore une fois utiliser le AICc pour corriger les petites tailles d'échantillon.
  2. l'approche fréquentiste (test d'hypothèse nulle traditionnelle), où deux modèles nichés sont comparés en utilisant le tests de rapport de vraisemblance de la fonction anova(). Il est important de noter qu’avec cette approche, nous testons une hypothèse nulle d'une variance de zéro, mais étant donné que nous ne pouvons pas avoir un écart négatif, nous testons le paramètre à la limite de sa région réalisable. Par conséquent, la valeur de p rapporté est environ le double de ce qu'elle devrait être (c. nous avons tronquée la moitié des valeurs possibles ; celles qui tombent en dessous de 0).
Évaluation des intercepts aléatoires
summary(mpl1)$varcor
 
# popu seulement
mpl1.popu <- glmer(total.fruits ~ nutrient*amd + rack + status + 
                     (1|X) +
                     (1|popu), 
                     data=dat.tf, family="poisson", control=glmerControl(optimizer="bobyqa"))
 
# gen seulement
mpl1.gen <-glmer(total.fruits ~ nutrient*amd + rack + status + 
                   (1|X) +
                   (1|gen), 
                   data=dat.tf, family="poisson", control=glmerControl(optimizer="bobyqa"))
 
# Approche AICc
ICtab(mpl1, mpl1.popu, mpl1.gen, type = c("AICc"))
#            dAICc df
# mpl1       0.0   10
# mpl1.popu  2.0   9 
# mpl1.gen   16.1  9 
 
# Approche fréquentiste (Likelihood Ratio Test)
anova(mpl1,mpl1.popu)
# Data: dat.tf
# Df         AIC  BIC      logLik  deviance  Chisq   Chi    Df    Pr(>Chisq)  
# mpl1.popu  9    5017.4   5057.4  -2499.7   4999.4                           
# mpl1       10   5015.4   5059.8  -2497.7   4995.4  4.0639  1    0.04381 *
#   ---
#   Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
 
anova(mpl1,mpl1.gen)
# Df        AIC  BIC     logLik deviance  Chisq    Chi     Df   Pr(>Chisq)    
# mpl1.gen  9    5031.5  5071.5 -2506.8   5013.5                             
# mpl1      10   5015.4  5059.8 -2497.7   4995.4   18.177  1   2.014e-05 ***
#   ---
#   Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Notez que le modèle sans l'intercept aléatoire pour génotype est à moins de deux unités AICc du modèle complet, ce qui indique que les deux modèles sont tout aussi plausibles (i.e. peu de soutien pour inclure un intercept aléatoire pour le génotype). Toutefois, lorsque nous utilisons la comparaison de vraisemblance de modèles nichés (anova()), et corrigeons pour les valeurs p gonflés par un facteur de 2, nous trouvons que dans les deux cas, p <0,05 et donc le modèle avec les deux effets aléatoires (mpl1) est sélectionné.

Représentation graphique des paramètres du modèle

Une représentation graphique des paramètres du modèle peut être obtenue en utilisant la fonction coefplot2. Par exemple, pour afficher les paramètres de variance de nos trois intercepts aléatoires:

Coefplot2
# Paramètres de la variance
coefplot2(mpl1,ptype="vcov",intercept=TRUE,main="Random effect variance")
 
# Effets fixes
coefplot2(mpl1,intercept=TRUE,main="Fixed effect coefficient")

Notez que les barres d'erreur ne sont visibles que pour les effets fixes parce glmer ne nous donne pas d'informations sur l'incertitude des paramètres de variance.

Graphiques des intercepts aléatoires

Nous pouvons également extraire les prédictions des effets aléatoires en utilisant la fonction ranef et les tracer en utilisant la fonction dotplot, qui crée un graphique à deux facettes pour chaque effet aléatoire (popu et gen). Notez : la fonction grid.arrange est utilisée pour supprimer l'effet aléatoire au niveau de l'observation (i.e. (1 | X)).

dotplot
pp <- list(layout.widths=list(left.padding=0, right.padding=0),
           layout.heights=list(top.padding=0, bottom.padding=0))
r2 <- ranef(mpl1,condVar=TRUE)
d2 <- dotplot(r2, par.settings=pp)
grid.arrange(d2$gen,d2$popu,nrow=1)

Le graphique indique un peu de variabilité régionale parmi les populations où les populations espagnoles (SP) ont des valeurs plus élevées que les populations suédoises (SW) et néerlandais (NL). La différence entre les génotypes semble largement induite par le génotype 34.

Pentes aléatoires

Section bonus: Pentes aléatoires

Modèle final

Nous terminons cette section sur les GLMMs avec l'évaluation des effets fixes. Nous décrivons d'abord les modèles potentiels et les comparons en utilisant AICc.

Évaluation des effets fixes avec AICc
mpl2 <- update(mpl1, . ~ . - rack) # modèle sans rack
mpl3 <- update(mpl1, . ~ . - status) # modèle sans status
mpl4 <- update(mpl1, . ~ . - amd:nutrient) # modèle sans l’ interaction amd:nutrient 
ICtab(mpl1,mpl2,mpl3,mpl4, type = c("AICc"))

Nous pouvons aussi utiliser les fonctions drop1 et dfun, où dfun convertit les valeurs AIC retournées par drop1 en valeurs ΔAIC (produisant un tableau comparable à ICtab ci-dessus).

Évaluation des effets fixes avec drop1
(dd_LRT <- drop1(mpl1,test="Chisq"))
# Model:
#   total.fruits ~ nutrient * amd + rack + status + (1 | X) + (1 | popu) + (1 | gen)
#              Df    AIC   LRT   Pr(Chi)    
# <none>          5015.4                     
# rack          1 5070.5 57.083 4.179e-14 ***
# status        2 5017.0  5.612   0.06044 .  
# nutrient:amd  1 5016.8  3.444   0.06349 .  
# ---
#   Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
 
(dd_AIC <- dfun(drop1(mpl1)))
#               Df   dAIC
# <none>           0.000
# rack          1 55.083
# status        2  1.612
# nutrient:amd  1  1.444

Il y a un fort effet de rack (un changement de AIC de 55 si on enlève cette variable), alors que les effets de « status » et de l'interaction sont faibles (différence AIC moins de 2). Nous pouvons donc commencer par enlever l'interaction non significative afin de tester les effets principaux de nutriments et d’herviborie (clipping).

Supprimer l’interation
mpl2 <- update(mpl1, . ~ . - and:nutrient)
 
# Avec AICc:
mpl3 <- update(mpl2, . ~ . - rack) # modèle sans rack ou l’interaction
mpl4 <- update(mpl2, . ~ . - status) # modèle sans status ou l’interaction
mpl5 <- update(mpl2, . ~ . - nutrient) # modèle sans nutrient ou l’interaction
mpl6 <- update(mpl2, . ~ . - amd) # modèle sans clipping ou l’interaction
ICtab(mpl2,mpl3,mpl4,mpl5,mpl6, type = c("AICc"))
#        dAICc  df
# mpl2   0.0    9 
# mpl4   1.2    7 
# mpl6   10.2   8 
# mpl3   54.2   8 
# mpl5   135.6  8 
 
# Ou, avec drop1:
(dd_LRT2 <- drop1(mpl2,test="Chisq"))
# Model:
#   total.fruits ~ nutrient + amd + rack + status + (1 | X) + (1 | popu) + (1 | gen)
#            Df    AIC     LRT   Pr(Chi)    
#   <none>      5016.8                      
#   nutrient  1 5152.5 137.688 < 2.2e-16 ***
#   amd       1 5027.0  12.218 0.0004734 ***
#   rack      1 5071.0  56.231 6.443e-14 ***
#   status    2 5018.1   5.286 0.0711639 .  
# ---
#   Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
 
(dd_AIC2 <- dfun(drop1(mpl2)))
#           Df    dAIC
# <none>        0.000
# nutrient  1 135.688
# amd       1  10.218
# rack      1  54.231
# status    2   1.286
 
summary(mpl2)

Les effets de nutriments et d’herbivorie sont forts (grand changement d'AIC de 135,6 (mpl5) et 10,2 (mpl6) si nutriments ou clipping sont supprimés respectivement). Notre modèle final inclut l’effet fixe des nutriments (fortement positif) et l’effet fixe d’herbivorie (négatifs), la variable nuisance de rack, l’effet aléatoire au niveau de l'observation (1 | X) pour tenir compte de la surdispersion et la variation de fruits par population et génotype .

DÉFI 3

En utilisant l’ensemble de données inverts (temps de développement larvaire (PLD) de 74 espèces d'invertébrés et vertébrés marins élevés à différentes températures et temps), répondez aux questions suivantes:

  1. Quel est l'effet du type d'alimentation et du climat (effets fixes) sur PLD (variable réponse)?
  2. Est-ce que cette relation varie selon les taxons (effets aléatoires)?
  3. Quelle est la meilleure famille de distribution pour ces données?
  4. Une fois que vous avez déterminé la meilleure famille de distribution, réévaluez vos effets aléatoires et fixes.

Défi 3: Solution 1

Défi 3: Solution 2

Défi 3: Solution 3

Défi 3: Solution 4

Livres

B. Bolker (2009) Ecological Models and Data in R. Princeton University Press.
A. Zuur et al. (2009) Mixed Effects Models and Extensions in Ecology with R. Springer.

Sites web

GLMM for ecologists: Un site web très complet et avec une section Questions-Réponses pertinente !