r – 使用ggplot2绘制混合效果模型

以下代码绘制混合效果模型的随机效果:

mtcarsSub <- mtcars[,c("wt", "drat", "cyl")]

library(lme4)
mtcarsME <- lmer(drat ~ (1|cyl) + wt, data=mtcarsSub)

mtcarsSub$fixed.effect <- predict(mtcarsME)

library(plyr)
l_ply(list(4, 6, 8), function(x) mtcarsSub[[ paste0("random.effect.cyl", x) ]] <<- mtcarsSub$fixed.effect + ranef(mtcarsME)$cyl[as.character(x),])

library(ggplot2)
ggplot(mtcarsSub, aes(wt, drat, color=factor(cyl))) + 
  geom_point() +
  geom_line(aes(wt, fixed.effect), color="black", size=2) +
  geom_line(aes(wt, random.effect.cyl4), size=2) +
  geom_line(aes(wt, random.effect.cyl6), size=2) +
  geom_line(aes(wt, random.effect.cyl8), size=2)

我如何以编程方式使每个随机效果线与为cyl显示的颜色相同?因此,cyl的4级随机效应线应为红色,cyl的6级应为绿色,cyl的8级应为蓝色.我不想在geom_line()中指定color =“red”等.

最佳答案 我建议为随机效果制作新的数据框.为此我使用函数ldply()和你为每个级别计算随机效果的函数.此外,在这个新数据框中添加了列wt和cyl. wt将包含来自每个级别重复的mtcarsSub数据帧的所有wt值. cyl将包含值4,6和8.

mt.rand<-ldply(list(4,6,8), function(x) data.frame(
  wt=mtcarsSub$wt,
  cyl=x,
  rand=mtcarsSub$fixed.effect + ranef(mtcarsME)$cyl[as.character(x),]))

现在用于绘图在一个geom_line()调用中使用新数据框.由于新数据框也有圆柱,因此将为其分配颜色.

ggplot(mtcarsSub, aes(wt, drat, color=factor(cyl))) + 
  geom_point() +
  geom_line(aes(wt, fixed.effect), color="black", size=2)+
  geom_line(data=mt.rand,aes(wt,rand),size=2)
点赞