Alternatif untuk regresi logistik di R

55

Saya ingin banyak algoritma yang melakukan tugas yang sama dengan regresi logistik. Itu adalah algoritma / model yang dapat memberikan prediksi untuk respon biner (Y) dengan beberapa variabel penjelas (X).

Saya akan senang jika setelah Anda menyebutkan algoritma, jika Anda juga akan menunjukkan cara mengimplementasikannya dalam R. Berikut adalah kode yang dapat diperbarui dengan model lain:

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
sumber
Apakah kita harus berasumsi bahwa Anda sedang mempertimbangkan seperangkat prediktor yang tetap, yaitu Anda tertarik untuk mendapatkan prediksi yang dapat diandalkan yang diberikan prediktor, atau apakah Anda juga tertarik pada beberapa jenis hukuman pada ? X jkXj(j=1k)
chl
Saya akui bahwa untuk kepentingan pribadi saya, hukuman tidak akan diperlukan, dan demi pengetahuan di sini, saya akan mengatakan keduanya adalah jawaban yang relevan :)
Tal Galili
Untuk referensi di masa mendatang: Anda mungkin bisa mengutarakan pertanyaan ini sedemikian rupa sehingga kami mengizinkannya sebagai pertanyaan non-CW. Lihat meta.stats.stackexchange.com/questions/290/…
Shane
Terima kasih atas tautannya Shane. Diskusi yang sangat menarik Anda buka di sana. Setelah membaca jawaban Thomasas, saya percaya ini masih harus menjadi wiki komunitas, karena niat saya adalah untuk menemukan alternatif sebanyak mungkin (sesuatu yang saya ragu setiap orang akan dapat menyediakan). Namun, sekali lagi, terima kasih telah mengarahkan saya ke utas itu!
Tal Galili
Ini tidak terlalu luas untuk dijawab - saat ini ada 6 jawaban (5 diunggulkan). Selain itu, pertanyaannya sangat terangkat & sangat disukai, & adalah CW. Itu harus tetap terbuka, IMO.
gung - Reinstate Monica

Jawaban:

28

Populer saat ini adalah randomForest dan gbm (disebut MART atau Gradient Boosting dalam literatur pembelajaran mesin), rpart untuk pohon sederhana. Yang juga populer adalah bayesglm, yang menggunakan MAP dengan prior untuk regularisasi.

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

Sebenarnya, itu tergantung pada apa yang ingin Anda peroleh. Jika Anda melakukan regresi logistik hanya untuk prediksi, Anda dapat menggunakan metode klasifikasi terawasi yang cocok untuk data Anda. Kemungkinan lain: analisis diskriminan (lda () dan qda () dari 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')

Di sisi lain, jika Anda memerlukan interval kepercayaan di sekitar prediksi Anda atau kesalahan standar pada perkiraan Anda, sebagian besar algoritma klasifikasi tidak akan membantu Anda. Anda bisa menggunakan model aditif umum (campuran), yang tersedia sejumlah paket. Saya sering menggunakan paket mgcv dari Simon Wood. Model aditif umum memungkinkan lebih banyak fleksibilitas daripada regresi logistik, karena Anda dapat menggunakan splines untuk memodelkan prediktor Anda.

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

Ada banyak lagi yang harus dilakukan:

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

...

Saya akan merekomendasikan buku Simon Wood tentang Generalized Additive Models

Joris Meys
sumber
14

Saya setuju dengan Joe, dan akan menambahkan:

Setiap metode klasifikasi pada prinsipnya dapat digunakan, meskipun itu akan tergantung pada data / situasi. Misalnya, Anda juga bisa menggunakan SVM, mungkin dengan model C-SVM yang populer. Berikut adalah contoh dari kernlab menggunakan fungsi kernel basis radial:

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

Ada sekitar 100 model klasifikasi dan regresi yang dapat dilatih melalui paket caret . Model klasifikasi mana pun akan menjadi pilihan bagi Anda (sebagai lawan dari model regresi, yang memerlukan respons berkelanjutan). Misalnya untuk melatih hutan acak:

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

Lihat sketsa pelatihan model caret yang disertai dengan distribusi untuk daftar lengkap model yang tersedia. Ini dibagi menjadi model penggunaan ganda dan klasifikasi (keduanya dapat Anda gunakan) dan hanya regresi (yang Anda tidak bisa). caret akan secara otomatis melatih parameter untuk model yang Anda pilih untuk Anda.

jphoward
sumber
7

Naif Bayes adalah metode pelatihan data sederhana yang bagus untuk menemukan respons biner.

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

Ada dua variasi regresi logistik yang belum diuraikan. Pertama, regresi logistik memperkirakan probabilitas menggunakan fungsi logistik yang merupakan distribusi logistik kumulatif (juga dikenal sebagai sigmoid). Anda juga dapat memperkirakan probabilitas menggunakan fungsi-fungsi yang berasal dari distribusi lain. Cara yang paling umum terlepas dari regresi logistik adalah regresi probit yang berasal dari distribusi normal. Untuk diskusi lebih rinci antara perbedaan probit dan logit, silakan kunjungi situs berikut.

Perbedaan antara model logit dan 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')

Alternatif kedua menunjukkan seminggu sekali fungsi logistik yang Anda laksanakan. Jika Anda memiliki ukuran sampel kecil dan / atau nilai yang hilang, fungsi logistik tidak disarankan. Oleh karena itu regresi logistik yang tepat adalah model yang lebih baik. Peluang log dari hasil dimodelkan sebagai kombinasi linear dari variabel prediktor.

elrm(formula = y ~ x)

Selanjutnya ada alternatif lain yang ingin disebutkan:

  1. Tabel kontingensi dua arah
  2. Analisis fungsi diskriminan dua kelompok.
  3. T2 Hotelling.

Komentar akhir: Regresi logistik sama dengan jaringan saraf kecil tanpa lapisan tersembunyi dan hanya satu titik di lapisan akhir. Oleh karena itu Anda dapat menggunakan implementasi paket jaringan saraf seperti nnetdi R.

Sunting:

Beberapa minggu kemudian saya menyadari bahwa ada juga algoritma Winnow dan Perceptron . Keduanya adalah pengklasifikasi yang juga berfungsi untuk klasifikasi menjadi dua kelompok, tetapi keduanya tidak disukai dalam 15 tahun terakhir.

Ferdi
sumber