使用ggplot2叠加混合效果模型结果

时间:2017-10-05 20:30:23

标签: ggplot2 predict lme4

我在ggplot2中显示我的lmer模型的结果时遇到了一些困难。我特别感兴趣的是在观察数据之上显示预测的回归线。我在这个(语音)数据上运行的lmer模型如下:

lmer.declination <- lmer(zlogF0_m60~Center.syll*Tone + (1|Trial) + (1+Tone|Speaker) + (1|Utterance.num), data=data)

这里的因变量是基频(F0),在一个音节的中间60%被归一化和平均。固定效果是音节数(Center.syll),从句子末尾向后计数(例如-2是句子中的第3个最后一个音节)。这里的数据来自词汇语言,所以音调(所有低音/ 1 /,所有中音/ 3 /和所有高音/ 4 /)都是离散的固定效果。实验问题是F0是否落在这种语言的句子中,如果是这样,是多少,以及音调是否重要。我想到一种在这里制作玩具数据集的方法有点困难,但数据可以下载here(437K文件)。

为了提取模型拟合,我使用了效果包并将输出转换为数据框。

ex <- Effect(c("Center.syll","Tone"),lmer.declination)
ex.df <- as.data.frame(ex)

我使用ggplot2绘制数据,使用以下代码:

t.plot <- ggplot(data, aes(factor(Center.syll), zlogF0_m60, group=Tone, color=Tone)) + stat_summary(fun.data = mean_cl_boot, geom = "smooth") + ylab("Normalized log(F0)") + xlab("Syllable number") + ggtitle("F0 change across utterances with identical level tones, medial 60% of vowel") + geom_pointrange(data=ex.df, mapping=aes(x=Center.syll, y=fit, ymin=lower, ymax=upper)) + theme_bw()
t.plot

这会产生以下情节:

Predicted trajectories and observed trajectories

预测值显示在观察数据的左侧,而不是覆盖在数据本身上。无论我怎样尝试,我都无法让他们在观察到的数据上重叠。理想情况下,我想绘制一条线而不是一个点范围,但是当我尝试使用geom_line时,默认情况下,该线从一个点的上限连接到下一个点的下限(不在中位数) /中点)。谢谢你的帮助。

1 个答案:

答案 0 :(得分:0)

编辑:正如OP指出的那样,他确实包含了一个指向他数据集的链接。我很抱歉暗示他没有。)

首先,如果您提供minimal, complete, and verifiable example (MVCE),您将获得很多更好的运气获得有用的回复。请查看here,了解有关如何最好地为R做这件事的信息。

缺少您要使用的实际数据,我相信您的问题是您要为stat_summary分析x轴,而不是geom_pointrange。我嘲笑了你所链接的情节中的玩具示例,以便证明:

dat1 <- data.frame(x=c(-6:0, -5:0, -4:0),
                   y=c(-0.25, -0.5, -0.6, -0.75, -0.8, -0.8, -1.5,
                       0.5, 0.45, 0.4, 0.2, 0.1, 0,
                       0.5, 0.9, 0.7, 0.6, 1.1),
                   z=c(rep('a', 7), rep('b', 6), rep('c', 5)))

dat2 <- data.frame(x=dat1$x,
                   y=dat1$y + runif(18, -0.2, 0.2),
                   z=dat1$z,
                   upper=dat1$y + 0.3 + runif(18, -0.1, 0.1),
                   lower=dat1$y - 0.3 + runif(18, -0.1, 0.1))

现在,以下调用给出了与您链接的图表类似的结果:

ggplot(dat1, aes(factor(x), # note x being factored here
                 y, group=z, color=z)) +
  geom_line() + # (this is a place-holder for your stat_summary)
  geom_pointrange(data=dat2,
                  mapping=aes(x=x, # but x not being factored here
                              y=y, ymin=lower, ymax=upper))

Replicated plot

但是,如果我删除了初始x值的因式分解,我得到的线和点范围重叠:

ggplot(dat1, aes(x, # no more factoring here
                 y, group=z, color=z)) +
  geom_line() +
  geom_pointrange(data=dat2,
                  mapping=aes(x=x, y=y, ymin=lower, ymax=upper))

Fixed plot

请注意,如果我将x轴的两个分解,我仍会得到重叠结果。这两者必须保持一致。

同样,如果您提供我们可以复制/粘贴到R会话中的代码并查看您所看到的内容,我无法强调它对整个过程有多大帮助。希望这可以帮助你,但如果你帮助我们,你会更顺利(并且很快)。