Esto es una ampliación de las respuestas de Scortchi y Manoel, pero como parece que usas R he pensado en aportar algo de código. :)
Creo que la solución más fácil y directa a su problema es utilizar un análisis bayesiano con supuestos a priori no informativos, como proponen Gelman et al (2008). Como menciona Scortchi, Gelman recomienda poner una previa de Cauchy con una mediana de 0,0 y una escala de 2,5 en cada coeficiente (normalizada para tener una media de 0,0 y una DE de 0,5). Esto regularizará los coeficientes y los acercará ligeramente a cero. En este caso es exactamente lo que quieres. Debido a que tiene colas muy anchas, el Cauchy todavía permite coeficientes grandes (a diferencia de la Normal de cola corta), de Gelman:
¿Cómo realizar este análisis? Utilice la herramienta bayesglm
función en paquete de brazos ¡que implementa este análisis!
library(arm)
set.seed(123456)
# Faking some data where x1 is unrelated to y
# while x2 perfectly separates y.
d <- data.frame(y = c(0,0,0,0, 0, 1,1,1,1,1),
x1 = rnorm(10),
x2 = sort(rnorm(10)))
fit <- glm(y ~ x1 + x2, data=d, family="binomial")
## Warning message:
## glm.fit: fitted probabilities numerically 0 or 1 occurred
summary(fit)
## Call:
## glm(formula = y ~ x1 + x2, family = "binomial", data = d)
##
## Deviance Residuals:
## Min 1Q Median 3Q Max
## -1.114e-05 -2.110e-08 0.000e+00 2.110e-08 1.325e-05
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -18.528 75938.934 0 1
## x1 -4.837 76469.100 0 1
## x2 81.689 165617.221 0 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 1.3863e+01 on 9 degrees of freedom
## Residual deviance: 3.3646e-10 on 7 degrees of freedom
## AIC: 6
##
## Number of Fisher Scoring iterations: 25
No funciona tan bien... Ahora la versión bayesiana:
fit <- bayesglm(y ~ x1 + x2, data=d, family="binomial")
display(fit)
## bayesglm(formula = y ~ x1 + x2, family = "binomial", data = d)
## coef.est coef.se
## (Intercept) -1.10 1.37
## x1 -0.05 0.79
## x2 3.75 1.85
## ---
## n = 10, k = 3
## residual deviance = 2.2, null deviance = 3.3 (difference = 1.1)
Súper sencillo, ¿no?
Referencias
Gelman et al (2008), "A weakly informative default prior distribution for logistic & other regression models", Ann. Appl. Stat., 2, 4 http://projecteuclid.org/euclid.aoas/1231424214
4 votos
Relacionado pregunta
2 votos
Pregunta relacionada y demostración sobre la regularización aquí
0 votos
¿Responde esto a su pregunta? La regresión logística en R dio como resultado una separación perfecta (fenómeno Hauck-Donner). ¿Y ahora qué?