2017-02-14 13 views
6

Próbuję obliczyć prognozę regresji logistycznej dla zestawu danych za pomocą pakietów tidyverse i modelr. Najwyraźniej robię coś złego w add_predictions, ponieważ nie otrzymuję "odpowiedzi" funkcji logistycznej tak jakbym, gdybym używał funkcji "przewidywania" w statystykach. To powinno być proste, ale nie mogę tego rozgryźć, a wiele wyszukiwań przyniosło niewiele.Using modelr :: add_predictions for 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)) 

Odpowiedz

3

predict.glm „s type parametrów domyślnie "link", które add_predictions nie zmieniają domyślnie nie zapewni Ci żaden sposób, aby przejść do niemal z pewnością pożądane "response". (A GitHub issue exists; dodaj do tego swojego miłego reprezentanta, jeśli chcesz.) To powiedziawszy, nie jest trudno po prostu użyć predict bezpośrednio w tidyverse przez dplyr::mutate.

Należy również zauważyć, że ggplot wymusza na wartości numeryczne default (współczynnik) w celu wykreślenia linii, co jest w porządku, z wyjątkiem tego, że "Nie" i "Tak" są zastąpione przez 1 i 2, a prawdopodobieństwo zwrócone przez predict będzie zawierać się w przedziale od 0 do 1. Jawne wymuszanie na numeryczne i odejmowanie jednego powoduje naprawienie wykresu, jednak wymagane jest dodatkowe wywołanie, aby naprawić etykiety.

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

Należy również pamiętać, że jeśli chcesz to działka, geom_smooth można obliczyć bezpośrednio prognozy dla Ciebie:

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