从逻辑回归模型拟合中获得预测值(Y = 1或0)


50

假设我有一个类的对象glm(对应于逻辑回归模型),并且我想将predict.glm使用参数提供的预测概率type="response"转换为二进制响应,即或。在R中最快,最规范的方法是什么?Y=1Y=0

再次,虽然我知道了predict.glm,但我不知道截止值确切 -我想这是我这里的主要绊脚石。P(Yi=1|X^i)

Answers:


77

一旦有了预测的概率,就由您要使用的阈值决定。您可以选择阈值来优化灵敏度,特异性或在应用程序上下文中最重要的衡量指标(此处一些其他信息将有助于获得更具体的答案)。您可能需要查看ROC曲线和其他与最佳分类有关的度量。

编辑:为了澄清这个答案,我将举一个例子。真正的答案是,最佳截止值取决于分类器的哪些属性在应用程序上下文中很重要。令为观察的真实值,为预测类。一些常见的绩效衡量标准是YiiY^i

(1)灵敏度: -正确识别为'1'的比例。P(Y^i=1|Yi=1)

(2)特异性: -正确标识为'0'的比例P(Y^i=0|Yi=0)

(3)(正确)分类率: -正确的预测比例。P(Yi=Y^i)

(1)也称为真实正利率,(2)也称为真实负利率。

例如,如果您的分类器旨在评估一种可以相对安全治愈的严重疾病的诊断测试,那么敏感性要比特异性重要得多。在另一种情况下,如果疾病相对较小并且治疗存在风险,则特异性对控制更为重要。对于一般的分类问题,共同优化灵敏度和规格被认为是“好的”-例如,您可以使用使它们与点的欧几里得距离最小的分类器:(1,1)

δ=[P(Yi=1|Y^i=1)1]2+[P(Yi=0|Y^i=0)1]2

δ在本申请的上下文中,可以用另一种方式对进行加权或修改,以反映距的距离的更合理度量-为说明目的,此处任意选择距(1,1)的欧几里德距离。在任何情况下,这四种措施中的所有措施都可能最合适,具体取决于应用程序。(1,1)

下面是一个使用Logistic回归模型的预测进行分类的模拟示例。改变分界线以查看在这三个量度中的每一个之下,什么分界线给出了“最佳”分类器。在此示例中,数据来自具有三个预测变量的逻辑回归模型(请参见下图的R代码)。从该示例中可以看出,“最优”截止取决于这些措施中最重要的一个-这完全取决于应用程序。

编辑2: 和,正预测值和负预测值(请注意,它们是相同的(如敏感性和特异性)也可能是有效的绩效指标。P(Yi=1|Y^i=1)P(Yi=0|Y^i=0)

在此处输入图片说明

# data y simulated from a logistic regression model 
# with with three predictors, n=10000
x = matrix(rnorm(30000),10000,3)
lp = 0 + x[,1] - 1.42*x[2] + .67*x[,3] + 1.1*x[,1]*x[,2] - 1.5*x[,1]*x[,3] +2.2*x[,2]*x[,3] + x[,1]*x[,2]*x[,3]
p = 1/(1+exp(-lp))
y = runif(10000)<p

# fit a logistic regression model
mod = glm(y~x[,1]*x[,2]*x[,3],family="binomial")

# using a cutoff of cut, calculate sensitivity, specificity, and classification rate
perf = function(cut, mod, y)
{
   yhat = (mod$fit>cut)
   w = which(y==1)
   sensitivity = mean( yhat[w] == 1 ) 
   specificity = mean( yhat[-w] == 0 ) 
   c.rate = mean( y==yhat ) 
   d = cbind(sensitivity,specificity)-c(1,1)
   d = sqrt( d[1]^2 + d[2]^2 ) 
   out = t(as.matrix(c(sensitivity, specificity, c.rate,d)))
   colnames(out) = c("sensitivity", "specificity", "c.rate", "distance")
   return(out)
}

s = seq(.01,.99,length=1000)
OUT = matrix(0,1000,4)
for(i in 1:1000) OUT[i,]=perf(s[i],mod,y)
plot(s,OUT[,1],xlab="Cutoff",ylab="Value",cex.lab=1.5,cex.axis=1.5,ylim=c(0,1),type="l",lwd=2,axes=FALSE,col=2)
axis(1,seq(0,1,length=5),seq(0,1,length=5),cex.lab=1.5)
axis(2,seq(0,1,length=5),seq(0,1,length=5),cex.lab=1.5)
lines(s,OUT[,2],col="darkgreen",lwd=2)
lines(s,OUT[,3],col=4,lwd=2)
lines(s,OUT[,4],col="darkred",lwd=2)
box()
legend(0,.25,col=c(2,"darkgreen",4,"darkred"),lwd=c(2,2,2,2),c("Sensitivity","Specificity","Classification Rate","Distance"))

2
(+1)非常好的答案。我喜欢这个例子。您是否知道要使用现成的解释来激发使用给定的欧几里德距离?我还认为在这种情况下指出ROC曲线本质上是通过对逻辑模型的截距估计值进行事后修改来获得的。
红衣主教2012年

@Cardinal,我知道经常根据ROC曲线上最接近(1,1)的那个点来选择二进制分类的阈值-欧几里德距离是我的示例中“距离”的默认定义
Macro'4

我懂了。我以为我可能没有看到的有关潜在模型的直观解释。(也许有[?])
红衣主教2012年

也许是因为我发现敏感性和特异性曲线相交的点是最小的地方...δ
Macro

我目前没有使用终端,但我想知道您看到的效果是否可能部分是由于您的模拟应生成大致相等数量的0和1响应这一事实。如果您改变彼此的比例,这种关系是否仍然成立?R
主教
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.