使用 ggplot2 叠加混合效应模型结果
Overlaying mixed effects model results with ggplot2
我在 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 是句子中倒数第三个音节)。此处的数据来自词汇声调语言,因此声调(所有低音/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 时,默认情况下该线是从一个点的上限连接到下一个点的下限(不在 median/midpoint)。感谢您的帮助。
(编辑: 正如 OP 指出的那样,他实际上确实在他的数据集中包含了一个 link。我很抱歉暗示他没有。 )
首先,如果您提供 minimal, complete, and verifiable example (MVCE). Look here 以获取有关如何最好地针对 R 做到这一点的信息,那么您将 获得更多 的好运。
由于缺少可使用的实际数据,我认为您的问题是您正在为 stat_summary
而不是 geom_pointrange
分解 x 轴。我从您 link 看到的情节中模拟了一个玩具示例以演示:
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))
现在,以下调用给我的结果类似于您 link编辑到的图表:
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 轴的 和 进行因数分解,我仍然会得到叠加结果。两者必须保持一致。
再次强调,如果您提供代码,我们可以 copy/paste 进入 R 会话并查看您所看到的内容,那么我怎么强调它对整个过程的帮助都不为过。希望这对您有所帮助,但如果您帮助我们帮助您,一切都会更顺利(更快)。
我在 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 是句子中倒数第三个音节)。此处的数据来自词汇声调语言,因此声调(所有低音/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 时,默认情况下该线是从一个点的上限连接到下一个点的下限(不在 median/midpoint)。感谢您的帮助。
(编辑: 正如 OP 指出的那样,他实际上确实在他的数据集中包含了一个 link。我很抱歉暗示他没有。 )
首先,如果您提供 minimal, complete, and verifiable example (MVCE). Look here 以获取有关如何最好地针对 R 做到这一点的信息,那么您将 获得更多 的好运。
由于缺少可使用的实际数据,我认为您的问题是您正在为 stat_summary
而不是 geom_pointrange
分解 x 轴。我从您 link 看到的情节中模拟了一个玩具示例以演示:
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))
现在,以下调用给我的结果类似于您 link编辑到的图表:
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 轴的 和 进行因数分解,我仍然会得到叠加结果。两者必须保持一致。
再次强调,如果您提供代码,我们可以 copy/paste 进入 R 会话并查看您所看到的内容,那么我怎么强调它对整个过程的帮助都不为过。希望这对您有所帮助,但如果您帮助我们帮助您,一切都会更顺利(更快)。