Alternativen zur logistischen Regression in R


55

Ich möchte so viele Algorithmen, die die gleiche Aufgabe wie die logistische Regression ausführen. Das sind Algorithmen / Modelle, die eine Vorhersage für eine binäre Antwort (Y) mit einer erklärenden Variablen (X) geben können.

Ich würde mich freuen, wenn Sie nach dem Namen des Algorithmus auch zeigen würden, wie er in R implementiert wird. Hier ist ein Code, der mit anderen Modellen aktualisiert werden kann:

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

Müssen wir davon ausgehen, dass Sie eine feste Menge von Prädiktoren in Betracht ziehen, dh Sie sind daran interessiert, eine zuverlässige Vorhersage mit Prädiktoren zu erhalten, oder sind Sie auch an einer Bestrafung des interessiert ? X jkXj(j=1k)
chl

Ich gebe zu, dass für mein persönliches Interesse eine Bestrafung nicht notwendig wäre, und zum Zwecke des Wissens würde ich hier sagen, dass beide relevante Antworten sind :)
Tal Galili

Zum späteren Nachschlagen: Sie hätten diese Frage möglicherweise so formulieren können, dass wir sie als Nicht-CW-Frage zugelassen hätten. Siehe meta.stats.stackexchange.com/questions/290/…
Shane

Vielen Dank für den Link Shane. Eine sehr interessante Diskussion, die Sie dort eröffnet haben. Nachdem ich Thomasas Antwort gelesen habe, glaube ich, dass dies immer noch ein Community-Wiki sein sollte, da ich beabsichtigte, so viele Alternativen wie möglich zu finden (etwas, von dem ich bezweifle, dass es eine Person liefern kann). Nochmals vielen Dank, dass Sie mich zu diesem Thread geleitet haben!
Tal Galili

Dies ist nicht wirklich umfassend, um beantwortet zu werden - es gibt derzeit 6 Antworten (5 positiv bewertet). Darüber hinaus ist die Frage sehr positiv bewertet und sehr positiv bewertet und lautet CW. Es sollte offen bleiben, IMO.
gung - Reinstate Monica

Antworten:


28

Derzeit beliebt sind randomForest und gbm (in der maschinellen Lernliteratur MART oder Gradient Boosting genannt), Teile für einfache Bäume. Beliebt ist auch bayesglm, das MAP mit Prioren für die Regularisierung verwendet.

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

Das hängt davon ab, was Sie erhalten möchten. Wenn Sie nur für die Vorhersagen eine logistische Regression durchführen, können Sie jede für Ihre Daten geeignete überwachte Klassifizierungsmethode verwenden. Eine andere Möglichkeit: Diskriminanzanalyse (lda () und qda () aus Paket 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')

Wenn Sie dagegen Konfidenzintervalle für Ihre Vorhersagen oder Standardfehler in Ihren Schätzungen benötigen, helfen Ihnen die meisten Klassifizierungsalgorithmen nicht. Sie können verallgemeinerte additive (gemischte) Modelle verwenden, für die eine Reihe von Paketen verfügbar sind. Ich benutze oft das mgcv-Paket von Simon Wood. Verallgemeinerte additive Modelle bieten mehr Flexibilität als logistische Regression, da Sie Splines zur Modellierung Ihrer Prädiktoren verwenden können.

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

Es gibt noch viel mehr zu tun:

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

...

Ich würde das Buch von Simon Wood über verallgemeinerte additive Modelle empfehlen


14

Ich stimme Joe zu und würde hinzufügen:

Grundsätzlich kann jede Klassifizierungsmethode verwendet werden, auch wenn dies von den Daten / der Situation abhängt. Beispielsweise könnten Sie auch eine SVM verwenden, möglicherweise mit dem beliebten C-SVM-Modell. Hier ist ein Beispiel aus Kernlab mit einer radialen Kernelfunktion:

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

Es gibt rund 100 Klassifizierungs- und Regressionsmodelle, die über das Caret-Paket trainiert werden können . Jedes der Klassifizierungsmodelle ist eine Option für Sie (im Gegensatz zu Regressionsmodellen, die eine kontinuierliche Reaktion erfordern). Zum Beispiel um einen zufälligen Wald zu trainieren:

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

Eine vollständige Liste der verfügbaren Modelle finden Sie in der Caret-Modellschulungsvignette, die mit der Distribution geliefert wird. Es ist in Dual-Use- und Klassifizierungsmodelle (die Sie beide verwenden können) und Regressionsmodelle (die Sie nicht verwenden können) unterteilt. caret trainiert automatisch die Parameter für das von Ihnen gewählte Modell.


7

Naive Bayes ist eine gute einfache Methode zum Trainieren von Daten, um eine binäre Antwort zu finden.

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

3

Es gibt zwei Varianten der logistischen Regression, die noch nicht umrissen sind. Erstens schätzt die logistische Regression die Wahrscheinlichkeiten unter Verwendung einer logistischen Funktion, die eine kumulative logistische Verteilung ist (auch als Sigmoid bekannt). Sie können Wahrscheinlichkeiten auch mithilfe von Funktionen schätzen, die von anderen Verteilungen abgeleitet sind. Der neben der logistischen Regression gebräuchlichste Weg ist die Probit-Regression, die sich aus der Normalverteilung ableitet. Weitere Informationen zu den Unterschieden zwischen probit und logit finden Sie auf der folgenden Website.

Unterschied zwischen logit- und probit-Modellen

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

Die zweite Alternative weist auf eine Schwäche der von Ihnen implementierten logistischen Funktion hin. Bei kleinen Stichproben und / oder fehlenden Werten ist eine logistische Funktion nicht ratsam. Daher ist eine exakte logistische Regression ein besseres Modell. Die logarithmischen Gewinnchancen des Ergebnisses werden als lineare Kombination der Prädiktorvariablen modelliert.

elrm(formula = y ~ x)

Darüber hinaus sind noch andere Alternativen zu nennen:

  1. Zwei-Wege-Kontingenztabelle
  2. Diskriminanzfunktionsanalyse mit zwei Gruppen.
  3. Hotellings T2.

Schlussbemerkung: Eine logistische Regression ist dasselbe wie ein kleines neuronales Netzwerk ohne versteckte Schichten und nur einen Punkt in der letzten Schicht. Daher können Sie Implementierungen von neuronalen Netzwerkpaketen wie nnetin R verwenden.

Bearbeiten:

Einige Wochen später stellte ich fest, dass es auch den Winnow- und den Perceptron- Algorithmus gibt. Beide sind Klassifikatoren, die auch für Klassifikationen in zwei Gruppen funktionieren, aber beide sind in den letzten 15 Jahren in Ungnade gefallen.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.