Построение коэффициентов регрессии смешанных моделей в R

Я с трудом пытаюсь создать сетку с графиком из четырех коэффициентов из четырех не вложенных линейных моделей случайных эффектов, используя 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.1, ggplot2_2.1.0, lme4_1.1-12, sjmisc_2.0.1, gridExtra_2.2.1, dplyr_0.5.0,

2 ответа

Решение

Возвращаемые значения функций sjPlot возвращают как фрейм данных, так и объект plot, поэтому вам необходимо получить доступ к объекту plot в аргументах:

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

введите описание изображения здесь

Изменить: Я видел, что вы нашли ошибку в sjp.lmm() функция и может это исправить. Если вы загрузите последний снимок с GitHub ( https://github.com/sjPlot/devel), это будет работать:

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

введите описание изображения здесь

Я ничего об этом не знаю sjPlot класс, но, похоже, он связывает кучу вещей в сюжет в списке. plot_grid, grid.arrange и тому подобное не знают, как справиться с дополнительными вещами, но они могут справиться с ggplot часть, которая называется plot:

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

Я немного удивлен, потому что кажется, что, по крайней мере, некоторая информация в комплекте является дублирующей. Например, plot.1$data имеет небольшой фрейм данных, который кажется копией (или подмножеством?) данных, которые уже связаны с графиком, plot.1$plot$data, Может быть, все по-другому, и для более сложных случаев есть веская причина.

Другие вопросы по тегам