我有一个包含连续预测器和二分响应变量的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()
计算概率并将其保存在另一个data.frame
> 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
数据上调用它。但是,如果我使用df
中的ggplot()
数据,我认为无法绘制概率。
如何将概率和回归线组合在一个中,就像它在ggplot2中的方式一样,即没有收到任何警告或错误消息?
答案 0 :(得分:15)
基本上有三种解决方案:
最简单的方法是,将您的数据分成两个单独的data.frame
s,然后按position
合并它们:
mydf <- merge( mydf, probs, by="position")
然后,您可以在此ggplot
上致电data.frame
,而不会发出警告:
ggplot( mydf, aes(x=position, y=prob)) +
geom_point() +
geom_smooth(method = "glm",
method.args = list(family = "binomial"),
se = FALSE)
将来你可以直接避免创建两个独立的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
。