【发布时间】:2019-06-26 09:30:27
【问题描述】:
我想知道为什么在从线性混合效应模型计算 95% 置信带时,ggplot2 会产生比手动计算时更窄的带,例如在这里遵循 Ben Bolker 的方法confidence intervals on predictions。也就是说,ggplot2 是否给出了不准确的模型表示?
这是一个使用 sleepstudy 数据集的可重现示例(修改为在结构上类似于我正在处理的 df):
data("sleepstudy") # load dataset
height <- seq(165, 185, length.out = 18) # create vector called height
Treatment <- rep(c("Control", "Drug"), 9) # create vector called treatment
Subject <- levels(sleepstudy$Subject) # get vector of Subject
ht.subject <- data.frame(height, Subject, Treatment)
sleepstudy <- dplyr::left_join(sleepstudy, ht.subject, by="Subject") # Append df so that each subject has its own height and treatment
sleepstudy$Treatment <- as.factor(sleepstudy$Treatment)
生成模型,将预测添加到原始 df 并绘制
m.sleep <- lmer(Reaction ~ Treatment*height + (1 + Days|Subject), data=sleepstudy)
sleepstudy$pred <- predict(m.sleep)
ggplot(sleepstudy, aes(height, pred, col=Treatment)) + geom_smooth(method="lm")[2]
按照 Bolker 方法计算置信区间
newdf <- expand.grid(height=seq(165, 185, 1),
Treatment=c("Control","Drug"))
newdf$Reaction <- predict(m.sleep, newdf, re.form=NA)
modmat <- model.matrix(terms(m.sleep), newdf)
pvar1 <- diag(modmat %*% tcrossprod(vcov(m.sleep), modmat))
tvar1 <- pvar1+VarCorr(m.sleep)$Subject[1]
cmult <- 1.96
newdf <- data.frame(newdf
,plo = newdf$Reaction-cmult*sqrt(pvar1)
,phi = newdf$Reaction+cmult*sqrt(pvar1)
,tlo = newdf$Reaction-cmult*sqrt(tvar1)
,thi = newdf$Reaction+cmult*sqrt(tvar1))
# plot confidence intervals
ggplot(newdf, aes(x=height, y=Reaction, colour=Treatment)) +
geom_point() +
geom_ribbon(aes(ymin=plo, ymax=phi, fill=Treatment), alpha=0.4)[2]
【问题讨论】:
-
这对于 stats.stackexchange.com 来说可能是一个很好的 Q。在浏览了您的代码和链接的 GitHub 一分钟后:Bolker 的方法是围绕预测生成 置信度 区间,还是生成 预测 区间?大多数统计软件都区分这两者。
-
我认为这是为了围绕预测生成置信区间,但也许我在这方面弄错了。我会按照你的建议做,然后在 stats.stackexchange 上重新发布。
标签: r ggplot2 lme4 mixed-models confidence-interval