Modèle linéaire généralisé avec R : Différence entre versions
Ligne 117 : | Ligne 117 : | ||
En effet, pour le logit la fonction de lien utilisée étant une fonction logistique, on a : <math> f(y)=log(\frac{p}{1-p})=18.87+0.036 \times hp-8.08 \times wt </math> <br /> | En effet, pour le logit la fonction de lien utilisée étant une fonction logistique, on a : <math> f(y)=log(\frac{p}{1-p})=18.87+0.036 \times hp-8.08 \times wt </math> <br /> | ||
− | où p = probabilité pour la voiture d'être dotée d'un boîte de vitesses manuelles (P(am)=1).<br /> | + | où p = E(am/X) = probabilité pour la voiture d'être dotée d'un boîte de vitesses manuelles (P(am)=1).<br /> |
− | + | Une autre manière de l'écrire est en utilisant la fonction g (inverse de la fonction lien f) : | |
+ | <math>E(am/X)=g(18.87+0.036 \times hp-8.08 \times wt) </math> | ||
+ | avec g la fonction de répartition de la loi logistique pour le LOGIT (le raisonnement est le même en utilisant la fonction de répartition de la loi Normale centrée réduire pour le PROBIT, ou de n'importe quelle loi associée à un modèle). | ||
+ | Pour simplifier pour la suite, on note <math> E(am/X)=g(X'b) </math> | ||
+ | |||
+ | On a donc <math> \frac{\partial E(am/X)}{\partial xj} = \frac{\partial g(X'b)}{\partial X'b } | ||
===== Variable continue ===== | ===== Variable continue ===== | ||
Ligne 154 : | Ligne 159 : | ||
Avoir un moteur de type "V-engine" augmente donc la probabilité pour la voiture d'avoir une boîte manuelle de 26,5 points de pourcentage comparé à une voiture ayant un moteur de type "straight engine" ; toutes choses égales par ailleurs, et pour une voiture ayant un poids et un nombre de chevaux moyens. | Avoir un moteur de type "V-engine" augmente donc la probabilité pour la voiture d'avoir une boîte manuelle de 26,5 points de pourcentage comparé à une voiture ayant un moteur de type "straight engine" ; toutes choses égales par ailleurs, et pour une voiture ayant un poids et un nombre de chevaux moyens. | ||
+ | |||
+ | ==== Prédiction ==== | ||
En revanche, on peut utiliser le modèle pour la prédiction : | En revanche, on peut utiliser le modèle pour la prédiction : |
Version du 9 juillet 2014 à 12:06
Sommaire
Définition
Il s'agit de modèles linéaires plus souple que le modèle linéaire "traditionnel", qui vont être utiles lorsque la variable à expliquer n’est pas une variable quantitative continue. En effet, le modèle linéaire général ne convient pas pour certaines variables à expliquer, comme par exemple pour les données de comptage ou pour les probabilités.
Par exemple, les valeurs prédites peuvent en effet n’être pas entière (pour les données de comptage) ou hors de l’intervalle [0,1] (pour une probabilité).
En outre, le modèle linéaire général repose sur l’hypothèse de normalité du terme d’erreur, et la variable à expliquer y est ainsi aussi considérée comme distribuée normalement (hypothèse très forte). (voir Regression linéaire avec R). Or, il paraît souvent abusif de considérer la variable à expliquer (et son erreur) comme suivant une loi normale puisque cela supposerait une distribution symétrique (alors que par exemple ce n’est très probablement pas le cas pour des données de comptage).
Enfin, avec l’hypothèse d’espérance nulle du terme d’erreur, on a : <math> E(y/x) = b0+b1 \times x1+b2 \times x2. </math>
Le modèle linéaire général considère ainsique les effets des variables explicatives sur la variable à expliquer sont linéaires, ce qui n’est très souvent pas le cas.
Le modèle linéaire généralisé considère plutôt une relation du type : <math> E(y/x)= g(b0+b1 \times x1+b2 \times x2) </math>
La fonction inverse de g(...), est appelée la fonction de liaison, et prend la forme :
<math>f(E(y/x)) = b0 + b1 \times X1 + b2 \times X2 + ... + bk \times Xk </math>
Enfin, le modèle linéaire généralisé va tenir compte de la non-normalité du terme d’erreur, et choisir une autre distribution pour la modéliser.
La fonction GLM()
Généralités
La fonction glm() est utilisée dans R, avec la syntaxe générale : glm(formula, family=familytype(link=linkfunction), data=dataset)
où :
- formula est la formule classique pour écrire le modèle à estimer (de type : y ~ x1 + x2 + ...) où y est la variable à expliquer et x1,x2,... sont les variables explicatives.
- family représente la distribution du terme d’erreur et link la forme de la fonction lien spécifiée.
Quelques exemples :
?family
- binomial(link = "logit") #Modèle LOGIT
- gaussian(link = "identity")
- Gamma(link = "inverse")
- inverse.gaussian(link = "1/mu^2")
- poisson(link = "log")
- quasi(link = "identity", variance = "constant")
- quasibinomial(link = "logit")
- quasipoisson(link = "log")
A noter que family=« gaussian » renvoie à la fonction lm et au modèle linéaire général puisque la fonction de lien est l’identité. Parmi les modèles les plus utilisés on trouve :
- le modèle LOGIT et PROBIT (lorsque la variable à expliquer est de type binaire (typiquement 0-1), et que l’on cherche à expliquer une probabilité : par exemple la probabilité pour un composant d’être défectueux…
- le modèle de Poisson, utilisé pour des données de comptage (ex : nombre de visites chez le médecin, nombre de buts marqués,...).
Modèle LOGIT et PROBIT :
Présentation
Il est sont l’un des usages les plus courants de la fonction glm().
Il sont utilisés lorsque la variable à expliquer est de type binaire, et que les variables explicatives sont continues ou binaires. Tous deux utilisent une loi binomiale (family).
L'inverse de la fonction de lien (notée g précédemment) peut être une loi logistique (ce qui donne un modèle LOGIT) ou celle de la loi Normale centrée réduite (modèle PROBIT). A noter que le modèle LOGIT est aujourd’hui le plus utilisé (l’avantage initial du PROBIT était la fonction de lien plus « simple » à calculer à la main, ce qui n’est plus important aujourd’hui avec l’utilisation de logiciels).
Application : modèle
Pour illuster, on utilise le jeu de données contenu dans R : mtcars, qui contient 32 observations et 11 variables, dont 3 variables qui vont nous intéresser :
- am : La voiture est-elle dotée d'une boîte de vitesse manuelle ?
- hp : nombre de chevaux
- wt : poids
On souhaite déterminer si la probabilité pour une voiture d’être dotée d’une boîte à vitesses manuelle (variable am) dépend où non du nombre de chevaux (variable hp) et de son poids (variable wt). On a un exemple ici où le modèle linéaire général peut produire une valeur estimée de cette probabilité (p=E(am/wt,hp)) ou des effets marginaux hors de l’intervalle [0,1].
##### LOGIT regLOGIT=glm(am ~ hp + wt, data=mtcars, family=binomial(link=logit)) summary(regLOGIT)
##### PROBIT regPROBIT=glm(am ~ hp + wt, data=mtcars, family=binomial(link=probit)) summary(regPROBIT)
Fonction (affichage, extraction,..)
Les fonctions présentées pour la fonction lm() (voir : Regression linéaire avec R) sont aussi valables pour la fonction glm(), à savoir pour les plus utilisées :
- summary() pour afficher la sortie complète
- coef() pour extraire les coefficients
- confint() pour extraire leur intervalle de confiance (à 95%)
- fitted() pour extraire les valeurs estimées
- resid() pour extraire les résidus.
Comme le modèle est estimé par maximum de vraisemblance, il peut être utile d’extraire la vraisemblance du modèle, avec la fonction logLik() (NB : Cela est aussi possible pour un objet de classe lm, mais peu utilisé)
#vraissemblance logLik(regLOGIT)
Interprétation
De plus, bien que possible, il n’est pas d’usage d’interpréter les coefficients de tels modèles. En effet, en raison de la fonction qui définit la relation entre la variable à expliquer et les variables explicatives, les coefficients présentés dans le tableau précédent n’ont pas de signification en eux-mêmes (sans transformation), et l'effet marginal (i.e le coefficient associé à un variable) va dépendre des valeurs prises par l'ensemble des variables explicatives, et pas seulement par la variable concernée. (A noter qu'il est d'usage de prendre alors des valeurs moyennes pour les autres variables).
En effet, pour le logit la fonction de lien utilisée étant une fonction logistique, on a : <math> f(y)=log(\frac{p}{1-p})=18.87+0.036 \times hp-8.08 \times wt </math>
où p = E(am/X) = probabilité pour la voiture d'être dotée d'un boîte de vitesses manuelles (P(am)=1).
Une autre manière de l'écrire est en utilisant la fonction g (inverse de la fonction lien f) : <math>E(am/X)=g(18.87+0.036 \times hp-8.08 \times wt) </math> avec g la fonction de répartition de la loi logistique pour le LOGIT (le raisonnement est le même en utilisant la fonction de répartition de la loi Normale centrée réduire pour le PROBIT, ou de n'importe quelle loi associée à un modèle). Pour simplifier pour la suite, on note <math> E(am/X)=g(X'b) </math>
On a donc <math> \frac{\partial E(am/X)}{\partial xj} = \frac{\partial g(X'b)}{\partial X'b }
Variable continue
##interprétation #continue xavg<-c(1,mean(mtcars$hp),mean(mtcars$wt)) # valeurs moyennes pour wt et hp betaLOGIT<-coefficients(regLOGIT) betaLOGIT_hp<-betaLOGIT[2] # Coeff associé à hp MEhp=betaLOGIT_hp*dlogis(betaLOGIT%*%xavg) print(MEhp) #0.0043
10 chevaux en plus sur la voiture augmente donc la probabilité d'avoir une boîte manuelle de 4,3 points de pourcentage, toutes choses égales par ailleurs, et pour une voiture ayant un poids moyen.
#dummy regLOGIT3=glm(am ~vs+ hp + wt, data=mtcars, family=binomial(link=logit)) betaLOGIT3<-coefficients(regLOGIT3) x1<-c(1,1,mean(mtcars$hp),mean(mtcars$wt)) # vs=1 x0<-c(1,0,mean(mtcars$hp),mean(mtcars$wt)) # vs=0 p1<-plogis(betaLOGIT3%*%x1) p0<-plogis(betaLOGIT3%*%x0) MEvs=p1-p0 print(MEvs) #baisse de 26,5 pts de pourcentage
Avoir un moteur de type "V-engine" augmente donc la probabilité pour la voiture d'avoir une boîte manuelle de 26,5 points de pourcentage comparé à une voiture ayant un moteur de type "straight engine" ; toutes choses égales par ailleurs, et pour une voiture ayant un poids et un nombre de chevaux moyens.
Prédiction
En revanche, on peut utiliser le modèle pour la prédiction :
##Prédiction (modèle logit) : predict(regLOGIT, newdata=data.frame(hp=100,wt=2.88), type="response")
Une voiture avec une puissance de 100 chevaux et un poids de 2.88 lb/1000 va donc avoir une probabilité estimée d’être équipée d’une boîte manuelle de 31% environ.
Modèle de Poisson
Il est utilisé pour des données de type comptage (exemple : nombre de visites chez le médecin, etc), dont la distribution ressemble plus à une distribution de Poisson qu’à une Normale (par exemple). En effet, les caractéristiques de ce type de données sont : d’être discrètes, d'avoir une forte fréquence pour de faibles modalités, et de ne pas pouvoir prendre de valeurs négatives.
Application
Le jeu de données utilisé en exemple est « RecreationDemand » contenu dans le package « AER » (à charger au préalable ». Il est composé de 659 observations basée sur un sondage administré à 2000 propriétaires (enregistrés) de bateaux de plaisance dans 23 comtés de l’est du Texas. Il compte 8 variables :
- trips : Le nombre d’excursions en voilier (trips)
- quality : La qualité du service (sur une échelle de 1 à 5)
- ski : est-ce que la personne est inscrite au water-skiing sur le lac ?
- userfee : Et-ce qu’il paye une taxe annuelle au lac Somerville?
- costC : Dépenses (en dollars) quand il a visité le lac Conroe
- costS : Dépenses (en dollars) quand il a visité le lac Somerville
- costH : Dépenses (en dollars) quand il a visité le lac Houston
On souhaite expliquer le nombre d’excursions en fonction des autres variables. Comme il s’agit de données de comptage, on utilise le modèle de Poisson :
## Modèle de Poisson #variable à expliquer = nombre de voyages, variables explicatives : les 7 autres de la base de données Reg_pois <- glm(trips ~ ., data = RecreationDemand, family = poisson) summary(Reg_pois)
La fonction de lien étant la fonction log(), on a : <math> log(y)=0.26+0.4717 \times quality+ ….. + 0.036 \times costH </math>
De nouveau predict() va permettre d’estimer le nombre d’excursion pour un propriétaire de bateaux donné (i.e avec des valeurs données pour les variables). <math> ypredict=exp(0.26+0.4717 \times qualitypredict+ ….. + 0.036 \times costHpredict) </math>
De même, on peut aussi extraire la vraissemblance du modèle :
Overdispersion
En assumant que la variable à expliquer suit une loi de Poisson, cela implique que la moyenne est égale à sa variance. Or, dans de nombreux cas, la variance est plus élevée, on parle d’overdispersion. L'utilisation d’un modèle de Poisson va alors conduire à une sous-évaluation de la variance, et donc une sur-évaluation des statistiques de test (dont le calcul inclue bien souvent une division par l’écart-type), et donc finalement va conduire à rejeter l’hypothèse nulle plus souvent qu’il ne le devrait.
Dans ce cas, il est d’usage d’utiliser family=« quasipoisson » plutôt que « poisson ». La différence est que avec quasi poisson le paramètre de dispersion n’est plus fixé à 1 (dans l'exemple, il va être de 6.3 environ : cf infra). De plus, es coefficients estimés vont être inchangés, mais leurs écart-type vont être corrigés (et avec les statiques de test et p-value associées) pour tenir compte de ce phénomène d’overdispersion, comme le montrent les résultats ci-dessous.
#Quasi Poisson Reg_quasipois <- glm(trips ~ ., data = RecreationDemand, family = quasipoisson) summary(Reg_quasipois)