Puede probar la importancia de los parámetros del modelo con la ayuda de intervalos de confianza estimados para los que el paquete lme4 tiene la confint.merMod
función.
bootstrapping (ver por ejemplo Intervalo de confianza de bootstrap )
> confint(m, method="boot", nsim=500, oldNames= FALSE)
Computing bootstrap confidence intervals ...
2.5 % 97.5 %
sd_(Intercept)|participant_id 0.32764600 0.64763277
cor_conditionexperimental.(Intercept)|participant_id -1.00000000 1.00000000
sd_conditionexperimental|participant_id 0.02249989 0.46871800
sigma 0.97933979 1.08314696
(Intercept) -0.29669088 0.06169473
conditionexperimental 0.26539992 0.60940435
perfil de probabilidad (ver por ejemplo ¿Cuál es la relación entre la probabilidad de perfil y los intervalos de confianza? )
> confint(m, method="profile", oldNames= FALSE)
Computing profile confidence intervals ...
2.5 % 97.5 %
sd_(Intercept)|participant_id 0.3490878 0.66714551
cor_conditionexperimental.(Intercept)|participant_id -1.0000000 1.00000000
sd_conditionexperimental|participant_id 0.0000000 0.49076950
sigma 0.9759407 1.08217870
(Intercept) -0.2999380 0.07194055
conditionexperimental 0.2707319 0.60727448
También hay un método, 'Wald'
pero esto se aplica solo a efectos fijos.
También existe algún tipo de expresión anova (razón de probabilidad) en el paquete lmerTest
que se nombra ranova
. Pero parece que esto no tiene sentido. La distribución de las diferencias en logLikelihood, cuando la hipótesis nula (varianza cero para el efecto aleatorio) es verdadera, no está distribuida por chi-cuadrado (posiblemente cuando el número de participantes y ensayos es alto, la prueba de razón de probabilidad podría tener sentido).
Varianza en grupos específicos
Para obtener resultados de varianza en grupos específicos, puede volver a parametrizar
# different model with alternative parameterization (and also correlation taken out)
fml1 <- "~ condition + (0 + control + experimental || participant_id) "
Donde agregamos dos columnas al marco de datos (esto solo es necesario si desea evaluar 'control' y 'experimental' no correlacionados, la función (0 + condition || participant_id)
no conduciría a la evaluación de los diferentes factores en condición como no correlacionados)
#adding extra columns for control and experimental
d <- cbind(d,as.numeric(d$condition=='control'))
d <- cbind(d,1-as.numeric(d$condition=='control'))
names(d)[c(4,5)] <- c("control","experimental")
Ahora lmer
dará variación para los diferentes grupos.
> m <- lmer(paste("sim_1 ", fml1), data=d)
> m
Linear mixed model fit by REML ['lmerModLmerTest']
Formula: paste("sim_1 ", fml1)
Data: d
REML criterion at convergence: 2408.186
Random effects:
Groups Name Std.Dev.
participant_id control 0.4963
participant_id.1 experimental 0.4554
Residual 1.0268
Number of obs: 800, groups: participant_id, 40
Fixed Effects:
(Intercept) conditionexperimental
-0.114 0.439
Y puede aplicar los métodos de perfil a estos. Por ejemplo, ahora confint da intervalos de confianza para el control y la varianza ejercimental.
> confint(m, method="profile", oldNames= FALSE)
Computing profile confidence intervals ...
2.5 % 97.5 %
sd_control|participant_id 0.3490873 0.66714568
sd_experimental|participant_id 0.3106425 0.61975534
sigma 0.9759407 1.08217872
(Intercept) -0.2999382 0.07194076
conditionexperimental 0.1865125 0.69149396
Sencillez
Podría usar la función de probabilidad para obtener comparaciones más avanzadas, pero hay muchas maneras de hacer aproximaciones a lo largo del camino (por ejemplo, podría hacer una prueba conservadora anova / lrt, pero ¿es eso lo que quiere?).
En este punto, me pregunto cuál es el punto de esta comparación (no tan común) entre las variaciones. Me pregunto si comienza a volverse demasiado sofisticado. ¿Por qué la diferencia entre las variaciones en lugar de la relación entre las variaciones (que se relaciona con la distribución F clásica)? ¿Por qué no solo informar intervalos de confianza? Necesitamos dar un paso atrás y aclarar los datos y la historia que se supone que debe contar, antes de entrar en vías avanzadas que pueden ser superfluas y perder el contacto con el asunto estadístico y las consideraciones estadísticas que en realidad son el tema principal.
Me pregunto si uno debería hacer mucho más que simplemente declarar los intervalos de confianza (que en realidad pueden decir mucho más que una prueba de hipótesis. Una prueba de hipótesis da un sí, no una respuesta, pero no hay información sobre la propagación real de la población. Con suficientes datos puede hacer una pequeña diferencia para ser reportado como una diferencia significativa). Para profundizar en el asunto (para cualquier propósito), se requiere, creo, una pregunta de investigación más específica (definida de manera más estricta) para guiar la maquinaria matemática para hacer las simplificaciones adecuadas (incluso cuando un cálculo exacto sea factible o cuando se puede aproximar mediante simulaciones / bootstrapping, incluso en algunos casos aún requiere una interpretación adecuada). Compare con la prueba exacta de Fisher para resolver una pregunta (particular) (sobre tablas de contingencia) exactamente,
Ejemplo simple
Para proporcionar un ejemplo de la simplicidad que es posible, muestro a continuación una comparación (mediante simulaciones) con una evaluación simple de la diferencia entre las dos variaciones grupales basada en una prueba F realizada al comparar las variaciones en las respuestas medias individuales y al comparar El modelo mixto derivó variaciones.
j
Y^i , j∼ N( μj, σ2j+ σ2ϵ10)
σϵσjj = { 1 , 2 }
Puede ver esto en la simulación del gráfico a continuación, donde, aparte de la puntuación F basada en la muestra, se calcula una puntuación F basada en las variaciones predichas (o sumas de error al cuadrado) del modelo.
σj = 1= σj = 2= 0.5σϵ= 1
Puedes ver que hay alguna diferencia. Esta diferencia puede deberse al hecho de que el modelo lineal de efectos mixtos está obteniendo las sumas de error al cuadrado (para el efecto aleatorio) de una manera diferente. Y estos términos de error al cuadrado ya no se expresan (ya) como una distribución simple de Chi-cuadrado, pero aún están estrechamente relacionados y pueden ser aproximados.
σj = 1≠ σj = 2Y^i,jσjσϵ
σj=1=0.5σj=2=0.25σϵ=1
Entonces, el modelo basado en los medios es muy exacto. Pero es menos poderoso. Esto muestra que la estrategia correcta depende de lo que quiere / necesita.
En el ejemplo anterior, cuando establece los límites de la cola derecha en 2.1 y 3.1, obtiene aproximadamente el 1% de la población en el caso de varianza igual (resp 103 y 104 de los 10 000 casos) pero en el caso de varianza desigual, estos límites difieren mucho (dando 5334 y 6716 de los casos)
código:
set.seed(23432)
# different model with alternative parameterization (and also correlation taken out)
fml1 <- "~ condition + (0 + control + experimental || participant_id) "
fml <- "~ condition + (condition | participant_id)"
n <- 10000
theta_m <- matrix(rep(0,n*2),n)
theta_f <- matrix(rep(0,n*2),n)
# initial data frame later changed into d by adding a sixth sim_1 column
ds <- expand.grid(participant_id=1:40, trial_num=1:10)
ds <- rbind(cbind(ds, condition="control"), cbind(ds, condition="experimental"))
#adding extra columns for control and experimental
ds <- cbind(ds,as.numeric(ds$condition=='control'))
ds <- cbind(ds,1-as.numeric(ds$condition=='control'))
names(ds)[c(4,5)] <- c("control","experimental")
# defining variances for the population of individual means
stdevs <- c(0.5,0.5) # c(control,experimental)
pb <- txtProgressBar(title = "progress bar", min = 0,
max = n, style=3)
for (i in 1:n) {
indv_means <- c(rep(0,40)+rnorm(40,0,stdevs[1]),rep(0.5,40)+rnorm(40,0,stdevs[2]))
fill <- indv_means[d[,1]+d[,5]*40]+rnorm(80*10,0,sqrt(1)) #using a different way to make the data because the simulate is not creating independent data in the two groups
#fill <- suppressMessages(simulate(formula(fml),
# newparams=list(beta=c(0, .5),
# theta=c(.5, 0, 0),
# sigma=1),
# family=gaussian,
# newdata=ds))
d <- cbind(ds, fill)
names(d)[6] <- c("sim_1")
m <- lmer(paste("sim_1 ", fml1), data=d)
m
theta_m[i,] <- m@theta^2
imeans <- aggregate(d[, 6], list(d[,c(1)],d[,c(3)]), mean)
theta_f[i,1] <- var(imeans[c(1:40),3])
theta_f[i,2] <- var(imeans[c(41:80),3])
setTxtProgressBar(pb, i)
}
close(pb)
p1 <- hist(theta_f[,1]/theta_f[,2], breaks = seq(0,6,0.06))
fr <- theta_m[,1]/theta_m[,2]
fr <- fr[which(fr<30)]
p2 <- hist(fr, breaks = seq(0,30,0.06))
plot(-100,-100, xlim=c(0,6), ylim=c(0,800),
xlab="F-score", ylab = "counts [n out of 10 000]")
plot( p1, col=rgb(0,0,1,1/4), xlim=c(0,6), ylim=c(0,800), add=T) # means based F-score
plot( p2, col=rgb(1,0,0,1/4), xlim=c(0,6), ylim=c(0,800), add=T) # model based F-score
fr <- seq(0, 4, 0.01)
lines(fr,df(fr,39,39)*n*0.06,col=1)
legend(2, 800, c("means based F-score","mixed regression based F-score"),
fill=c(rgb(0,0,1,1/4),rgb(1,0,0,1/4)),box.col =NA, bg = NA)
legend(2, 760, c("F(39,39) distribution"),
lty=c(1),box.col = NA,bg = NA)
title(expression(paste(sigma[1]==0.5, " , ", sigma[2]==0.5, " and ", sigma[epsilon]==1)))