Pourquoi la régression logistique devient-elle instable lorsque les classes sont bien séparées?


Réponses:


31

Il n'est pas correct que la régression logistique en soi devienne instable quand il y a séparation. La séparation signifie qu'il existe certaines variables qui sont de très bons prédicteurs, ce qui est bon, ou la séparation peut être un artefact de trop peu d'observations / de trop nombreuses variables. Si tel est le cas, la solution pourrait consister à obtenir davantage de données. Mais la séparation elle-même n'est donc qu'un symptôme, et non un problème en soi.

Donc, il y a vraiment différents cas à traiter. Tout d'abord, quel est le but de l'analyse? Si le résultat final de l'analyse est une certaine classification des cas, la séparation ne pose aucun problème, cela signifie vraiment qu'il existe de très bonnes variables qui donnent une très bonne classification. Mais si l’objectif est l’estimation du risque, nous avons besoin des estimations de paramètres et, avec la séparation, il n’existe pas d’estimations classiques (maximum de vraisemblance). Nous devons donc changer de méthode d'estimation, peut-être. Il y a plusieurs propositions dans la littérature, j'y reviendrai.

Ensuite, il existe (comme indiqué ci-dessus) deux causes différentes possibles de séparation. Il peut y avoir une séparation dans la population complète ou peut être causée par un nombre trop faible de cas / trop de variables observées.

