为逻辑回归绘制预测概率的置信区间


20

好的,我进行了逻辑回归,并使用该predict()函数根据我的估计来绘制概率曲线。

## LOGIT MODEL:
library(car)
mod1 = glm(factor(won) ~ as.numeric(bid), data=mydat, family=binomial(link="logit"))

## PROBABILITY CURVE:
all.x <- expand.grid(won=unique(won), bid=unique(bid))
y.hat.new <- predict(mod1, newdata=all.x, type="response")
plot(bid<-000:1000,predict(mod1,newdata=data.frame(bid<-c(000:1000)),type="response"), lwd=5, col="blue", type="l")

很好,但我对绘制概率的置信区间感到好奇。我已经尝试过plot.ci()但是没有运气。谁能指出一些完成此操作的方法,最好是使用car包装或基数R。


4
(+1)回应关闭主题的投票:显然,那些投票的基础是,这个问题似乎是在问一个纯粹与软件相关的问题(“如何在R中绘制某某事物”),确实应该出现在SO上的问题。但是请注意,当前答复中隐藏的是创建绘图点的统计公式。这表明该问题在统计上很有趣,因此我不愿意投票赞成移民。一个好的答复将突出并解释这个统计点。
ub

Answers:


26

您使用的代码使用该glm函数估算了逻辑回归模型。您没有包括数据,所以我会做些补充。

set.seed(1234)
mydat <- data.frame(
    won=as.factor(sample(c(0, 1), 250, replace=TRUE)), 
    bid=runif(250, min=0, max=1000)
)
mod1 <- glm(won~bid, data=mydat, family=binomial(link="logit"))

逻辑回归模型对二元响应变量与一个连续预测变量之间的关系进行建模。结果是对数转换概率与预测变量成线性关系。在您的情况下,结果是对应于赌博获胜或未获胜的二进制响应,并且由下注的值来预测。来自的系数mod1以对数赔率(很难解释)给出,根据:

Logitp=日志p1个-p=β0+β1个X1个

要将记录的赔率转换为概率,我们可以将以上内容转换为

p=经验值β0+β1个X1个1个+经验值β0+β1个X1个

您可以使用此信息来设置绘图。首先,您需要一个范围的变量变量:

plotdat <- data.frame(bid=(0:1000))

然后使用predict,您可以根据模型获得预测

preddat <- predict(mod1, newdata=plotdat, se.fit=TRUE)

请注意,也可以通过以下方式获得拟合值

mod1$fitted

通过指定se.fit=TRUE,您还可以获得与每个拟合值相关的标准误差。结果data.frame是一个包含以下成分的矩阵:拟合的预测(fit),估计的标准误差(se.fit)和给出用于计算标准误差的色散平方根的标量(residual.scale)。在一个二项式分对数的情况下,该值将是1(它可以通过输入看到preddat$residual.scaleR)。如果要查看到目前为止所计算结果的示例,可以键入head(data.frame(preddat))

下一步是设置图。我喜欢先使用参数设置空白绘图区域:

with(mydat, plot(bid, won, type="n", 
    ylim=c(0, 1), ylab="Probability of winning", xlab="Bid"))

现在,您将知道了解如何计算拟合概率的重要位置。您可以按照上面的第二个公式绘制与拟合概率相对应的线。使用,preddat data.frame您可以将拟合值转换为概率,并使用该值针对预测变量的值绘制一条线。

with(preddat, lines(0:1000, exp(fit)/(1+exp(fit)), col="blue"))

最后,回答您的问题,可以通过计算拟合值+/- 1.96乘以标准误差的概率,将置信区间添加到图中:

with(preddat, lines(0:1000, exp(fit+1.96*se.fit)/(1+exp(fit+1.96*se.fit)), lty=2))
with(preddat, lines(0:1000, exp(fit-1.96*se.fit)/(1+exp(fit-1.96*se.fit)), lty=2))

结果图(根据随机生成的数据)应如下所示:

在此处输入图片说明

为了方便起见,以下是所有代码的一部分:

set.seed(1234)
mydat <- data.frame(
    won=as.factor(sample(c(0, 1), 250, replace=TRUE)), 
    bid=runif(250, min=0, max=1000)
)
mod1 <- glm(won~bid, data=mydat, family=binomial(link="logit"))
plotdat <- data.frame(bid=(0:1000))
preddat <- predict(mod1, newdata=plotdat, se.fit=TRUE)
with(mydat, plot(bid, won, type="n", 
    ylim=c(0, 1), ylab="Probability of winning", xlab="Bid"))
with(preddat, lines(0:1000, exp(fit)/(1+exp(fit)), col="blue"))
with(preddat, lines(0:1000, exp(fit+1.96*se.fit)/(1+exp(fit+1.96*se.fit)), lty=2))
with(preddat, lines(0:1000, exp(fit-1.96*se.fit)/(1+exp(fit-1.96*se.fit)), lty=2))

(注意:这是一个经过大量编辑的答案,旨在使它与stats.stackexchange更加相关。)


变量在哪里se.fit定义?
2012年

在中predict(..., se.fit=TRUE)
smillig

(-1)这些配置项针对每个个案?如果是这样,则对于二进制结果,预测概率的唯一明智CI为[0,1]。即使这可能是一个技术熟练的答案。
rolando2

根据@whuber的评论,我认为一个好的答案应该包括有关SE的计算公式。有人可以编辑和改善答案吗?
海森堡

1
您的答案似乎只给出了“平均预测间隔”。如何添加“点预测间隔”?
鲍勃·霍普兹

0

这是@smillig解决方案的修改。我在这里使用tidyverse工具,也使用linkinvGLM模型对象一部分的功能mod1。这样,您不必手动反转逻辑功能,并且无论您使用哪种特定的GLM,这种方法都将起作用。

library(tidyverse)
library(magrittr)


set.seed(1234)

# create fake data on gambling. Does prob win depend on bid size? 
mydat <- data.frame(
  won=as.factor(sample(c(0, 1), 250, replace=TRUE)), 
  bid=runif(250, min=0, max=1000)
)

# logistic regression model: 
mod1 <- glm(won~bid, data=mydat, family=binomial(link="logit"))

# new predictor values to use for prediction: 
plotdat <- data.frame(bid=(0:1000))

# df with predictions, lower and upper limits of CIs: 
preddat <- predict(mod1,
               type = "link",
               newdata=plotdat,
               se.fit=TRUE) %>% 
  as.data.frame() %>% 
  mutate(bid = (0:1000), 

         # model object mod1 has a component called linkinv that 
         # is a function that inverts the link function of the GLM:
         lower = mod1$family$linkinv(fit - 1.96*se.fit), 
         point.estimate = mod1$family$linkinv(fit), 
         upper = mod1$family$linkinv(fit + 1.96*se.fit)) 


# plotting with ggplot: 
preddat %>% ggplot(aes(x = bid, 
                   y = point.estimate)) + 
  geom_line(colour = "blue") + 
  geom_ribbon(aes(ymin = lower,
                  ymax = upper), 
              alpha = 0.5) + 
  scale_y_continuous(limits = c(0,1))

3
尽管实现通常与问题中的实质内容混合在一起,但我们应该是一个提供有关统计信息,机器学习等信息的网站,而不是代码。也可以提供代码,但是对于那些不太了解该语言以识别并从代码中提取答案的人,请在文本中详细说明您的实质性答案。
gung-恢复莫妮卡
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.