ggplot2:逻辑回归 - 绘制概率和回归线

Posted

技术标签:

【中文标题】ggplot2:逻辑回归 - 绘制概率和回归线【英文标题】:ggplot2: Logistic Regression - plot probabilities and regression line 【发布时间】:2013-06-05 08:32:05 【问题描述】:

我有一个包含连续预测变量和二分响应变量的 data.frame。

> head(df)
  position response
1        0        1
2        3        1
3       -4        0
4       -1        0
5       -2        1
6        0        0

我可以通过glm()-函数轻松计算逻辑回归,到目前为止没有问题。

接下来,我想用 ggplot 创建一个图,其中包含 11 个预测变量值中每一个的经验概率和拟合回归线 .

我继续使用cast() 计算概率并将它们保存在另一个数据帧中

> probs
   position   prob
1        -5 0.0500
2        -4 0.0000
3        -3 0.0000
4        -2 0.2000
5        -1 0.1500
6         0 0.3684
7         1 0.4500
8         2 0.6500
9         3 0.7500
10        4 0.8500
11        5 1.0000

我绘制了概率:

p <- ggplot(probs, aes(x=position, y=prob)) + geom_point()

但是当我尝试添加拟合回归线时

p <- p + stat_smooth(method="glm", family="binomial", se=F)

它返回一个警告:non-integer #successes in a binomial glm!。 我知道,为了“正确”绘制stat_smooth,我必须使用二分变量在原始df 数据上调用它。但是,如果我在ggplot() 中使用dfdata,我看不到绘制概率的方法。

如何将概率和回归线组合在一个图中,就像它在 ggplot2 中的方式一样,即没有收到任何警告或错误消息?

【问题讨论】:

首先绘制数据和+stat_smooth,然后通过调用+geom_line(aes(x=position, y=prob), data=probs) 添加所需概率的线图。在没有数据示例的情况下未经测试。 【参考方案1】:

基本上有三种解决方案:

合并 data.frames

将数据放在两个单独的data.frames 中后,最简单的方法是通过position 合并它们:

mydf <- merge( mydf, probs, by="position")

然后您可以在此data.frame 上调用ggplot 而不会发出警告:

ggplot( mydf, aes(x=position, y=prob)) +
  geom_point() +
  geom_smooth(method = "glm", 
    method.args = list(family = "binomial"), 
    se = FALSE) 

避免创建两个data.frames

以后您可以直接避免创建两个单独的 data.frames,您必须稍后合并它们。就个人而言,我喜欢为此使用plyr 包:

librayr(plyr)
mydf <- ddply( mydf, "position", mutate, prob = mean(response)  )

编辑:为每一层使用不同的数据

我忘了提,你可以为每一层使用另一个data.frame,这是ggplot2的一个强大优势:

ggplot( probs, aes(x=position, y=prob)) +
  geom_point() +
  geom_smooth(data = mydf, aes(x = position, y = response),
    method = "glm", method.args = list(family = "binomial"), 
    se = FALSE)

作为附加提示:避免使用变量名df,因为您通过分配给该变量名来覆盖内置函数stats::df

【讨论】:

非常感谢!第二种选择似乎很优雅。我想我必须深入研究plyr 包。看起来很有用! 此代码不再有效。 Error: Unknown parameters: family。必须使用stat_smooth(method="glm", se=F, method.args = list(family="binomial"))... 将family参数传递给层,而不是方法。

以上是关于ggplot2:逻辑回归 - 绘制概率和回归线的主要内容,如果未能解决你的问题,请参考以下文章

逻辑回归--计算概率

逻辑回归 PMML 不会产生概率

Python SKLearn:逻辑回归概率

逻辑回归输出中只有两个不同的概率值

逻辑回归(Logistic Regression, LR)

斯坦福吴恩达教授机器学习公开课第三讲笔记——局部加权回归/线性回归的概率解释/分类和逻辑回归