Alternativas a la regresión logística en R

55

Me gustaría tener tantos algoritmos que realicen la misma tarea que la regresión logística. Es decir, algoritmos / modelos que pueden dar una predicción a una respuesta binaria (Y) con alguna variable explicativa (X).

Me alegraría que después de nombrar el algoritmo, si también mostrara cómo implementarlo en R. Aquí hay un código que se puede actualizar con otros modelos:

set.seed(55)
n <- 100
x <- c(rnorm(n), 1+rnorm(n))
y <- c(rep(0,n), rep(1,n))
r <- glm(y~x, family=binomial)
plot(y~x)
abline(lm(y~x), col='red', lty=2)
xx <- seq(min(x), max(x), length=100)
yy <- predict(r, data.frame(x=xx), type='response')
lines(xx, yy, col='blue', lwd=5, lty=2)
title(main='Logistic regression with the "glm" function')
Tal Galili
fuente
¿Tenemos que suponer que está considerando un conjunto fijo de predictores, es decir, está interesado en obtener una predicción confiable dados predictores, o también está interesado en algún tipo de penalización en ? X jkXj(j=1k)
chl
Admito que por mi interés personal, la penalización no sería necesaria, y por el bien del conocimiento aquí, diría que ambas son respuestas relevantes :)
Tal Galili
Para referencia futura: es posible que haya podido formular esta pregunta de tal manera que la hubiéramos permitido como una pregunta que no es de CW. Ver meta.stats.stackexchange.com/questions/290/…
Shane
Gracias por el enlace Shane. Una discusión muy interesante que abriste allí. Después de leer la respuesta de Thomasas, creo que esto aún debería ser un wiki comunitario, ya que mi intención era encontrar tantas alternativas como sea posible (algo que dudo que cualquier persona pueda proporcionar). Sin embargo, nuevamente, ¡gracias por dirigirme a ese hilo!
Tal Galili
En realidad, esto no es demasiado amplio para responder: actualmente tiene 6 respuestas (5 votadas). Además, la pregunta es altamente votada y altamente favorecida, y es CW. Debería permanecer abierto, OMI.
gung - Restablece a Monica

Respuestas:

28

Los populares en este momento son randomForest y gbm (llamados MART o Gradient Boosting en la literatura de aprendizaje automático), parte de árboles simples. También es popular bayesglm, que usa MAP con anteriores para la regularización.

install.packages(c("randomForest", "gbm", "rpart", "arm"))

library(randomForest)
library(gbm)
library(rpart)
library(arm)

r1 <- randomForest(y~x)
r2 <- gbm(y~x)
r3 <- rpart(y~x)
r4 <- bayesglm(y ~ x, family=binomial)

yy1 <- predict(r1, data.frame(x=xx))
yy2 <- predict(r2, data.frame(x=xx))
yy3 <- predict(r3, data.frame(x=xx))
yy4 <- predict(r4, data.frame(x=xx), type="response")
Joe
fuente
24

En realidad, eso depende de lo que quieras obtener. Si realiza una regresión logística solo para las predicciones, puede usar cualquier método de clasificación supervisado adecuado para sus datos. Otra posibilidad: análisis discriminante (lda () y qda () del paquete MASS)

r <- lda(y~x) # use qda() for quadratic discriminant analysis

xx <- seq(min(x), max(x), length=100)
pred <- predict(r, data.frame(x=xx), type='response')
yy <- pred$posterior[,2]

color <- c("red","blue")

plot(y~x,pch=19,col=color[pred$class])
abline(lm(y~x),col='red',lty=2)
lines(xx,yy, col='blue', lwd=5, lty=2)
title(main='lda implementation')

Por otro lado, si necesita intervalos de confianza en torno a sus predicciones o errores estándar en sus estimaciones, la mayoría de los algoritmos de clasificación no lo ayudarán. Puede usar modelos aditivos (mixtos) generalizados, para los cuales hay varios paquetes disponibles. A menudo uso el paquete mgcv de Simon Wood. Los modelos aditivos generalizados permiten más flexibilidad que la regresión logística, ya que puede usar splines para modelar sus predictores.

set.seed(55)
require(mgcv)
n <- 100
x1 <- c(rnorm(n), 1+rnorm(n))
x2 <- sqrt(c(rnorm(n,4),rnorm(n,6)))
y <- c(rep(0,n), rep(1,n))
r <- gam(y~s(x1)+s(x2),family=binomial)

