2011-12-28 66 views
8

我正在一个逻辑回归模型与一个连续预测和一个分类预测与几个级别。我想使用ggplot2来呈现结果,并利用facet_wrap来显示分类预测变量每个级别的回归线。当我这样做时,我注意到由stat_smooth提供的拟合曲线仅考虑特定方面的数据,而不考虑整个数据集。这是一个很小的差异,但是当看到从predict.glm返回的预测值的情节时,这是一个值得注意的区别。ggplot2:stat_smooth逻辑结果与facet_wrap返回'全'或'子集'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调用中获得绿色曲线。将所有内容绘制在一个面上并使用颜色或组美学时,我发现了类似的问题。

任何建议将不胜感激。

回答

8

你是对的,这样做是为了适应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

这带有关于拟合值的时间间隔一般的警告:这是由你来确保该你正在绘制的间隔是你真正想要的。关于“预测间隔”往往存在很多混淆。