绘制适当的混合模型回归斜率

时间:2013-12-13 09:14:03

标签: r ggplot2 lme4 mixed-models

我有一个数据集,我正在使用lme4进行混合模型回归。

dat <- structure(list(dv280 = c(41L, 68L, 0L, 6L, 20L, 30L, 8L, 1L, 
15L, NA, 59L, 5L, 21L, 41L, 11L, 14L, -2L, 20L, 25L, 33L, 32L, 
30L, 68L, 16L, 11L, -1L, 8L, 0L), v0 = c(55L, 90L, 30L, 23L, 
74L, 48L, 25L, 25L, 46L, NA, 60L, 69L, 55L, 41L, 34L, 41L, 53L, 
76L, 72L, 64L, 34L, 37L, 75L, 21L, 26L, 14L, 24L, 19L), treatment = structure(c(2L, 
1L, 1L, 2L, 2L, 1L, 2L, 1L, 1L, 2L, 2L, 1L, 1L, 2L, 2L, 1L, 1L, 
2L, 1L, 2L, 2L, 1L, 2L, 1L, 1L, 2L, 2L, 1L), .Label = c("hc", 
"nhc"), class = "factor"), cse = structure(c(2, 2, 6, 6, -4, 
-4, 5, 5, NA, NA, -4, -4, -3, -3, -2, -2, 3, 3, 2, 2, -4, -4, 
-7, -7, 4, 4, 2, 2), .Dim = c(28L, 1L)), pp = structure(c(1L, 
1L, 2L, 2L, 3L, 3L, 4L, 4L, 5L, 5L, 6L, 6L, 7L, 7L, 8L, 8L, 9L, 
9L, 10L, 10L, 11L, 11L, 12L, 12L, 13L, 13L, 14L, 14L), .Label = c("j.1", 
"j.3", "j.6", "j.11", "j.13", "j.16", "j.17", "j.18", "j.19", 
"j.22", "j.24", "j.30", "j.32", "j.36"), class = "factor")), .Names = c("dv280", 
"v0", "treatment", "cse", "pp"), row.names = c(NA, 28L), class = "data.frame")
head(dat)
require(lme4)
m <- lmer(dv280 ~ 1 + v0:treatment + cse + (0 + v0 | pp), data=dat, REML=TRUE)
summary(m)

接下来我想绘制得到的拟合,所以使用http://glmm.wikidot.com/faq中的示例代码我生成了原始值的预测。

newdat <- data.frame(
  v0=dat$v0,
  treatment=dat$treatment, 
  cse=dat$cse,
  dv280=0)
newdat <- newdat[-c(9,10),]
mm <- model.matrix(terms(m), newdat)
newdat$dv280 <- mm %*% fixef(m)
pvar1 <- diag(mm %*% tcrossprod(vcov(m), mm))
tvar1 <- pvar1 + VarCorr(m)$pp[1]
newdat <- data.frame(newdat, plo=newdat$dv280 - 2 * sqrt(pvar1), 
                     phi=newdat$dv280 + 2 * sqrt(pvar1), 
                     tlo=newdat$dv280 - 2 * sqrt(tvar1), 
                     thi=newdat$dv280 + 2 * sqrt(tvar1)) 

使用ggplot很容易绘制:

p <- ggplot(data=newdat, mapping=aes(x=v0, y=dv280, colour=treatment)) +
  geom_point() +
  geom_smooth(method='lm', se=TRUE) +
  scale_colour_discrete(guide=guide_legend(title.position='left', title.hjust=1))
p + .mytheme + coord_cartesian(xlim=c(-20,100)) +     
  geom_hline(yintercept=0, colour='gray35', linetype='dashed') +
  geom_vline(xintercept=0, colour='gray35', linetype='dashed') 

但是如图所示,ggplot绘制的回归线的截距与回归的估计截距相比是不对的;至少这是nhc线的情况,它显然是负截距,而常见的估计截距是0.54。

Plot

我的错误很容易(我推测):使用geom_smooth会产生与回归所说的不同的拟合,因为geom_smooth在每次处理时分别获取数据,并且在没有拟合模型的上下文的情况下也是面值。但我不知道如何正确地绘制线条。

1 个答案:

答案 0 :(得分:1)

您需要考虑cse的效果。如果我在cse=0中设置newdat,那么这些行将通过拦截:

p <- ggplot(data=newdat, mapping=aes(x=v0, y=dv280, colour=treatment)) +
  geom_point() +
  geom_smooth(method='lm', se=TRUE, fullrange=TRUE) +
  scale_colour_discrete(guide=guide_legend(title.position='left', title.hjust=1))
p + theme_bw() + coord_cartesian(xlim=c(-1,1), ylim=c(0.4,0.65)) +     
  geom_hline(yintercept=0, colour='gray35', linetype='dashed') +
  geom_vline(xintercept=0, colour='gray35', linetype='dashed') 

enter image description here

请注意,通常不建议在没有相应主效应的模型中包含交互。

修改

根据您的评论,您可能需要这样的内容(使用原始newdat):

p <- ggplot(data=newdat, mapping=aes(x=v0, y=dv280, ymin=tlo, ymax=thi, colour=treatment, fill=treatment)) +
  geom_ribbon(alpha=0.2, aes(colour=NULL)) +
  geom_point() +
  geom_line() +
  scale_colour_discrete(guide=guide_legend(title.position='left', title.hjust=1))
p + theme_bw() +   
  geom_hline(yintercept=0, colour='gray35', linetype='dashed') +
  geom_vline(xintercept=0, colour='gray35', linetype='dashed') 

enter image description here

然而,这个图似乎不太有用(特别是点之间的线),因为它只描绘了dv280-v0平面上的投影,你甚至看不到这种线性关系。