Alternativas à regressão logística em R

55

Eu gostaria de ter muitos algoritmos que executam a mesma tarefa que a regressão logística. Ou seja, algoritmos / modelos que podem fornecer uma previsão para uma resposta binária (Y) com alguma variável explicativa (X).

Eu ficaria feliz se, depois de nomear o algoritmo, se você também mostrar como implementá-lo em R. Aqui está um código que pode ser atualizado com outros 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
fonte
Temos que assumir que você está considerando um conjunto fixo de preditores, ou seja, você está interessado em obter uma previsão confiável com base em k preditores, ou também está interessado em algum tipo de penalização no Xj(j=1k) ?
chl
Admito que, para meu interesse pessoal, penalização não seria necessário, e por uma questão de conhecimento aqui eu diria que ambos são respostas relevantes :)
Tal Galili
Para referência futura: você pode ter conseguido formular esta pergunta de tal maneira que a permitiríamos como uma questão não relacionada à CW. Veja meta.stats.stackexchange.com/questions/290/…
Shane
Obrigado pelo link Shane. Uma discussão muito interessante que você abriu lá. Depois de ler a resposta de Thomasas, acredito que esse ainda deve ser um wiki da comunidade, pois minha intenção era encontrar o maior número possível de alternativas (algo que duvido que qualquer pessoa possa fornecer). Mais uma vez, obrigado por me direcionar para esse segmento!
Tal Galili
Isso não é muito amplo para ser respondido - atualmente tem 6 respostas (5 votadas). Além disso, a questão é altamente votada e favorecida, e é a CW. Deve permanecer aberto, IMO.
gung - Restabelece Monica

Respostas:

28

Os populares atualmente são randomForest e gbm (chamado MART ou Gradient Boosting na literatura de aprendizado de máquina), rpart para árvores simples. Também popular é o bayesglm, que usa o MAP com anteriores para regularização.

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
fonte
24

Na verdade, isso depende do que você deseja obter. Se você executar regressão logística apenas para as previsões, poderá usar qualquer método de classificação supervisionado adequado para seus dados. Outra possibilidade: análise discriminante (lda () e qda () do pacote 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 outro lado, se você precisar de intervalos de confiança em torno de suas previsões ou erros padrão em suas estimativas, a maioria dos algoritmos de classificação não o ajudará. Você pode usar modelos aditivos generalizados (mistos), para os quais vários pacotes estão disponíveis. Costumo usar o pacote mgcv de Simon Wood. Modelos aditivos generalizados permitem mais flexibilidade do que a regressão logística, pois você pode usar splines para modelar seus preditores.

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

Há muito mais a fazer:

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

...

Eu recomendaria o livro de Simon Wood sobre modelos aditivos generalizados

Joris Meys
fonte
14

Eu concordo com Joe e acrescentaria:

Qualquer método de classificação poderia, em princípio, ser utilizado, embora dependa dos dados / situação. Por exemplo, você também pode usar um SVM, possivelmente com o popular modelo C-SVM. Aqui está um exemplo do kernlab usando uma função de base radial do kernel:

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
fonte
12

Existem cerca de 100 modelos de classificação e regressão que podem ser treinados através do pacote de interpolação . Qualquer um dos modelos de classificação será uma opção para você (em oposição aos modelos de regressão, que exigem uma resposta contínua). Por exemplo, para treinar uma floresta aleatória:

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

Consulte a vinheta de treinamento do modelo de sinal de intercalação que acompanha a distribuição para obter uma lista completa dos modelos disponíveis. Ele é dividido em modelos de uso duplo e de classificação (ambos os quais você pode usar) e somente em regressão (que você não pode). O sinal de intercalação treinará automaticamente os parâmetros para o modelo escolhido para você.

jphoward
fonte
7

Naive Bayes é um bom método simples de treinar dados para encontrar uma resposta binária.

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

Existem duas variações da regressão logística que ainda não estão descritas. Primeiramente, a regressão logística estima probabilidades usando uma função logística, que é uma distribuição logística cumulativa (também conhecida como sigmóide). Você também pode estimar probabilidades usando funções derivadas de outras distribuições. A maneira mais comum, além da regressão logística, é a regressão probit, derivada da distribuição normal. Para uma discussão mais detalhada entre as diferenças entre probit e logit, visite o site a seguir.

Diferença entre os modelos 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')

A segunda alternativa indica uma semana da função logística que você implementou. Se você tiver um tamanho pequeno de amostra e / ou valores ausentes, a função logística não é aconselhável. Portanto, uma regressão logística exata é um modelo melhor. As chances de log do resultado são modeladas como uma combinação linear das variáveis ​​preditoras.

elrm(formula = y ~ x)

Além disso, existem outras alternativas a serem mencionadas:

  1. Tabela de contingência bidirecional
  2. Análise da função discriminante em dois grupos.
  3. T2 do hotel.

Observação final: Uma regressão logística é igual a uma pequena rede neural sem camadas ocultas e apenas um ponto na camada final. Portanto, você pode usar implementações de pacotes de redes neurais, como nnetem R.

Editar:

Algumas semanas depois, percebi que também havia o algoritmo Winnow e Perceptron . Ambos são classificadores que trabalham também para classificações em dois grupos, mas ambos são desvalorizados nos últimos 15 anos.

Ferdi
fonte