2017-10-05 93 views
0

我在ggplot2中显示我的lmer模型的结果时遇到了一些困难。我特别感兴趣的是在观察数据之上显示预测的回归线。我对这个(语音)数据运行的模型11聚物这里是下面:使用ggplot2覆盖混合效果模型结果

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是否落在这种语言的句子中,如果是这样,多少,以及语调是否重要。对我来说想想一种在这里生产玩具数据集的方法有点困难,但是可以下载这些数据(文件为437K)here

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

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

编辑:由于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会话并查看您所看到的内容,那么我对它的整个过程有多大帮助。希望这可以帮助你,但如果你帮助我们帮助你,它会更加顺利(并且很快)。

+0

谢谢你的评论,安德鲁。按照您的建议,我可以很好地工作。我没有意识到,通过分解原始数据中的参数(但不是拟合的数据),我将无法重叠绘图。我想你可能错过了我包括我的数据集的事实(通过我的文章第二段中的链接)。再次感谢。 –

+0

对不起!我编辑了答案,指出了这一点。 –