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

22

我有一个数据框,其中包含一个连续预测变量和一个二分响应变量。

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

它返回一个警告:二项式glm中的非整数#成功次数!。我知道为了正确绘制stat_smooth,我必须在具有二元变量的原始df数据上调用它。但是,如果我在ggplot()中使用df数据,则看不到绘制概率的方法。

如何将概率和回归线合并到一个图中,以ggplot2的方式呈现,即不会出现任何警告或错误消息?


先绘制数据和 +stat_smooth,然后使用以下代码添加所需概率的线图:+geom_line(aes(x=position, y=prob), data=probs)。在没有数据示例的情况下未经测试。 - IRTFM
1个回答

35

基本上有三种解决方案:

合并数据框

在将数据分别存储为两个不同的data.frame后,最简单的方法是按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) 

enter image description here

避免创建两个数据框

未来,您可以直接避免创建两个分开的数据框,然后再进行合并。个人而言,我喜欢使用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 包。它似乎非常有用! - vincentqu
4
这段代码已失效。出现了“错误:未知参数:family”的提示。必须使用stat_smooth(method="glm", se=F, method.args = list(family="binomial"))...将family参数传递给层,而不是方法。请注意,翻译后的内容不包含解释或额外信息。 - CoderGuy123

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接