Ho avuto esperienze fantastiche per chiedere aiuto qui prima e spero di ricevere ancora aiuto.Una trama bruciante di soli effetti "significativi" casuali da un modello a effetti misti
Sto stimando un modello di effetti misti piuttosto ampio in cui uno degli effetti casuali ha oltre 150 livelli diversi. Ciò renderebbe la trama di un bruco standard piuttosto illeggibile.
Vorrei, se possibile, ottenere una trama di bruco di solo i livelli dell'effetto casuale che sono, per mancanza di termini migliori, "significativi". Cioè: voglio una trama di bruco in cui sia l'intercetta casuale o la pendenza casuale per un coefficiente variabile abbia un "intervallo di confidenza" (so che non è proprio quello che è) che non include zero.
Considerare questo modello standard dai dati sleepstudy
standard con lme4
.
library(lme4)
fit <- lmer(Reaction ~ Days + (Days|Subject), sleepstudy)
ggCaterpillar(ranef(fit,condVar=TRUE), QQ=FALSE, likeDotplot=TRUE, reorder=FALSE)[["Subject"]]
vorrei ottenere questa trama bruco.
La trama bruco che uso viene da this code. Si noti che io tendo ad usare limiti meno conservativi per gli intervalli (cioè 1.645 * se e non 1.96 * se).
Fondamentalmente, io voglio una trama bruco che sarebbe solo includere i livelli per 308, 309, 310, 330, 331, 335, 337, 349, 350, 352, e 370, perché quei livelli avevano entrambi intercetta o pendenze i cui intervalli non includevano zero. Lo chiedo perché la mia trama di bruco di oltre 150 livelli diversi è un po 'illeggibile e penso che potrebbe essere una soluzione utile.
Segue il codice riproducibile. Apprezzo sinceramente qualsiasi aiuto.
# 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")
"Ho finito per ottenere un po 'portato via ..." Eh, eh. Non stai scherzando. Risposta fantastica! – eipi10
Heh, ho letto le bacheche del messaggio 'lme4' abbastanza a lungo da sapere meglio che usare seriamente" intervalli di confidenza "e" significativi "nel contesto di effetti casuali. : P E questa è stata una risposta eccellente. Neanche io sapevo del pacchetto 'broom'. Grazie ancora! – steve
Ben questo è fantastico! Ti dispiacerebbe se lo aggiungessi ai tuoi numerosi contributi di scopa? –