Effects
package bietet eine sehr schnelle und bequeme Möglichkeit , lineare Mischeffekt-Modellergebnisse zu zeichnen, die mit lme4
package erhalten wurden . Die effect
Funktion berechnet Konfidenzintervalle (CIs) sehr schnell, aber wie vertrauenswürdig sind diese Konfidenzintervalle?
Beispielsweise:
library(lme4)
library(effects)
library(ggplot)
data(Pastes)
fm1 <- lmer(strength ~ batch + (1 | cask), Pastes)
effs <- as.data.frame(effect(c("batch"), fm1))
ggplot(effs, aes(x = batch, y = fit, ymin = lower, ymax = upper)) +
geom_rect(xmax = Inf, xmin = -Inf, ymin = effs[effs$batch == "A", "lower"],
ymax = effs[effs$batch == "A", "upper"], alpha = 0.5, fill = "grey") +
geom_errorbar(width = 0.2) + geom_point() + theme_bw()
Gemäß den mit effects
package berechneten CIs überschneidet sich Charge "E" nicht mit Charge "A".
Wenn ich dasselbe mit der confint.merMod
Funktion und der Standardmethode versuche :
a <- fixef(fm1)
b <- confint(fm1)
# Computing profile confidence intervals ...
# There were 26 warnings (use warnings() to see them)
b <- data.frame(b)
b <- b[-1:-2,]
b1 <- b[[1]]
b2 <- b[[2]]
dt <- data.frame(fit = c(a[1], a[1] + a[2:length(a)]),
lower = c(b1[1], b1[1] + b1[2:length(b1)]),
upper = c(b2[1], b2[1] + b2[2:length(b2)]) )
dt$batch <- LETTERS[1:nrow(dt)]
ggplot(dt, aes(x = batch, y = fit, ymin = lower, ymax = upper)) +
geom_rect(xmax = Inf, xmin = -Inf, ymin = dt[dt$batch == "A", "lower"],
ymax = dt[dt$batch == "A", "upper"], alpha = 0.5, fill = "grey") +
geom_errorbar(width = 0.2) + geom_point() + theme_bw()
Ich sehe, dass sich alle CIs überschneiden. Ich erhalte auch Warnungen, die darauf hinweisen, dass die Funktion keine vertrauenswürdigen CIs berechnen konnte. Dieses Beispiel und mein tatsächlicher Datensatz lassen vermuten, dass das effects
Paket Verknüpfungen in der CI-Berechnung enthält, die möglicherweise nicht vollständig von den Statistikern genehmigt wurden. Wie vertrauenswürdig sind die von der effect
Funktion zurückgegebenen CIs aus dem effects
Paket für lmer
Objekte?
Was habe ich versucht: Beim Blick in den Quellcode ist mir aufgefallen, dass die effect
Funktion von der Funktion abhängt Effect.merMod
, die wiederum zur Effect.mer
Funktion führt, die so aussieht:
effects:::Effect.mer
function (focal.predictors, mod, ...)
{
result <- Effect(focal.predictors, mer.to.glm(mod), ...)
result$formula <- as.formula(formula(mod))
result
}
<environment: namespace:effects>
mer.to.glm
Die Funktion scheint die Varianz-Covariate-Matrix aus dem lmer
Objekt zu berechnen :
effects:::mer.to.glm
function (mod)
{
...
mod2$vcov <- as.matrix(vcov(mod))
...
mod2
}
Dies wiederum wird wahrscheinlich in der Effect.default
Funktion zur Berechnung von CIs verwendet (ich habe diesen Teil möglicherweise falsch verstanden):
effects:::Effect.default
...
z <- qnorm(1 - (1 - confidence.level)/2)
V <- vcov.(mod)
eff.vcov <- mod.matrix %*% V %*% t(mod.matrix)
rownames(eff.vcov) <- colnames(eff.vcov) <- NULL
var <- diag(eff.vcov)
result$vcov <- eff.vcov
result$se <- sqrt(var)
result$lower <- effect - z * result$se
result$upper <- effect + z * result$se
...
Ich weiß nicht genug über LMMs, um beurteilen zu können, ob dies ein richtiger Ansatz ist, aber angesichts der Diskussion um die Konfidenzintervallberechnung für LMMs erscheint dieser Ansatz verdächtig einfach.