R中逻辑回归的替代方法


55

我想要执行与逻辑回归相同任务的许多算法。也就是说,可以使用一些解释变量(X)预测二进制响应(Y)的算法/模型。

如果为算法命名后,如果您还演示如何在R中实现它,我将非常高兴。这是一个可以用其他模型更新的代码:

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 2010年

供将来参考:您可能已经可以以允许我们将其作为非CW问题的方式来表达此问题。参见meta.stats.stackexchange.com/questions/290/…–
Shane

谢谢您的链接Shane。您在此处打开了一个非常有趣的讨论。在阅读了Thomasas的答案之后,我相信这仍然应该是社区Wiki,因为我的意图是找到尽可能多的替代方案(我怀疑有人可以提供)。但是,再次感谢您引导我进入该主题!
塔尔·加利利

这并不是太广泛而无法回答-它目前有6个答案(赞成5个)。而且,这个问题被高度推崇和高度喜爱,并且是CW。它应该保持开放,IMO。
gung-恢复莫妮卡

Answers:


28

目前流行的是randomForest和gbm(在机器学习文献中称为MART或Gradient Boosting),rpart用于简单树。Bayesglm也很流行,它使用带有先验的MAP进行正则化。

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

实际上,这取决于您想要获得什么。如果仅对预测执行逻辑回归,则可以使用适合您数据的任何监督分类方法。另一种可能性:判别分析(来自软件包MASS的lda()和qda())

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

另一方面,如果您需要预测的置信区间或估计的标准误,则大多数分类算法都无法为您提供帮助。您可以使用通用的加性(混合)模型,该模型提供了许多软件包。我经常使用Simon Wood的mgcv软件包。广义的加性模型比逻辑回归具有更大的灵活性,因为您可以使用样条曲线对预测变量进行建模。

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

有关可用模型的完整列表,请参见分发中附带的插入符号模型训练图。它分为两用模型和分类模型(都可以使用)和纯回归模型(不能使用)。插入符将自动为您选择模型的参数。


7

朴素贝叶斯(Naive Bayes)是一种训练数据以查找二进制响应的简单好方法。

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

3

逻辑回归有两种变体,尚未列出。首先,逻辑回归使用逻辑函数估计概率,该逻辑函数是累积逻辑分布(也称为S型)。您还可以使用从其他分布派生的函数来估计概率。除了逻辑回归之外,最常见的方法是概率回归,该回归是从正态分布派生的。有关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. Hotelling的T2。

最后说明:逻辑回归与小型神经网络相同,没有隐藏层,而最终层中只有一个点。因此,您可以使用诸如nnetR中的神经网络包的实现。

编辑:

几周后,我意识到还有 WinnowPerceptron算法。两者都是分类器,它们也可用于将两组分类,但是在过去的15年中,它们都不再受到青睐。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.