2017-02-14 2 views
6

Я пытаюсь вычислить предсказание логистической регрессии для набора данных с использованием пакетов tidyverse и modelr. Ясно, что я делаю что-то не так в add_predictions, так как я не получаю «ответ» логистической функции, как если бы я использовал функцию «предсказать» в статистике. Это должно быть просто, но я не могу понять это, и многократные поиски мало что дали.Использование modelr :: add_predictions для glm

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

ответ

3

predict.glm «s type параметров по умолчанию "link", который add_predictions не меняется по умолчанию, ни предоставить вам каким-либо образом изменить к почти, конечно, желательно "response". (A GitHub issue exists; добавьте свой хороший репрекс на него, если хотите.) Тем не менее, нетрудно просто использовать predict прямо в пределах tidyverse через 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)) 

Также обратите внимание, что если все, что вы хотите, это сюжет, 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)) 

Смежные вопросы