2017-02-14 31 views
6

Bir veri kümesi için tidyverse ve modelr paketlerini kullanarak lojistik regresyon tahminini hesaplamaya çalışıyorum. Açıkçası, add_predictions'da yanlış bir şey yapıyorum çünkü lojistik işlevinin "yanıtı" işlevini, istatistiklerde "tahmin" işlevini kullanıyor olsaydım almadım. Bu basit olmalı, ama ben bunu anlayamıyorum ve birden fazla arama az üretti. hiçbir şekilde size varsayılan olarak değiştirmek, ne sağlamaz add_predictions"link" içinglm için modelr :: add_predictions kullanımı

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

cevap

3

predict.glm 'ın type parametre varsayılan, "response" istenen neredeyse kesinlikle değiştirmek için. (A GitHub issue exists; hoş bir reprodeksini isterseniz ekleyin.) Demek ki, predict'u dplyr::mutate üzerinden doğrudan tidyverse içinde kullanmak zor değil. olasılıklar predict tarafından döndürülen ise

Ayrıca bu "Hayır" ve "Evet" 1 ve 2 ile değiştirilir dışında gayet çizgi çizmek amacıyla sayısal için default (bir faktör) coercing olduğunu ggplot dikkat 0 ile 1 arasında olacaktır. Etiketleri düzeltmek için fazladan bir scale_y_continuous aramasına gerek duyulsa bile, rakamsal olarak kodlamaya ve bir çıkartma işlemine açık bir şekilde zorlama yapılır.

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

Ayrıca istediğin bir arsa ise, geom_smooth sizin için doğrudan tahminler hesaplayabilir unutmayın:

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