在R中绘制混合模型的回归系数

时间:2016-11-11 11:09:44

标签: r ggplot2 lme4 sjplot

我很难尝试使用sj.plot包从四个非嵌套线性随机效应模型中生成一个具有四个系数图的网格。 我没有和这个包结婚,所以请随意建议其他路线(ggplot2解决方案优于coefplot2::coefplot2)。

所需输出:一个网格,其中四个系数的图彼此相邻。

再现模型:

data("sleepstudy")
sleepstudy$var2 <- rnorm(n=nrow(sleepstudy), mean=0, sd=1)
sleepstudy$var3 <- rnorm(n=nrow(sleepstudy), mean=10, sd=5)
M1 <- lmer(Reaction ~ Days + (1|Subject), data=sleepstudy, REML = FALSE)
M2 <- lmer(Reaction ~ Days + var2 + (1|Subject), data=sleepstudy, REML = FALSE)
M3 <- lmer(Reaction ~ Days + var3 + (1|Subject), data=sleepstudy, REML = FALSE)
M4 <- lmer(Reaction ~ Days + var2 + var3 + (1|Subject), data=sleepstudy, REML = FALSE)

重现问题。尝试#1(sjp.lmm

> sjp.lmm(M1, M2, M3, M4)
Computing p-values via Kenward-Roger approximation. Use `p.kr = FALSE` if computation takes too long.
Computing p-values via Kenward-Roger approximation. Use `p.kr = FALSE` if computation takes too long.
Error in data.frame(betas, p = ps, pa = palpha, shape = pointshapes, grp = fitcnt,  : 
  arguments imply differing number of rows: 3, 2, 1

重现问题。尝试#2(sjp.lmer + plot_grid

plot.1 <- sjp.lmer(fit=M1,type="fe.std",
                   p.kr=FALSE,
                   sort.est = "sort.all",
                   y.offset = 0.4,
                   fade.ns = TRUE,
                   facet.grid = T)
plot.2 <- sjp.lmer(fit=M2,type="fe.std",
                   p.kr=FALSE,
                   sort.est = "sort.all",
                   y.offset = 0.4,
                   fade.ns = TRUE,
                   facet.grid = T)
plot.3 <- sjp.lmer(fit=M3,type="fe.std",
                   p.kr=FALSE,
                   sort.est = "sort.all",
                   y.offset = 0.4,
                   fade.ns = TRUE,
                   facet.grid = T)
plot.4 <- sjp.lmer(fit=M4,type="fe.std",
                   p.kr=FALSE,
                   sort.est = "sort.all",
                   y.offset = 0.4,
                   fade.ns = TRUE,
                   facet.grid = T)
plot_grid(list(plot.1,plot.2,plot.3,plot.4))

> plot_grid(list(plot.1,plot.2,plot.3,plot.4))
Error in gList(list(wrapvp = list(x = 0.5, y = 0.5, width = 1, height = 1,  : 
  only 'grobs' allowed in "gList"

有没有办法获得这个情节? 版本:[6] sjPlot_2.1.1ggplot2_2.1.0lme4_1.1-12sjmisc_2.0.1gridExtra_2.2.1dplyr_0.5.0

2 个答案:

答案 0 :(得分:1)

sjPlot函数的返回值返回数据框和plot-object,因此您必须访问参数中的plot-object:

plot_grid(list(plot.1$plot, plot.2$plot, plot.3$plot, plot.4$plot))

enter image description here

修改 我看到你在sjp.lmm()函数中发现了一个错误,可以修复它。如果从GitHub(https://github.com/sjPlot/devel)下载最新快照,则可以使用:

sjp.lmm(M1, M2, M3, M4)

enter image description here

答案 1 :(得分:0)

我对这个sjPlot课程一无所知,但看起来它将一堆东西捆绑到列表中的情节中。 plot_gridgrid.arrange等不知道如何处理额外的内容,但他们可以处理ggplot部分,称为plot:< / p>

plot_grid(lapply(list(plot.1,plot.2,plot.3,plot.4), "[[", "plot"))

我有点意外,因为看起来至少有一些捆绑的信息是重复的。例如,plot.1$data有一个小数据框,它似乎是已经与图plot.1$plot$data捆绑在一起的数据的副本(或子集?)。也许它更加不同,在更复杂的情况下,它有充分的理由。