Menu

Régression logistique en R : glm() avec family = binomial

Modélise des résultats oui/non avec glm(family = binomial) : lis le résumé, convertis les coefficients en log-cotes en rapports de cotes avec exp(), et obtiens les probabilités prédites de la bonne façon.

Cette page contient des éditeurs exécutables - modifiez, exécutez et voyez la sortie instantanément.

Quand le résultat est oui/non

La régression linéaire prédit un nombre. Mais beaucoup des questions qui valent la peine d'être modélisées sont binaires : le client résilie-t-il, le patient guérit-il, le courriel est-il cliqué. Ajuster une droite à un résultat 0/1 casse immédiatement - la droite prédit allègrement des probabilités de −0,3 ou 1,4, ce qui n'a aucun sens.

La régression logistique corrige ça en modélisant la probabilité du résultat via la transformation des log-cotes (logit) : log(p / (1 − p)) = ordonnée à l'origine + pente × x. L'échelle des log-cotes couvre toute la droite réelle, donc une équation linéaire s'y ajuste naturellement - et le retour en arrière comprime chaque prédiction dans (0, 1) le long de la courbe en S familière. Le prix de l'astuce : les coefficients vivent sur l'échelle des log-cotes, et tout l'art de lire une régression logistique consiste à les retraduire en quelque chose que les humains comprennent.

Ajuster : glm() avec family = binomial

glm() (modèle linéaire généralisé) est le grand frère de lm() ; family = binomial sélectionne la régression logistique. Dans mtcars, am enregistre le type de transmission (1 = manuelle, 0 = automatique) - les voitures économes tendent-elles à être manuelles ?

Deux choses avant de lire la sortie. D'abord, family = binomial n'est pas facultatif - omets-le et glm() ajuste silencieusement des moindres carrés ordinaires. Ensuite, le résultat doit être binaire : 0/1, logique, ou un facteur à deux niveaux (R modélise la probabilité du second niveau).

Maintenant le résumé, bloc par bloc :

  • Coefficients - l'Estimate de mpg vaut environ 0,31, et c'est une pente en log-cotes : chaque mpg supplémentaire ajoute 0,31 aux log-cotes d'être manuelle. Positif signifie « augmente la probabilité », négatif signifie « la diminue » - au-delà du signe, l'intuition de personne ne fonctionne sur cette échelle, d'où l'existence de la section suivante.
  • z value et Pr(>|z|) - même logique que les tests t de la régression (Estimate ÷ Std. Error, puis une p-valeur pour « est-ce que ça pourrait être zéro ? »), simplement avec une approximation normale - d'où z plutôt que t. Ici p ≈ 0,011 : l'association entre le mpg et le type de transmission a peu de chances d'être du bruit.
  • Null deviance et Residual deviance - la déviance est la mesure de mauvais ajustement du monde glm (plus petit = mieux). La déviance nulle (43,2 à 31 df) est le modèle réduit à la constante ; la déviance résiduelle (29,7 à 30 df) est la tienne. La chute d'environ 13,6 pour un degré de liberté de prédicteur est l'analogue glm de « le R carré a monté ».
  • AIC - un score de comparaison de modèles équilibrant ajustement et complexité ; le plus bas gagne. Dénué de sens seul, utile entre modèles candidats sur les mêmes données.

Des log-cotes aux rapports de cotes : exp(coef())

L'exponentiation fait passer les coefficients de l'échelle additive des log-cotes à l'échelle multiplicative des cotes :

