В R, построение случайных эффектов из lmer (lme4 package) с помощью qqmath или dotplot: как заставить его выглядеть причудливо?
функция qqmath делает большие графики caterpillar случайных эффектов, используя выход из пакета lmer. То есть qqmath отлично справляется с построением перехватов из иерархической модели с их ошибками вокруг точечной оценки. Ниже приведен пример функций lmer и qqmath, использующих встроенные данные в пакете lme4, называемом Dyestuff. Код создаст иерархическую модель и хороший график, используя функцию ggmath.
library("lme4")
data(package = "lme4")
# Dyestuff
# a balanced one-way classiï¬cation of Yield
# from samples produced from six Batches
summary(Dyestuff)
# Batch is an example of a random effect
# Fit 1-way random effects linear model
fit1 <- lmer(Yield ~ 1 + (1|Batch), Dyestuff)
summary(fit1)
coef(fit1) #intercept for each level in Batch
# qqplot of the random effects with their variances
qqmath(ranef(fit1, postVar = TRUE), strip = FALSE)$Batch
последняя строка кода создает действительно хороший график каждого перехвата с ошибкой вокруг каждой оценки. Но форматирование функции qqmath кажется очень сложным, и я изо всех сил пытаюсь отформатировать сюжет. Я придумал несколько вопросов, на которые я не могу ответить, и я думаю, что другие также могут извлечь выгоду, если они используют комбинацию lmer/qqmath:
- есть ли способ взять функцию qqmath выше и добавить несколько опции, например, сделать некоторые точки пустыми по сравнению с заполненными, или разные цвета для разных точек? Например, можете ли вы сделать точки для A,B и C пакетной переменной заполненными, но затем остальные точки пустыми?
- можно ли добавить метки оси для каждой точки (возможно по например, верхняя или правая ось y)?
- мои данные ближе к 45 перехватов, так что можно добавить расстояние между метками, чтобы они не сталкивались друг с другом? В основном, меня интересует различение / маркировка между точками на этот график, который кажется громоздким / невозможным в функции ggmath.
до сих пор добавление любой дополнительной опции в функцию qqmath приводит к ошибкам, где я не получил бы ошибок, если бы это был стандартный график, поэтому я в недоумении.
кроме того, если вы чувствуете, что есть лучший пакет/функция для построения перехватов с выхода lmer, я хотел бы это услышать! (например, можете ли вы сделать точки 1-3 С помощью dotplot?)
спасибо.
EDIT: я также открыт к альтернативному dotplot, если он может быть разумно отформатирован. Мне просто нравится внешний вид сюжета ggmath, поэтому я начинаю с вопроса об этом.
3 ответов
одна из возможностей - использовать библиотеку ggplot2
нарисовать подобный график и затем вы можете настроить внешний вид вашего участка.
во-первых,
ответ Дидзиса велик! Просто, чтобы немного завернуть его, я помещаю его в свою собственную функцию, которая ведет себя так же, как qqmath.ranef.mer()
и dotplot.ranef.mer()
. В дополнение к ответу Дидзиса он также обрабатывает модели с несколькими коррелированными случайными эффектами (например,qqmath()
и dotplot()
do). Сравнение с qqmath()
:
require(lme4) ## for lmer(), sleepstudy
require(lattice) ## for dotplot()
fit <- lmer(Reaction ~ Days + (Days|Subject), sleepstudy)
ggCaterpillar(ranef(fit, condVar=TRUE)) ## using ggplot2
qqmath(ranef(fit, condVar=TRUE)) ## for comparison
сравнение dotplot()
:
ggCaterpillar(ranef(fit, condVar=TRUE), QQ=FALSE)
dotplot(ranef(fit, condVar=TRUE))
иногда это может быть полезно иметь разные масштабы для случайные эффекты-то, что dotplot()
принудительно. Когда я попытался расслабиться, мне пришлось изменить фасетку (см. Это ответ).
ggCaterpillar(ranef(fit, condVar=TRUE), QQ=FALSE, likeDotplot=FALSE)
## re = object of class ranef.mer
ggCaterpillar <- function(re, QQ=TRUE, likeDotplot=TRUE) {
require(ggplot2)
f <- function(x) {
pv <- attr(x, "postVar")
cols <- 1:(dim(pv)[1])
se <- unlist(lapply(cols, function(i) sqrt(pv[i, i, ])))
ord <- unlist(lapply(x, order)) + rep((0:(ncol(x) - 1)) * nrow(x), each=nrow(x))
pDf <- data.frame(y=unlist(x)[ord],
ci=1.96*se[ord],
nQQ=rep(qnorm(ppoints(nrow(x))), ncol(x)),
ID=factor(rep(rownames(x), ncol(x))[ord], levels=rownames(x)[ord]),
ind=gl(ncol(x), nrow(x), labels=names(x)))
if(QQ) { ## normal QQ-plot
p <- ggplot(pDf, aes(nQQ, y))
p <- p + facet_wrap(~ ind, scales="free")
p <- p + xlab("Standard normal quantiles") + ylab("Random effect quantiles")
} else { ## caterpillar dotplot
p <- ggplot(pDf, aes(ID, y)) + coord_flip()
if(likeDotplot) { ## imitate dotplot() -> same scales for random effects
p <- p + facet_wrap(~ ind)
} else { ## different scales for random effects
p <- p + facet_grid(ind ~ ., scales="free_y")
}
p <- p + xlab("Levels") + ylab("Random effects")
}
p <- p + theme(legend.position="none")
p <- p + geom_hline(yintercept=0)
p <- p + geom_errorbar(aes(ymin=y-ci, ymax=y+ci), width=0, colour="black")
p <- p + geom_point(aes(size=1.2), colour="blue")
return(p)
}
lapply(re, f)
}
другой способ сделать это-извлечь смоделированные значения из распределения каждого из случайных эффектов и построить их. С помощью merTools
пакет, можно легко получить моделирование от lmer
или glmer
объект, и построить их.
library(lme4); library(merTools) ## for lmer(), sleepstudy
fit <- lmer(Reaction ~ Days + (Days|Subject), sleepstudy)
randoms <- REsim(fit, n.sims = 500)
randoms
теперь объект, который выглядит так:
head(randoms)
groupFctr groupID term mean median sd
1 Subject 308 (Intercept) 3.083375 2.214805 14.79050
2 Subject 309 (Intercept) -39.382557 -38.607697 12.68987
3 Subject 310 (Intercept) -37.314979 -38.107747 12.53729
4 Subject 330 (Intercept) 22.234687 21.048882 11.51082
5 Subject 331 (Intercept) 21.418040 21.122913 13.17926
6 Subject 332 (Intercept) 11.371621 12.238580 12.65172
он предоставляет имя группирующего фактора, уровень фактора, для которого мы получаем оценку, термин в модели и среднее, медиана и стандартное отклонение моделируемого значения. Мы можем использовать это для создания графика гусеницы, аналогичного приведенным выше:
plotREsim(randoms)
что производит:
одна хорошая особенность заключается в том, что значения, имеющие доверительный интервал, который не перекрывает ноль, выделены черным цветом. Вы можете изменить ширину интервала, используя до plotREsim
делать более широкие или более узкие доверительные интервалы основанные на твои нужды.