У меня были большие впечатления, прося о помощи здесь раньше, и я надеюсь снова получить помощь.Гусеничный сюжет только «значительных» случайных эффектов из модели смешанных эффектов
Я оцениваю довольно большую модель смешанных эффектов, в которой один из случайных эффектов имеет более 150 различных уровней. Это сделало бы стандартный гусеничный сюжет довольно нечитаемым.
Я хотел бы, если вообще возможно, получить участок гусеницы только уровней случайного эффекта, которые являются для отсутствия лучшего термина «значительными». То есть: мне нужен гусеничный график, в котором либо случайный перехват , либо случайный уклон для изменяющегося коэффициента имеет «доверительный интервал» (я знаю, что это не совсем то, что это), который не включает нуль.
Рассмотрите эту стандартную модель из данных sleepstudy
, которая является стандартной с lme4
.
library(lme4)
fit <- lmer(Reaction ~ Days + (Days|Subject), sleepstudy)
ggCaterpillar(ranef(fit,condVar=TRUE), QQ=FALSE, likeDotplot=TRUE, reorder=FALSE)[["Subject"]]
Я бы выбрал этот участок гусеницы.
Гусеница участок я использую приходит от this code. Заметьте, я склонен использовать менее консервативные оценки для интервалов (то есть 1,645 * se, а не 1,96 * se).
В принципе, я хочу гусеница сюжет, который будет содержать только уровни для 308, 309, 310, 330, 331, 335, 337, 349, 350, 352, и 370, так как эти уровни были либо перехватывает или склоны интервалы которых не равны нулю. Я спрашиваю, потому что мой гусеничный сюжет более 150 разных уровней нечитабельен, и я думаю, что это может быть полезным решением.
Воспроизводимый код следует. Я искренне ценю любую помощь.
# https://stackoverflow.com/questions/34120578/how-can-i-sort-random-effects-by-value-of-the-random-effect-not-the-intercept
ggCaterpillar <- function(re, QQ=TRUE, likeDotplot=TRUE, reorder=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, ])))
if (reorder) {
ord <- unlist(lapply(x, order)) + rep((0:(ncol(x) - 1)) * nrow(x), each=nrow(x))
pDf <- data.frame(y=unlist(x)[ord],
ci=1.645*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)))
} else {
pDf <- data.frame(y=unlist(x),
ci=1.645*se,
nQQ=rep(qnorm(ppoints(nrow(x))), ncol(x)),
ID=factor(rep(rownames(x), ncol(x)), levels=rownames(x)),
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 of the Random Effect") + ylab("Random Effect")
}
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)
}
library(lme4)
fit <- lmer(Reaction ~ Days + (Days|Subject), sleepstudy)
ggCaterpillar(ranef(fit,condVar=TRUE), QQ=FALSE, likeDotplot=TRUE, reorder=FALSE)[["Subject"]]
ggsave(file="sleepstudy.png")
"Я в конечном итоге получить немного увлекся ..." Хех, хех. Вы не шутите. Удивительный ответ! – eipi10
Хех, я читал доски сообщений 'lme4' достаточно долго, чтобы лучше знать, чем серьезно использовать« доверительные интервалы »и« значимые »в контексте случайных эффектов. : P И это был отличный ответ. Я тоже не знал о пакете «метлы». Еще раз спасибо! – steve
Бен это здорово! Не возражаете, добавлю ли я его к вашим многочисленным взносам? –