exp(0.307) ≈ 1.36, et voici la formulation honnête à mémoriser : « chaque mpg supplémentaire multiplie les cotes d'une transmission manuelle par environ 1,36 ». Un rapport de cotes supérieur à 1 augmente les cotes, inférieur à 1 les diminue, exactement 1 signifie aucun effet - c'est pourquoi le verdict de l'intervalle de confiance pour les rapports de cotes est « l'intervalle exclut-il 1 ? » (pas zéro ; zéro était la frontière sur l'échelle des log-cotes).

Attention au vocabulaire : les cotes ne sont pas des probabilités. Cotes = p / (1 − p), donc une probabilité de 0,75 donne des cotes de 3. Multiplier des cotes par 1,36 n'est pas la même chose que multiplier une probabilité par 1,36 - et quand le résultat est fréquent, l'écart est grand. Un rapport de cotes de 2 pour un résultat rare se comporte comme « à peu près le double du risque » ; pour un résultat à 50 %, absolument pas. Ne rapporte jamais un rapport de cotes avec le vocabulaire du rapport de risques (« 1,36 fois plus probable ») sauf si le résultat est rare.

Probabilités prédites : le piège de type = "response"

Le bug de régression logistique le plus fréquent dans la nature :

Le premier appel renvoie le type = "link" par défaut - des prédictions sur l'échelle des log-cotes, valeurs négatives comprises. Le second renvoie de vraies probabilités. Si tes « probabilités » sortent un jour négatives ou supérieures à 1, voilà pourquoi. Lance le bloc : une voiture à 15 mpg n'a pour ainsi dire aucune chance d'être manuelle, une voiture à 30 mpg est très probablement manuelle, et la courbe en S se plie au milieu.

Classification : seuil et table de confusion

Les probabilités deviennent des classes prédites en choisissant un seuil - 0,5 étant le choix par défaut - et le tableau de bord honnête est une table du prédit contre le réel :

Les cellules de la diagonale sont les décisions correctes ; les deux cellules hors diagonale sont les deux erreurs différentes (prédire manuelle pour une automatique, et l'inverse). La justesse globale à elle seule peut gravement flatter un modèle - si 95 % des clients ne résilient pas, « prédire que personne ne résilie » obtient 95 % tout en n'attrapant aucun résiliant - alors regarde toujours les deux types d'erreurs. Et 0,5 est une convention, pas une loi : quand les deux erreurs ont des coûts différents, déplace le seuil en conséquence.

Une mise en garde d'honnêteté : cette table évalue le modèle sur les données mêmes sur lesquelles il a été ajusté, ce qui le flatte. Une vraie évaluation met de côté des données que le modèle n'a jamais vues.

Plusieurs prédicteurs

Exactement comme lm() - ajoute des termes avec +, et chaque interprétation gagne la précision « les autres restant constants » :

Chaque coefficient exponentié est maintenant le multiplicateur de cotes pour une augmentation d'une unité de ce prédicteur parmi des voitures semblables sur les autres prédicteurs. La mécanique passe à l'échelle, mais les mises en garde de la régression linéaire aussi : des prédicteurs corrélés se redistribuent mutuellement leurs coefficients.

Précautions

  • Séparation complète. Si un prédicteur sépare parfaitement le résultat (toute voiture au-dessus d'un certain mpg est manuelle, toute voiture en dessous est automatique), le coefficient du maximum de vraisemblance veut devenir infini. R avertit - glm.fit: fitted probabilities numerically 0 or 1 occurred - et rapporte d'énormes coefficients avec des erreurs types absurdes. Ne publie pas ces nombres ; simplifie le modèle, obtiens plus de données, ou utilise une méthode pénalisée (les packages brglm2 ou logistf).
  • Assez d'événements. La contrainte qui compte est le nombre du résultat le plus rare, pas le nombre total de lignes. Une vieille règle empirique veut de l'ordre de 10 à 15 événements par prédicteur ; les exemples à 32 voitures ici servent à enseigner la mécanique, pas de modèle pour des tailles d'échantillon publiables.
  • Les rapports de cotes ne sont pas des rapports de risques quand le résultat est fréquent - traité plus haut, répété parce que les relecteurs le remarqueront même si toi non.

Ce que tu retiens

  • Résultat binaire → glm(y ~ x, data = df, family = binomial) ; n'oublie jamais le family.
  • Les coefficients bruts sont des log-cotes ; exp(coef(fit)) donne des rapports de cotes, et la valeur nulle de leurs intervalles est 1.
  • La formulation type : « chaque augmentation d'une unité de x multiplie les cotes du résultat par exp(b) ».
  • predict(..., type = "response") pour des probabilités - la valeur par défaut renvoie des log-cotes, la confusion numéro un.
  • Classe avec un seuil et juge avec une table de confusion ; la justesse seule peut mentir.
  • Surveille les avertissements de séparation, compte tes événements, et n'habille pas des rapports de cotes en rapports de risques.

Prochaine étape : la mécanique derrière chaque intervalle vu jusqu'ici - les intervalles de confiance avec t.test(), confint() et prop.test().

Questions fréquentes

Comment réaliser une régression logistique en R ?

Avec glm() et family = binomial : fit <- glm(am ~ mpg, data = mtcars, family = binomial), puis summary(fit). Le résultat doit être binaire - 0/1, TRUE/FALSE, ou un facteur à deux niveaux. Oublier family = binomial ajuste silencieusement une régression linéaire ordinaire à la place.

Comment interpréter les coefficients d'un glm en R ?

Les coefficients bruts sont sur l'échelle des log-cotes, dans laquelle personne ne raisonne. Exponentie-les - exp(coef(fit)) - pour obtenir des rapports de cotes : une valeur de 1,36 pour un prédicteur signifie que chaque augmentation d'une unité multiplie les cotes du résultat par environ 1,36. Les valeurs supérieures à 1 augmentent les cotes, inférieures à 1 les diminuent, exactement 1 signifie aucun effet.

Comment obtenir des probabilités prédites d'un glm en R ?

Utilise predict(fit, newdata, type = "response"). C'est le piège numéro un : le type = "link" par défaut renvoie des log-cotes, pas des probabilités - donc si tes « probabilités » sont négatives ou supérieures à 1, tu as oublié type = "response".

Quelle est la différence entre cotes et probabilité ?

La probabilité, ce sont les succès sur l'ensemble des essais ; les cotes, ce sont les succès sur les échecs. Une probabilité de 0,75 correspond à des cotes de 3 (trois succès par échec). Les rapports de cotes de la régression logistique multiplient des cotes, pas des probabilités - et quand le résultat est fréquent, un rapport de cotes peut être bien plus grand que le rapport de risques correspondant, alors ne présente pas l'un pour l'autre.

Coddy programming languages illustration

Apprendre à coder avec Coddy

COMMENCER