Alternative alla regressione logistica in R


55

Vorrei tanti algoritmi che svolgono lo stesso compito della regressione logistica. Si tratta di algoritmi / modelli che possono fornire una previsione per una risposta binaria (Y) con alcune variabili esplicative (X).

Sarei felice se dopo aver nominato l'algoritmo, se mostrassi anche come implementarlo in R. Ecco un codice che può essere aggiornato con altri modelli:

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

Dobbiamo supporre che stai prendendo in considerazione un set fisso di predittori, ovvero sei interessato a ottenere una previsione affidabile dati predittori o sei anche interessato a qualche tipo di penalizzazione su ? kXj(j=1k)
chl

Ammetto che per il mio interesse personale, la penalizzazione non sarebbe necessaria, e per motivi di conoscenza qui direi che entrambe sono risposte pertinenti :)
Tal Galili

Per riferimento futuro: potresti essere stato in grado di formulare questa domanda in modo tale da consentirla come domanda non CW. Vedi meta.stats.stackexchange.com/questions/290/…
Shane

Grazie per il link Shane. Una discussione molto interessante che hai aperto lì. Dopo aver letto la risposta di Thomasas, credo che questo dovrebbe essere ancora un wiki della comunità, poiché la mia intenzione era quella di trovare quante più alternative possibili (qualcosa che dubito che una persona sarebbe in grado di fornire). Ancora una volta, grazie per avermi indirizzato a quel thread!
Tal Galili,

Questo non è davvero troppo ampio per essere rispondente - al momento ha 6 risposte (5 votate). Inoltre, la domanda è altamente votata e molto favorita, ed è CW. Dovrebbe rimanere aperto, IMO.
gung - Ripristina Monica

Risposte:


28

I più popolari in questo momento sono randomForest e gbm (chiamati MART o Gradient Boosting nella letteratura sull'apprendimento automatico), in parte per alberi semplici. Anche popolare è bayesglm, che utilizza MAP con priori per la regolarizzazione.

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

24

In realtà, dipende da cosa vuoi ottenere. Se si esegue la regressione logistica solo per le previsioni, è possibile utilizzare qualsiasi metodo di classificazione supervisionato adatto ai propri dati. Un'altra possibilità: analisi discriminante (lda () e qda () dal pacchetto 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'altra parte, se hai bisogno di intervalli di confidenza attorno alle tue previsioni o errori standard nelle tue stime, la maggior parte degli algoritmi di classificazione non ti aiuterà. È possibile utilizzare modelli additivi (misti) generalizzati, per i quali sono disponibili numerosi pacchetti. Uso spesso il pacchetto mgcv di Simon Wood. I modelli di additivi generalizzati consentono una maggiore flessibilità rispetto alla regressione logistica, poiché è possibile utilizzare le spline per modellare i predittori.

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

C'è molto altro da fare:

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

...

Consiglierei il libro di Simon Wood sui modelli di additivi generalizzati


14

Sono d'accordo con Joe e aggiungerei:

In linea di principio, è possibile utilizzare qualsiasi metodo di classificazione, sebbene dipenderà dai dati / dalla situazione. Ad esempio, potresti anche utilizzare un SVM, possibilmente con il popolare modello C-SVM. Ecco un esempio di kernlab usando una funzione del kernel con 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)

12

Esistono circa 100 modelli di classificazione e regressione che possono essere addestrati tramite il pacchetto di inserimento . Qualsiasi modello di classificazione sarà un'opzione per te (al contrario dei modelli di regressione, che richiedono una risposta continua). Ad esempio per addestrare una foresta casuale:

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

Vedi la vignetta di addestramento del modello del cursore inclusa nella distribuzione per un elenco completo dei modelli disponibili. È suddiviso in modelli di duplice uso e classificazione (entrambi utilizzabili) e solo di regressione (che non è possibile). caret addestra automaticamente i parametri per il modello scelto per te.


7

Naive Bayes è un buon metodo semplice per addestrare i dati per trovare una risposta binaria.

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

3

Esistono due varianti della regressione logistica che non sono ancora delineate. In primo luogo la regressione logistica stima le probabilità usando una funzione logistica che è una distribuzione logistica cumulativa (nota anche come sigmoide). È inoltre possibile stimare le probabilità utilizzando le funzioni derivate da altre distribuzioni. Il modo più comune a parte la regressione logistica è la regressione probit che deriva dalla distribuzione normale. Per una discussione più dettagliata tra le differenze di probit e logit, visitare il seguente sito.

Differenza tra i modelli logit e 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 seconda alternativa indica una settimana della funzione logistica che hai implementato. Se la dimensione del campione è ridotta e / o la funzione logistica con valori mancanti non è consigliabile. Quindi una regressione logistica esatta è un modello migliore. Le probabilità del log del risultato sono modellate come una combinazione lineare delle variabili predittive.

elrm(formula = y ~ x)

Inoltre ci sono altre alternative da menzionare:

  1. Tabella di contingenza a due vie
  2. Analisi della funzione discriminante a due gruppi.
  3. T2 di Hotelling.

Osservazione finale: una regressione logistica è la stessa di una piccola rete neurale senza livelli nascosti e solo un punto nel livello finale. Pertanto è possibile utilizzare implementazioni di pacchetti di reti neurali come nnetin R.

Modificare:

Alcune settimane dopo mi sono reso conto che esiste anche l' algoritmo Winnow e Perceptron . Entrambi sono classificatori che funzionano anche per classificazioni in due gruppi, ma entrambi sono caduti in disgrazia negli ultimi 15 anni.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.