xx <- seq(min(x1), max(x1), length=100)
xxx <- seq(min(x2), max(x2), length=100)
yy <- predict(r, data.frame(x1=xx,x2=xxx), type='response')

color=c("red","blue")
clustering <- ifelse(r$fitted.values < 0.5,1,2)

plot(y~x1,pch=19,col=color[clustering])
abline(lm(y~x1),col='red',lty=2)
lines(xx,yy, col='blue', lwd=5, lty=2)
title(main='gam implementation')

Hay mucho más por hacer:

op <- par(mfrow=c(2,1))
plot(r,all.terms=T)
par(op)

summary(r)
anova(r)

r2 <- gam(y~s(x1),family=binomial)
anova(r,r2,test="Chisq")

...

Recomiendo el libro de Simon Wood sobre modelos aditivos generalizados

Joris Meys
fuente
14

Estoy de acuerdo con Joe, y agregaría:

En principio, se podría utilizar cualquier método de clasificación, aunque dependerá de los datos / situación. Por ejemplo, también podría usar un SVM, posiblemente con el popular modelo C-SVM. Aquí hay un ejemplo de kernlab usando una función de núcleo de base radial:

library(kernlab)
x <- rbind(matrix(rnorm(120),,2),matrix(rnorm(120,mean=3),,2))
y <- matrix(c(rep(1,60),rep(-1,60)))

svp <- ksvm(x,y,type="C-svc")
plot(svp,data=x)
Shane
fuente
12

Hay alrededor de 100 modelos de clasificación y regresión que se pueden entrenar a través del paquete caret . Cualquiera de los modelos de clasificación será una opción para usted (a diferencia de los modelos de regresión, que requieren una respuesta continua). Por ejemplo para entrenar un bosque aleatorio:

library(caret)
train(response~., data, method="rf")

Consulte la viñeta de capacitación sobre modelos caret que viene con la distribución para obtener una lista completa de los modelos disponibles. Se divide en modelos de doble uso y clasificación (que puede usar) y solo de regresión (que no puede). caret entrenará automáticamente los parámetros para su modelo elegido para usted.

jphoward
fuente
7

Naive Bayes es un buen método simple de entrenamiento de datos para encontrar una respuesta binaria.

library(e1071)
fitNB <- naiveBayes(y~x)
predict(fitNB, x)
IEORTools
fuente
3

Hay dos variaciones de la regresión logística que aún no se describen. En primer lugar, la regresión logística estima las probabilidades utilizando una función logística que es una distribución logística acumulativa (también conocida como sigmoide). También puede estimar probabilidades usando funciones derivadas de otras distribuciones. La forma más común aparte de la regresión logística es la regresión probit que se deriva de la distribución normal. Para una discusión más detallada entre las diferencias de probit y logit, visite el siguiente sitio.

Diferencia entre modelos logit y probit

set.seed(55)
n <- 100
x <- c(rnorm(n), 1+rnorm(n))
y <- c(rep(0,n), rep(1,n))
r <- glm(y~x, family=binomial(link="probit"))
plot(y~x)
abline(lm(y~x),col='red',lty=2)
xx <- seq(min(x), max(x), length=100)
yy <- predict(r, data.frame(x=xx), type='response')
lines(xx,yy, col='red', lwd=5, lty=2)
title(main='Probit regression with the "glm" function')

La segunda alternativa señala una semana de la función logística que implementó. Si tiene un tamaño de muestra pequeño y / o valores faltantes, no se recomienda la función logística. Por lo tanto, una regresión logística exacta es un mejor modelo. Las probabilidades de registro del resultado se modelan como una combinación lineal de las variables predictoras.

elrm(formula = y ~ x)

Además, hay otras alternativas como las que se mencionan:

  1. Tabla de contingencia bidireccional
  2. Análisis de función discriminante de dos grupos.
  3. Hotelling's T2.

Comentario final: una regresión logística es lo mismo que una pequeña red neuronal sin capas ocultas y solo un punto en la capa final. Por lo tanto, puede usar implementaciones de paquetes de redes neuronales como nneten R.

Editar:

Algunas semanas después me di cuenta de que también existe el algoritmo Winnow y Perceptron . Ambos son clasificadores que funcionan también para clasificaciones en dos grupos, pero ambos han caído en desgracia en los últimos 15 años.

Ferdi
fuente