我正在一个逻辑回归模型与一个连续预测和一个分类预测与几个级别。我想使用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')
我注意到并感到担心的是缓解小B.红色曲线从模型的预测值只考虑一个地方看到的,而绿色曲线是使用全预测数据集。基于数据子集的模型与stat_smooth
的图匹配。
我想通过标准误差阴影绘制绿色曲线,通过ggplot2
。我确信在我可以使用的代码中有一个选项可以做到这一点,但是我还没有找到它,或者我可能需要按照不同的顺序或步骤从ggplot
调用中获得绿色曲线。将所有内容绘制在一个面上并使用颜色或组美学时,我发现了类似的问题。
任何建议将不胜感激。