Ce qui tombe en panne avec la séparation, c'est la procédure d'estimation du maximum de vraisemblance. Le paramètre mle estimé (ou au moins certains d'entre eux) devient infini. J'ai dit dans la première version de cette réponse que cela pouvait être résolu facilement, peut-être avec l'amorçage, mais que cela ne fonctionnait pas, car il y aurait une séparation dans chaque rééchantillonnage d'amorçage, au moins avec la procédure d'amorçage habituelle. Mais la régression logistique reste un modèle valable, mais nous avons besoin d’une autre procédure d’estimation. Certaines propositions ont été:

  1. la régularisation, comme la crête ou le lasso, peut être combinée avec le bootstrap.
  2. régression logistique conditionnelle exacte
  3. tests de permutation, voir https://www.ncbi.nlm.nih.gov/pubmed/15515134
  4. Procédure d'estimation à biais réduit de Firth, voir Modèle de régression logistique ne converge pas
  5. sûrement d'autres ...

Si vous utilisez R, il existe un package sur CRAN, SafeBinaryRegressionqui aide à diagnostiquer les problèmes de séparation, en utilisant des méthodes d'optimisation mathématiques pour vérifier avec certitude s'il existe une séparation ou une quasi-séparation! Dans ce qui suit, je donnerai un exemple simulé à l'aide de ce package, ainsi que celui de la elrmrégression logistique conditionnelle approximative.

Tout d'abord, un exemple simple avec le safeBinaryRegressionpackage. Ce paquet vient de redéfinir la glmfonction, en la surchargeant avec un test de séparation, en utilisant des méthodes de programmation linéaires. S'il détecte une séparation, il se termine avec une condition d'erreur, déclarant que le fichier n'existe pas. Sinon, il ne fait que lancer la glmfonction ordinaire stats. L'exemple est tiré de ses pages d'aide:

library(safeBinaryRegression)   # Some testing of that package,
                                # based on its examples
# complete separation:
x  <-  c(-2, -1, 1, 2)
y  <-  c(0, 0, 1, 1)
glm(y ~ x, family=binomial)
glm(y ~ x,  family=binomial,  separation="test")
stats::glm(y~ x, family=binomial)
# Quasicomplete separation:
x  <-  c(-2, 0, 0, 2)
y  <-  c(0, 0, 1, 1)
glm(y ~ x, family=binomial)
glm(y ~ x,  family=binomial,  separation="test")
stats::glm(y~ x, family=binomial)

Le résultat de son exécution:

> # complete separation:
> x  <-  c(-2, -1, 1, 2)
> y  <-  c(0, 0, 1, 1)
> glm(y ~ x, family=binomial)
Error in glm(y ~ x, family = binomial) : 
  The following terms are causing separation among the sample points: (Intercept), x
> glm(y ~ x,  family=binomial,  separation="test")
Error in glm(y ~ x, family = binomial, separation = "test") : 
  Separation exists among the sample points.
    This model cannot be fit by maximum likelihood.
> stats::glm(y~ x, family=binomial)

Call:  stats::glm(formula = y ~ x, family = binomial)

Coefficients:
(Intercept)            x  
 -9.031e-08    2.314e+01  

Degrees of Freedom: 3 Total (i.e. Null);  2 Residual
Null Deviance:      5.545 
Residual Deviance: 3.567e-10    AIC: 4
Warning message:
glm.fit: fitted probabilities numerically 0 or 1 occurred 
> # Quasicomplete separation:
> x  <-  c(-2, 0, 0, 2)
> y  <-  c(0, 0, 1, 1)
> glm(y ~ x, family=binomial)
Error in glm(y ~ x, family = binomial) : 
  The following terms are causing separation among the sample points: x
> glm(y ~ x,  family=binomial,  separation="test")
Error in glm(y ~ x, family = binomial, separation = "test") : 
  Separation exists among the sample points.
    This model cannot be fit by maximum likelihood.
> stats::glm(y~ x, family=binomial)

Call:  stats::glm(formula = y ~ x, family = binomial)

Coefficients:
(Intercept)            x  
  5.009e-17    9.783e+00  

Degrees of Freedom: 3 Total (i.e. Null);  2 Residual
Null Deviance:      5.545 
Residual Deviance: 2.773    AIC: 6.773

Nous simulons maintenant à partir d'un modèle qui peut être approché de près par un modèle logistique, sauf qu'au-dessus d'un certain seuil, la probabilité d'événement est exactement égale à 1,0. Pensez à un problème de bio-essai, mais au-dessus du seuil, le poison tue toujours:

pl  <-  function(a, b, x) 1/(1+exp(-a-b*x))
a  <-  0
b  <-  1.5
x_cutoff  <-  uniroot(function(x) pl(0,1.5,x)-0.98,lower=1,upper=3.5)$root
### circa 2.6
pltrue  <-  function(a, b, x) ifelse(x < x_cutoff, pl(a, b, x), 1.0)

x <- -3:3

### Let us simulate many times from this model,  and try to estimate it
### with safeBinaryRegression::glm  That way we can estimate the probability
### of separation from this model

set.seed(31415926)  ### May I have a large container of coffee 
replications  <-  1000
p  <-  pltrue(a, b, x)
err  <-  0
good  <- 0

for (i in 1:replications) {
    y  <- rbinom(length(x), 1, p)
    res  <-  try(glm(y~x, family=binomial), silent=TRUE)
    if (inherits(res,"try-error")) err <-  err+1 else good <- good+1
}
P_separation  <-  err/replications
P_separation

Lors de l'exécution de ce code, nous estimons la probabilité de séparation à 0,759. Exécutez le code vous-même, c'est rapide!

Ensuite, nous étendons ce code pour essayer différentes procédures d’estimation, une régression logistique conditionnelle approximative à partir d’elrm. L'exécution de cette simulation prend environ 40 minutes sur mon ordinateur.

library(elrm)  # from CRAN
set.seed(31415926)  ### May I have a large container of coffee
replications  <-  1000
GOOD  <-  numeric(length=replications) ### will be set to one when MLE exists!
COEFS <- matrix(as.numeric(NA), replications, 2)
COEFS.elrm <- matrix(as.numeric(NA), replications, 2) # But we'll only use second col for x
p  <-  pltrue(a, b, x)
err  <-  0
good  <- 0

for (i in 1:replications) {
    y  <- rbinom(length(x), 1, p)
    res  <-  try(glm(y~x, family=binomial), silent=TRUE)
    if (inherits(res,"try-error")) err <-  err+1 else{ good <- good+1
                                                     GOOD[i] <- 1 }
    # Using stats::glm
    mod  <-  stats::glm(y~x, family=binomial)
    COEFS[i, ]  <-  coef(mod)
    # Using elrm:
    DATASET  <-  data.frame(x=x, y=y, n=1)
    mod.elrm  <-  elrm(y/n ~ x,  interest= ~ x -1, r=4, iter=10000, burnIn=1000,
                       dataset=DATASET)
    COEFS.elrm[i, 2 ]  <-  mod.erlm$coeffs       
}
### Now we can compare coefficient estimates of x,
###  when there are separation,  and when not:

non  <-  which(GOOD==1)
cof.mle.non  <-  COEFS[non, 2, drop=TRUE]
cof.mle.sep  <-  COEFS[-non, 2, drop=TRUE]
cof.elrm.non  <-  COEFS.elrm[non, 2, drop=TRUE]
cof.elrm.sep  <-  COEFS.elrm[-non, 2, drop=TRUE]

Maintenant, nous voulons tracer les résultats, mais avant cela, notez que TOUTES les estimations conditionnelles sont égales! C’est vraiment étrange et il faudrait une explication. La valeur commune est 0,9523975. Mais au moins, nous avons obtenu des estimations finies, avec des intervalles de confiance contenant la valeur vraie (non représentée ici). Je ne montrerai donc qu'un histogramme des estimations principales dans les cas sans séparation:

hist(cof.mle.non, prob=TRUE)

[histogramme d'estimations de paramètres simulés [1]

Ce qui est remarquable, c’est que toutes les estimations sont inférieures à la valeur réelle 1,5. Cela peut avoir à voir avec le fait que nous avons simulé à partir d'un modèle modifié, qui nécessite des investigations.



1
(+1) Mais il est assez fort de dire que nous avons besoin d' une procédure d'estimation autre que le maximum de vraisemblance. Les cotes et les rapports de cotes infinis peuvent être des estimations ponctuelles judicieuses; souvent, le problème causé par la séparation consiste simplement à obtenir de bonnes estimations d’intervalle.
Scortchi - Réintégrer Monica

@kjetilbhalvorsen Toutes mes excuses pour faire revivre un ancien fil de discussion, mais je me demandais si vous connaissiez un paquetage similaire en python?
Meep

Désolé, mais je ne sais pas pour Python. Mais il devrait être possible d’exécuter R à partir de python.
kjetil b halvorsen le

25

Il existe de bonnes réponses ici de @ sean501 et @kjetilbhalvorsen. Vous avez demandé un exemple. Considérons la figure ci-dessous. Vous pourriez rencontrer une situation dans laquelle le processus de génération de données est comme celle décrite dans le panneau A . Dans ce cas, il est tout à fait possible que les données que vous recueillez en fait ressembler à ceux dans le panneau B . Maintenant, lorsque vous utilisez des données pour créer un modèle statistique, l’idée est de récupérer le vrai processus de génération de données ou au moins d’obtenir une approximation raisonnablement proche. La question est donc de savoir si l’ajustement d’une régression logistique aux données de B donnera un modèle qui se rapproche de la ligne bleue de A ? Si vous regardez le panneau C, vous pouvez constater que la ligne grise se rapproche mieux des données que la fonction vraie. Ainsi, pour rechercher le meilleur ajustement, la régression logistique «préférera» renvoyer la ligne grise plutôt que la ligne bleue. Cela ne s'arrête pas là, cependant. Regardant le panneau D, la ligne noire se rapproche mieux des données que la ligne grise - en fait, c’est le meilleur ajustement possible. Voilà donc la ligne que poursuit le modèle de régression logistique. Cela correspond à une intersection de l'infini négatif et une pente de l'infini. C’est bien sûr très loin de la vérité que vous espérez récupérer. Une séparation complète peut également causer des problèmes avec le calcul des valeurs p pour vos variables fournies en standard avec une sortie de régression logistique (l'explication est légèrement différente et plus compliquée). De plus, essayer de combiner cet ajustement avec d'autres tentatives, par exemple avec une méta-analyse, ne fera que rendre les autres résultats moins précis.

entrez la description de l'image ici


1
(+1) C'est une illustration très utile du problème.
mkt

Votre diagramme montre un aspect intéressant, c’est que vous souhaitiez idéalement que l’échantillon provienne de "l'espace x" qui conduit à des probabilités de 50-50 (par exemple, des points dans l'intervalle 12 <x <15). En fait, je pense que vous voudrez probablement collecter plus de données de cette région moyenne (10 <x <17) dans un scénario réel qui fournit ce résultat.
probabilitéislogique

@probabilityislogic, c'est vrai. La plupart des informations sur la relation se trouvent dans les données de la région médiane.
gung - Rétablir Monica

10

Cela signifie qu’il existe un hyperplan tel qu’un côté comporte tous les points positifs et de l’autre tout les points négatifs. La solution du maximum de vraisemblance est alors le bémol 1 d'un côté et le bémol 0 de l'autre côté, ce qui est «obtenu» avec la fonction logistique en ayant les coefficients à l'infini.


6

Ce que vous appelez "séparation" (et non "séparation") couvre deux situations différentes qui finissent par causer le même problème - ce que je n’appellerais pas, cependant, un problème "d’instabilité" comme vous le faites.

Une illustration: la survie sur le Titanic

  • Soit une variable dépendante binaire et une variable de séparation indépendante.S VDV(0,1)SV

    Supposons que soit la classe des passagers du Titanic et que indique s’ils ont survécu à l’épave, indiquant le décès et survie.D V 0 1SVDV01

  • La séparation complète est la situation où prédit toutes les valeurs de .D VSVDV

    Ce serait le cas si tous les passagers de première classe du Titanic avaient survécu à l'épave et qu'aucun des passagers de deuxième classe n'avait survécu.

  • La séparation quasi complète est la situation où prédit soit tous les cas où , soit tous les cas où , mais pas les deux.D V = 0 D V = 1SVDV=0DV=1

    Ce serait le cas si des passagers de première classe du Titanic avaient survécu à l'épave et qu'aucun des passagers de deuxième classe n'avait survécu. Dans ce cas, la classe de passagers prédit tous les cas où , mais pas tous les cas où .D V = 1 D V = 0SVDV=1DV=0

    Inversement, si seuls quelques passagers de seconde classe du Titanic étaient morts dans l'épave, la classe de passagers prédit tous les cas où , mais pas tous les cas où , qui inclut à la fois des passagers de première et de deuxième classe. .D V = 0 D V = 1SVDV=0DV=1

Ce que vous appelez des "classes bien séparées" est la situation dans laquelle une variable de résultat binaire (par exemple, la survie sur le Titanic ) peut être mappée complètement ou quasi-complètement à un prédicteur (par exemple, l'appartenance à une classe de passagers; les ne doivent pas nécessairement être binaires). c'est dans mon exemple).S V S VDVSVSV

Pourquoi la régression logistique est-elle "instable" dans ces cas?

Ceci est bien expliqué dans Rainey 2016 et Zorn 2005 .

  • Sous séparation complète , votre modèle logistique recherchera une courbe logistique attribuant, par exemple, toutes les probabilités de à lorsque et toutes les probabilités à à lorsque .1 S V = 1 D V 0 S V = 0DV1SV=1DV0SV=0

    Cela correspond à la situation susmentionnée où seuls et tous les passagers de première classe du Titanic survivent, indiquant une affiliation de passager de première classe.SV=1

    Ceci est problématique car la courbe logistique est strictement comprise entre et , ce qui signifie que, pour modéliser les données observées, la maximisation va pousser certains de ses termes vers l'infini, afin, si vous voulez, de rendre "à l'infini" prédictif de .1 S V D V01SVDV

  • 01DVSV=0SV=1

Dans les deux cas, la fonction de vraisemblance de votre modèle sera incapable de trouver une estimation du maximum de vraisemblance: elle ne trouvera une approximation de cette valeur qu’en l’approchant de manière asymptotique.

Ce que vous appelez «instabilité» est le fait que, dans les cas de séparation complète ou quasi-complète, le modèle logistique n’a pas de probabilité finie. Je n’utiliserais toutefois pas ce terme: la fonction de vraisemblance est en fait assez "stable" (monotone) dans l’affectation des valeurs de coefficient à l’infini.


Remarque: mon exemple est fictif. La survie sur le Titanic ne s'est pas résumée aux membres de la classe passagers. Voir Hall (1986) .

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.