ทางเลือกในการถดถอยโลจิสติกใน R


55

ฉันต้องการอัลกอริทึมเป็นจำนวนมากที่ทำงานเช่นเดียวกับการถดถอยโลจิสติก นั่นคืออัลกอริธึม / แบบจำลองที่สามารถทำนายการตอบสนองแบบไบนารี (Y) ด้วยตัวแปรอธิบาย (X)

ฉันจะดีใจถ้าคุณตั้งชื่ออัลกอริทึมถ้าคุณจะแสดงวิธีการใช้ในอาร์นี่คือรหัสที่สามารถอัปเดตกับรุ่นอื่น ๆ ได้:

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

kXj(j=1k)

ผมยอมรับว่าให้ความสนใจส่วนบุคคลของฉันลงโทษจะไม่จำเป็นและเพื่อประโยชน์ของความรู้ที่นี่ผมจะบอกว่าทั้งสองมีคำตอบที่เกี่ยวข้อง :)
Tal Galili

สำหรับการอ้างอิงในอนาคต: คุณอาจสามารถวลีคำถามนี้ในลักษณะที่เราจะอนุญาตให้เป็นคำถามที่ไม่ใช่ CW ดูmeta.stats.stackexchange.com/questions/290/…
เชน

ขอบคุณสำหรับลิงค์เชน การสนทนาที่น่าสนใจมากที่คุณเปิดนั้น หลังจากอ่านคำตอบของโทมัสแล้วฉันเชื่อว่านี่น่าจะเป็นวิกิชุมชนเพราะฉันตั้งใจจะหาทางเลือกให้มากที่สุดเท่าที่จะเป็นไปได้ แต่ขอขอบคุณอีกครั้งที่นำฉันไปยังเธรด!
Tal Galili

นี่ไม่ใช่คำตอบที่กว้างเกินไปจริง ๆ ปัจจุบันมี 6 คำตอบ (5 upvoted) ยิ่งไปกว่านั้นคำถามนี้ได้รับการสนับสนุนอย่างมาก & เป็นที่ชื่นชอบอย่างมาก & คือ CW มันควรจะยังคงเปิดอยู่ IMO
gung - Reinstate Monica

คำตอบ:


28

ได้รับความนิยมในขณะนี้คือป่าสุ่มและ gbm (เรียกว่ามาร์ทหรือการไล่ระดับสีในวรรณคดีการเรียนรู้เครื่อง), rpart สำหรับต้นไม้ที่เรียบง่าย ความนิยมอีกอย่างคือ bayesglm ซึ่งใช้ MAP กับ Priors สำหรับการทำให้เป็นมาตรฐาน

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

