为glm使用modelr :: add_predictions

Far*_*mer 9 r glm tidyverse modelr

我试图使用tidyverse和modelr包计算一组数据的逻辑回归预测.显然我做错了,add_predictions因为我没有收到后勤功能的"响应",就像我在统计数据中使用'预测'功能一样.这应该很简单,但我无法弄清楚,多次搜索产生的结果很少.

library(tidyverse)
library(modelr)
options(na.action = na.warn)
library(ISLR)

d <- as_tibble(ISLR::Default)
model <- glm(default ~ balance, data = d, family = binomial)
grid <- d %>% data_grid(balance) %>% add_predictions(model)

ggplot(d, aes(x=balance)) + 
    geom_point(aes(y = default)) + 
    geom_line(data = grid, aes(y = pred))
Run Code Online (Sandbox Code Playgroud)

ali*_*ire 5

predict.glmtype参数默认为"link",add_predictions默认情况下不会更改,也不会为您提供任何改变为几乎可以肯定的方法"response".(存在一个GitHub问题 ;如果你愿意的话,可以在它上面添加你的漂亮的代表.)也就是说,predict直接在tidyverse via中使用它并不难dplyr::mutate.

还要注意ggplot是强制default数字(因子)以绘制线条,这很好,除了"否"和"是"被1和2替换,而返回的概率predict将介于0和1之间虽然需要额外的scale_y_continuous调用来修复标签,但明确强制数字并减去一个修复了图.

library(tidyverse)
library(modelr)

d <- as_tibble(ISLR::Default)
model <- glm(default ~ balance, data = d, family = binomial)

grid <- d %>% data_grid(balance) %>% 
    mutate(pred = predict(model, newdata = ., type = 'response'))

ggplot(d, aes(x = balance)) + 
    geom_point(aes(y = as.numeric(default) - 1)) + 
    geom_line(data = grid, aes(y = pred)) + 
    scale_y_continuous('default', breaks = 0:1, labels = levels(d$default))
Run Code Online (Sandbox Code Playgroud)

另请注意,如果您想要的只是一个情节,geom_smooth可以直接为您计算预测:

ggplot(d, aes(balance, as.numeric(default) - 1)) + 
    geom_point() + 
    geom_smooth(method = 'glm', method.args = list(family = 'binomial')) + 
    scale_y_continuous('default', breaks = 0:1, labels = levels(d$default))
Run Code Online (Sandbox Code Playgroud)