我在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时,默认情况下,该线从一个点的上限连接到下一个点的下限(不在中位数) /中点)。谢谢你的帮助。
答案 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))
但是,如果我删除了初始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))
请注意,如果我将x轴的两个分解,我仍会得到重叠结果。这两者必须保持一致。
同样,如果您提供我们可以复制/粘贴到R会话中的代码并查看您所看到的内容,我无法强调它对整个过程有多大帮助。希望这可以帮助你,但如果你帮助我们,你会更顺利(并且很快)。