Alternatives à la régression logistique dans R

55

Je voudrais autant d’algorithmes effectuant la même tâche que la régression logistique. Ce sont des algorithmes / modèles qui peuvent donner une prédiction à une réponse binaire (Y) avec une variable explicative (X).

Je serais heureux si, après avoir nommé l'algorithme, vous montriez également comment l'implémenter dans R. Voici un code qui peut être mis à jour avec d'autres modèles:

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
la source
Devons-nous supposer que vous envisagez un ensemble fixe de prédicteurs, c’est-à-dire que vous êtes intéressé par une prédiction fiable à partir de prédicteurs, ou êtes-vous également intéressé par une sorte de pénalisation sur le ? kXj(j=1k)
chl
J'admets que, pour mon intérêt personnel, une pénalisation ne serait pas nécessaire et que, par souci de connaissance, je dirais que les deux réponses sont pertinentes :)
Tal Galili
Pour référence future: vous auriez peut-être pu formuler cette question de telle manière que nous l'aurions autorisée comme une question non-CW. Voir meta.stats.stackexchange.com/questions/290/…
Shane
Merci pour le lien Shane. Une discussion très intéressante que vous avez ouverte là-bas. Après avoir lu la réponse de Thomas, je pense que ce devrait toujours être un wiki de communauté, car mon intention était de trouver autant d'alternatives que possible (quelque chose qui, je doute, pourrait être fourni par une seule personne). Encore une fois, merci de m'avoir dirigé vers ce fil!
Tal Galili
Ce n'est pas vraiment trop large pour pouvoir répondre - il a actuellement 6 réponses (5 votantes). En outre, la question est hautement votée et hautement favorisée, et est CW. Il devrait rester ouvert, IMO.
Gay - Rétablir Monica

Réponses:

28

RandomForest et gbm (appelés MART ou Gradient Boosting dans la littérature sur l’apprentissage automatique) sont actuellement populaires. Le bayesglm, qui utilise MAP avec des a priori pour la régularisation, est également populaire.

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
la source
24

En fait, cela dépend de ce que vous voulez obtenir. Si vous effectuez une régression logistique uniquement pour les prévisions, vous pouvez utiliser toute méthode de classification supervisée adaptée à vos données. Autre possibilité: analyse discriminante (lda () et qda () du paquet 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')

D'autre part, si vous avez besoin d'intervalles de confiance autour de vos prédictions ou d'erreurs standard sur vos estimations, la plupart des algorithmes de classification ne vous aideront pas. Vous pouvez utiliser des modèles additifs (mixtes) généralisés, pour lesquels plusieurs packages sont disponibles. J'utilise souvent le paquet mgcv de Simon Wood. Les modèles additifs généralisés offrent plus de flexibilité que la régression logistique, car vous pouvez utiliser des splines pour modéliser vos prédicteurs.

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')

Il y a encore beaucoup à faire:

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")

...

Je recommanderais le livre de Simon Wood sur les modèles d'additifs généralisés

Joris Meys
la source
14

Je suis d'accord avec Joe et ajouterais:

Toute méthode de classification peut en principe être utilisée, bien que cela dépende des données / de la situation. Par exemple, vous pouvez également utiliser un SVM, éventuellement avec le modèle C-SVM populaire. Voici un exemple de kernlab utilisant une fonction de noyau de base radiale:

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
la source
12

Il existe environ 100 modèles de classification et de régression qui peuvent être formés via le package Caret . N'importe lequel des modèles de classification sera une option pour vous (par opposition aux modèles de régression, qui nécessitent une réponse continue). Par exemple pour former une forêt au hasard:

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

Voir la vignette de formation des modèles caret fournie avec la distribution pour une liste complète des modèles disponibles. Il est divisé en modèles à double usage et de classification (que vous pouvez utiliser tous les deux) et en régression uniquement (ce que vous ne pouvez pas). caret formera automatiquement les paramètres du modèle que vous avez choisi.

jphoward
la source
7

Naive Bayes est une bonne méthode simple d’entraînement des données pour trouver une réponse binaire.

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

Il existe deux variantes de la régression logistique qui ne sont pas encore décrites. Tout d'abord, la régression logistique estime les probabilités à l'aide d'une fonction logistique qui est une distribution logistique cumulative (également appelée sigmoïde). Vous pouvez également estimer les probabilités à l'aide de fonctions dérivées d'autres distributions. La méthode la plus courante en dehors de la régression logistique est la régression probit, qui est dérivée de la distribution normale. Pour une discussion plus détaillée entre les différences de probit et de logit, veuillez visiter le site suivant.

Différence entre les modèles logit et 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 deuxième alternative indique un hebdomadaire de la fonction logistique que vous avez implémentée. Si vous avez un petit échantillon et / ou des valeurs manquantes, la fonction logistique n'est pas recommandée. Par conséquent, une régression logistique exacte constitue un meilleur modèle. Les probabilités logarithmiques du résultat sont modélisées comme une combinaison linéaire des variables de prédicteur.

elrm(formula = y ~ x)

En outre, il existe d’autres alternatives comme celles mentionnées ci-dessous:

  1. Tableau de contingence à deux voies
  2. Analyse de la fonction discriminante à deux groupes.
  3. Le T2 de Hotelling.

Remarque finale: une régression logistique est identique à un petit réseau de neurones sans couches cachées et un seul point dans la couche finale. Par conséquent, vous pouvez utiliser des implémentations de packages de réseaux neuronaux tels que nnetdans R.

Modifier:

Quelques semaines plus tard, j'ai réalisé qu'il existait également l' algorithme Winnow et l' algorithme Perceptron . Les deux sont des classificateurs qui fonctionnent également pour les classifications en deux groupes, mais tous deux sont tombés en disgrâce au cours des 15 dernières années.

Ferdi
la source