Alternatywy dla regresji logistycznej w R.

55

Chciałbym mieć tyle algorytmów, które wykonują to samo zadanie, co regresja logistyczna. To są algorytmy / modele, które mogą przewidywać odpowiedź binarną (Y) za pomocą zmiennej objaśniającej (X).

Byłbym zadowolony, jeśli po nazwiesz algorytm, pokażesz również, jak go zaimplementować w R. Oto kod, który można zaktualizować za pomocą innych modeli:

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
źródło
Czy musimy założyć, że rozważasz ustalony zestaw predyktorów, tzn. Jesteś zainteresowany uzyskaniem wiarygodnej prognozy, biorąc pod uwagę predyktorów, czy też jesteś zainteresowany ? kXj(j=1k)
chl
Przyznaję, że dla mojego osobistego zainteresowania kara nie byłaby konieczna, a ze względu na wiedzę powiedziałbym, że obie są odpowiednimi odpowiedziami :)
Tal Galili
Do wglądu w przyszłości: być może udało Ci się sformułować to pytanie w taki sposób, że pozwolilibyśmy na to pytanie inne niż CW. Zobacz meta.stats.stackexchange.com/questions/290/…
Shane
Dziękuję za link Shane. Bardzo ciekawa dyskusja, którą tam otworzyłeś. Po przeczytaniu odpowiedzi Thomasasa uważam, że nadal powinna to być wiki społeczności, ponieważ moim zamiarem było znalezienie jak największej liczby alternatyw (coś, co wątpię, czy ktokolwiek byłby w stanie dostarczyć). Jeszcze raz dziękuję za skierowanie mnie do tego wątku!
Tal Galili
Nie jest to zbyt szerokie, aby można było na nie odpowiedzieć - obecnie ma 6 odpowiedzi (5 pozytywnie ocenionych). Co więcej, pytanie jest wysoko ocenione i bardzo faworyzowane, i jest CW. Powinien pozostać otwarty, IMO.
gung - Przywróć Monikę

Odpowiedzi:

28

Obecnie popularne są randomForest i gbm (zwane w literaturze uczeniem maszynowym MART lub Gradient Boosting), będące odpowiednikiem prostych drzew. Popularny jest również bayesglm, który używa MAP z priorytetami do regularyzacji.

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
źródło
24

W rzeczywistości zależy to od tego, co chcesz uzyskać. Jeśli regresję logistyczną wykonujesz tylko dla prognoz, możesz użyć dowolnej nadzorowanej metody klasyfikacji odpowiedniej dla twoich danych. Inna możliwość: analiza dyskryminacyjna (lda () i qda () z pakietu 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')

Z drugiej strony, jeśli potrzebujesz przedziałów ufności wokół swoich prognoz lub standardowych błędów w swoich szacunkach, większość algorytmów klasyfikacji nie pomoże. Można użyć uogólnionych modeli addytywnych (mieszanych), dla których dostępnych jest wiele pakietów. Często używam pakietu mgcv Simona Wooda. Uogólnione modele addytywne zapewniają większą elastyczność niż regresja logistyczna, ponieważ można używać splajnów do modelowania predyktorów.

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

Jest o wiele więcej do zrobienia:

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

...

Poleciłbym książkę Simona Wooda o ogólnych modelach addytywnych

Joris Meys
źródło
14

Zgadzam się z Joe i dodałbym:

Zasadniczo można zastosować dowolną metodę klasyfikacji, choć będzie ona zależeć od danych / sytuacji. Na przykład możesz również użyć SVM, prawdopodobnie z popularnym modelem C-SVM. Oto przykład z jądra używającego radialnej funkcji jądra:

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
źródło
12

Istnieje około 100 modeli klasyfikacji i regresji, które można trenować za pomocą pakietu Caret . Każdy z modeli klasyfikacji będzie dla ciebie opcją (w przeciwieństwie do modeli regresji, które wymagają ciągłej reakcji). Na przykład, aby wytrenować losowy las:

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

Zobacz winietę szkoleniową z modelami Caret, która jest dostarczana z dystrybucją, aby uzyskać pełną listę dostępnych modeli. Jest on podzielony na modele podwójnego zastosowania i modele klasyfikacji (z których można korzystać) i tylko na regresję (których nie można). Caret automatycznie wyszkoli dla Ciebie parametry wybranego modelu.

jphoward
źródło
7

Naive Bayes to dobra prosta metoda szkolenia danych w celu znalezienia odpowiedzi binarnej.

library(e1071)
fitNB <- naiveBayes(y~x)
predict(fitNB, x)
IEORTools
źródło
3

Istnieją dwie odmiany regresji logistycznej, które nie zostały jeszcze przedstawione. Po pierwsze, regresja logistyczna szacuje prawdopodobieństwo za pomocą funkcji logistycznej, która jest skumulowanym rozkładem logistycznym (znanym również jako sigmoid). Można również oszacować prawdopodobieństwa za pomocą funkcji pochodzących z innych rozkładów. Najczęstszym sposobem oprócz regresji logistycznej jest regresja probitowa, która pochodzi z rozkładu normalnego. Aby uzyskać bardziej szczegółową dyskusję między różnicami między probitem a logitem, odwiedź następującą stronę.

Różnica między modelami logit i 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')

Druga alternatywa wskazuje na tygodniową implementację funkcji logistycznej. Jeśli masz małą próbkę i / lub brakuje wartości, funkcja logistyczna nie jest wskazana. Dlatego dokładna regresja logistyczna jest lepszym modelem. Logarytmiczne szanse wyniku modeluje się jako liniową kombinację zmiennych predykcyjnych.

elrm(formula = y ~ x)

Ponadto istnieją inne alternatywy, o których warto wspomnieć:

  1. Dwukierunkowa tabela awaryjna
  2. Dwugrupowa analiza funkcji dyskryminacyjnej.
  3. Hotelling's T2.

Uwaga końcowa: regresja logistyczna jest taka sama jak mała sieć neuronowa bez ukrytych warstw i tylko jeden punkt w warstwie końcowej. Dlatego możesz używać implementacji pakietów sieci neuronowych, takich jak nnetR.

Edytować:

Kilka tygodni później zdałem sobie sprawę, że istnieje również algorytm Winnow i Perceptron . Oba są klasyfikatorami, które działają również w przypadku klasyfikacji na dwie grupy, ale obie wypadły z łask w ciągu ostatnich 15 lat.

Ferdi
źródło