ggplot2: stat_smooth для логистических результатов с facet_wrap, возвращающим «полные» или «подмножества» модели glm - PullRequest
9 голосов
/ 29 декабря 2011

Я работаю над моделью логистической регрессии с одним непрерывным предиктором и одним категориальным предиктором с несколькими уровнями. Я хочу представить результаты, используя ggplot2 и используя facet_wrap, чтобы показать линии регрессии для каждого уровня категориального предиктора. При этом я заметил, что подобранная кривая, предоставленная stat_smooth, учитывает только данные в определенном фасете, а не весь набор данных. Это небольшая разница, но заметная, если смотреть на график в сравнении с прогнозируемыми значениями, полученными из predict.glm.

Вот пример, воссоздающий проблему с изображением, следующим за кодом.

library(boot)    # needed for inv.logit function
library(ggplot2) # version 0.8.9

set.seed(42)
n <- 100

df <- data.frame(location = rep(LETTERS[1:4], n),
                 score    = sample(45:80, 4*n, replace = TRUE))

df$p    <- inv.logit(0.075 * df$score + rep(c(-4.5, -5, -6, -2.8), n))
df$pass <- sapply(df$p, function(x){rbinom(1, 1, x)}) 

gplot <- ggplot(df, aes(x = score, y = pass)) + 
            geom_point() + 
            facet_wrap( ~ location) + 
            stat_smooth(method = 'glm', family = 'binomial') 

# 'full' logistic model
g <- glm(pass ~ location + score, data = df, family = 'binomial')
summary(g)

# new.data for predicting new observations
new.data <- expand.grid(score    = seq(46, 75, length = n), 
                        location = LETTERS[1:4])

new.data$pred.full <- predict(g, newdata = new.data, type = 'response')

pred.sub <- NULL
for(i in LETTERS[1:4]){
  pred.sub <- c(pred.sub,
    predict(update(g, formula = . ~ score, subset = location %in% i), 
            newdata = data.frame(score = seq(46, 75, length = n)), 
            type = 'response'))
}

new.data$pred.sub <- pred.sub

gplot + 
  geom_line(data = new.data, aes(x = score, y = pred.full), color = 'green') + 
  geom_line(data = new.data, aes(x = score, y = pred.sub),  color = 'red')

enter image description here

Что я заметил и обеспокоен тем, что в фасете B. его легко увидеть. Красные кривые - это предсказанные значения моделей, учитывающих только одно местоположение, тогда как зеленые кривые - это предсказания с использованием полного набора данных. Модели, основанные на подмножестве данных, соответствуют графику от stat_smooth.

Я бы хотел изобразить, со стандартной заливкой ошибок, зеленые кривые через ggplot2. Я уверен, что где-то в коде есть вариант, который я мог бы использовать, чтобы сделать это, но я еще не нашел его, или, возможно, есть другой порядок или шаги, которые я должен выполнить, чтобы получить зеленые кривые из ggplot вызов. Я обнаружил схожие проблемы при построении всего на одном фасете и использовании эстетики цвета или группы.

Любые предложения будут с благодарностью.

1 Ответ

8 голосов
/ 29 декабря 2011

Вы правы, что способ сделать это - подогнать модель за пределы ggplot2 , а затем рассчитать подходящие значения и интервалы, как вам нравится, и передать эти данные отдельно.

Один из способов достижения того, что вы описываете, будет выглядеть примерно так:

preds <- predict(g, newdata = new.data, type = 'response',se = TRUE)
new.data$pred.full <- preds$fit

new.data$ymin <- new.data$pred.full - 2*preds$se.fit
new.data$ymax <- new.data$pred.full + 2*preds$se.fit  

ggplot(df,aes(x = score, y = pass)) + 
    facet_wrap(~location) + 
    geom_point() + 
    geom_ribbon(data = new.data,aes(y = pred.full, ymin = ymin, ymax = ymax),alpha = 0.25) +
    geom_line(data = new.data,aes(y = pred.full),colour = "blue")

enter image description here

Это сопровождается обычными предупреждениями об интервалах для подгоночных значений: вы должны сделатьуверен, что интервал, который вы строите, это то, что вы действительно хотите.Существует много путаницы в «интервалах прогнозирования».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...