ที่จริงแล้วขึ้นอยู่กับสิ่งที่คุณต้องการได้รับ หากคุณทำการถดถอยโลจิสติกสำหรับการคาดการณ์เท่านั้นคุณสามารถใช้วิธีการจำแนกประเภทภายใต้การดูแลที่เหมาะสมกับข้อมูลของคุณ ความเป็นไปได้อีกอย่าง: การวิเคราะห์จำแนก (lda () และ qda () จากแพ็คเกจ 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')

ในทางกลับกันหากคุณต้องการช่วงความมั่นใจเกี่ยวกับการคาดการณ์หรือข้อผิดพลาดมาตรฐานของคุณโดยประมาณอัลกอริธึมการจำแนกส่วนใหญ่จะไม่ช่วยคุณ คุณสามารถใช้รุ่นเสริมทั่วไป (แบบผสม) ซึ่งมีแพ็คเกจจำนวนมาก ฉันมักจะใช้แพ็คเกจ mgcv ของ Simon Wood โมเดลสารเติมแต่งทั่วไปให้ความยืดหยุ่นมากกว่าการถดถอยโลจิสติกส์เนื่องจากคุณสามารถใช้เส้นโค้งเพื่อสร้างแบบจำลองการทำนายของคุณ

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

มีอะไรอีกมากมายให้ทำ:

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

...

ฉันอยากจะแนะนำหนังสือของ Simon Wood เกี่ยวกับนายแบบเสริมทั่วไป


14

ฉันเห็นด้วยกับโจและจะเพิ่ม:

โดยหลักการแล้วการจำแนกประเภทใด ๆ สามารถนำไปใช้ได้แม้ว่ามันจะขึ้นอยู่กับข้อมูล / สถานการณ์ ตัวอย่างเช่นคุณสามารถใช้ SVM ได้ด้วยรุ่น C-SVM ยอดนิยม นี่คือตัวอย่างจาก kernlab โดยใช้ฟังก์ชันเคอร์เนลพื้นฐานเรเดียล:

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

มีโมเดลการจำแนกและการถดถอยประมาณ 100 รูปแบบซึ่งสามารถฝึกอบรมได้ผ่านแพ็คเกจคาเร็ต รูปแบบการจำแนกประเภทใด ๆ จะเป็นตัวเลือกสำหรับคุณ (ตรงข้ามกับแบบจำลองการถดถอยซึ่งต้องการการตอบสนองอย่างต่อเนื่อง) ตัวอย่างเช่นการฝึกซ้อมฟอเรสต์แบบสุ่ม:

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

ดูบทความฝึกอบรม caret model ที่มาพร้อมกับการแจกจ่ายสำหรับรายการทั้งหมดของรุ่นที่มีให้ มันถูกแบ่งออกเป็นรุ่นที่ใช้สองทางและจัดประเภท (ทั้งสองแบบที่คุณสามารถใช้) และแบบถดถอยอย่างเดียว (ซึ่งคุณไม่สามารถทำได้) เครื่องหมายรูปหมวกจะฝึกพารามิเตอร์โดยอัตโนมัติสำหรับรุ่นที่คุณเลือกสำหรับคุณ


7

Naive Bayes เป็นวิธีการที่ง่าย ๆ ในการฝึกอบรมเพื่อค้นหาการตอบสนองแบบไบนารี

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

3

การถดถอยโลจิสติกส์มีสองรูปแบบซึ่งยังไม่ได้สรุป ประการแรกการถดถอยแบบลอจิสติกประมาณความน่าจะเป็นโดยใช้ฟังก์ชันลอจิสติกซึ่งเป็นการแจกแจงแบบลอจิสติก cumulativ (หรือที่เรียกว่า sigmoid) คุณยังสามารถประมาณความน่าจะเป็นโดยใช้ฟังก์ชั่นที่ได้จากการแจกแจงอื่น ๆ วิธีที่พบมากที่สุดนอกเหนือจากการถดถอยโลจิสติกคือการถดถอย probit ซึ่งได้มาจากการกระจายปกติ สำหรับการสนทนาอย่างละเอียดมากขึ้นระหว่างความแตกต่างของ probit และ logit กรุณาเยี่ยมชมเว็บไซต์ต่อไปนี้

ความแตกต่างระหว่างรุ่น logit และ 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')

ทางเลือกที่สองชี้ให้เห็นถึงสัปดาห์ของฟังก์ชั่นลอจิสติกที่คุณใช้งาน หากคุณมีตัวอย่างขนาดเล็กและ / หรือฟังก์ชั่นค่าที่ขาดหายไปไม่แนะนำให้เลือก ดังนั้นการถดถอยโลจิสติกที่แน่นอนเป็นรูปแบบที่ดีขึ้น อัตราต่อรองของผลลัพธ์ถูกสร้างแบบจำลองเป็นชุดค่าผสมเชิงเส้นของตัวแปรตัวทำนาย

elrm(formula = y ~ x)

นอกจากนี้ยังมีทางเลือกอื่น ๆ ที่จะกล่าวถึง:

  1. ตารางฉุกเฉินสองทาง
  2. การวิเคราะห์ฟังก์ชันจำแนกสองกลุ่ม
  3. T2 ของโรงแรม

คำพูดสุดท้าย: การถดถอยโลจิสติกเหมือนกับเครือข่ายประสาทขนาดเล็กที่ไม่มีเลเยอร์ที่ซ่อนอยู่และมีเพียงจุดเดียวในชั้นสุดท้าย ดังนั้นคุณสามารถใช้การใช้งานแพคเกจเครือข่ายประสาทเช่นnnetในอาร์

แก้ไข:

หลายสัปดาห์ต่อมาฉันก็รู้ว่ามี อัลกอริทึมWinnowและ Perceptronด้วย ทั้งสองเป็นตัวแยกประเภทซึ่งใช้สำหรับการจำแนกประเภทออกเป็นสองกลุ่ม

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.