Estoy analizando algunos datos de comportamiento utilizando lme4
en R
, sobre todo después de excelentes tutoriales de Bodo invierno , pero no entiendo si yo estoy manejando adecuadamente las interacciones. Peor aún, nadie más involucrado en esta investigación utiliza modelos mixtos, por lo que estoy un poco a la deriva cuando se trata de asegurarme de que las cosas estén bien.
En lugar de simplemente pedir un grito de ayuda, pensé que debería hacer mi mejor esfuerzo para interpretar el problema, y luego pedir sus correcciones colectivas. Algunos otros apartados son:
- Mientras escribía, encontré esta pregunta , que muestra que
nlme
más directamente dan valores p para términos de interacción, pero creo que todavía es válido preguntar con relación alme4
. Livius'
La respuesta a esta pregunta proporcionó enlaces a muchas lecturas adicionales, que trataré de completar en los próximos días, por lo que comentaré con cualquier progreso que traiga.
En mis datos, tengo una variable dependiente dv
, una condition
manipulación (0 = control, 1 = condición experimental, que debería resultar en una mayor dv
), y también un requisito previo, etiquetado appropriate
: los ensayos codificados 1
para esto deberían mostrar el efecto, pero los ensayos codificados 0
podrían no, porque falta un factor crucial.
También he incluido dos intercepciones aleatorias, para subject
y para target
, que reflejan dv
valores correlacionados dentro de cada sujeto, y dentro de cada uno de los 14 problemas resueltos (cada participante resolvió un control y una versión experimental de cada problema).
library(lme4)
data = read.csv("data.csv")
null_model = lmer(dv ~ (1 | subject) + (1 | target), data = data)
mainfx_model = lmer(dv ~ condition + appropriate + (1 | subject) + (1 | target),
data = data)
interaction_model = lmer(dv ~ condition + appropriate + condition*appropriate +
(1 | subject) + (1 | target), data = data)
summary(interaction_model)
Salida:
## Linear mixed model fit by REML ['lmerMod']
## ...excluded for brevity....
## Random effects:
## Groups Name Variance Std.Dev.
## subject (Intercept) 0.006594 0.0812
## target (Intercept) 0.000557 0.0236
## Residual 0.210172 0.4584
## Number of obs: 690, groups: subject, 38; target, 14
##
## Fixed effects:
## Estimate Std. Error t value
## (Intercept) 0.2518 0.0501 5.03
## conditioncontrol 0.0579 0.0588 0.98
## appropriate -0.0358 0.0595 -0.60
## conditioncontrol:appropriate -0.1553 0.0740 -2.10
##
## Correlation of Fixed Effects:
## ...excluded for brevity.
ANOVA luego muestra interaction_model
un ajuste significativamente mejor que mainfx_model
, del cual concluyo que hay una interacción significativa presente (p = .035).
anova(mainfx_model, interaction_model)
Salida:
## ...excluded for brevity....
## Df AIC BIC logLik deviance Chisq Chi Df Pr(>Chisq)
## mainfx_model 6 913 940 -450 901
## interaction_model 7 910 942 -448 896 4.44 1 0.035 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
A partir de ahí, aíslo un subconjunto de los datos para los appropriate
que se cumple el requisito (es decir, appropriate = 1
), y para que se ajuste a un modelo nulo, y un modelo que incluya condition
como efecto, compare los dos modelos usando ANOVA nuevamente, y he aquí que condition
Es un predictor significativo.
good_data = data[data$appropriate == 1, ]
good_null_model = lmer(dv ~ (1 | subject) + (1 | target), data = good_data)
good_mainfx_model = lmer(dv ~ condition + (1 | subject) + (1 | target), data = good_data)
anova(good_null_model, good_mainfx_model)
Salida:
## Data: good_data
## models:
## good_null_model: dv ~ (1 | subject) + (1 | target)
## good_mainfx_model: dv ~ condition + (1 | subject) + (1 | target)
## Df AIC BIC logLik deviance Chisq Chi Df Pr(>Chisq)
## good_null_model 4 491 507 -241 483
## good_mainfx_model 5 487 507 -238 477 5.55 1 0.018 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
fuente
lme4
: stats.stackexchange.com/questions/118416/…Respuestas:
No veo mucho que decir aquí. Creo que has hecho un buen trabajo.
Hay varias formas en que las personas han discutido para probar los efectos y obtener valores p para modelos complicados de efectos mixtos. Hay una buena descripción general aquí . Lo mejor es utilizar métodos computacionalmente intensivos (bootstrapping o métodos bayesianos), pero esto es más avanzado para la mayoría de las personas. El segundo mejor (y el mejor método conveniente) es usar una prueba de razón de probabilidad. Eso es lo que está haciendo
anova()
(técnicamente ? Anova.merMod () ). Es importante utilizar solo una prueba de razón de verosimilitud de los modelos que se ajustaron con la máxima verosimilitud total , en lugar de la máxima verosimilitud restringida(REML) Por otro lado, para su modelo final y para la interpretación, desea usar REML. Esto es confuso para muchas personas. En su salida, vemos que ajusta sus modelos con REML (esto se debe a que la opción está configuradaTRUE
de forma predeterminada enlmer()
. Eso significaría que su prueba no es válida, sin embargo, debido a que es un error tan común,anova.merMod()
contiene unrefit
argumento que al el valor predeterminado está establecido enTRUE
y no lo ha cambiado, por lo que la previsión de los desarrolladores de paquetes lo ha guardado allí.Con respecto a su estrategia para desempaquetar la interacción, lo que hizo está bien. Solo tenga en cuenta que la interacción utiliza todos los datos para su prueba. Es posible tener una interacción significativa, pero ninguna de las pruebas estratificadas es significativa, lo que confunde a algunas personas. (Sin embargo, no parece haberte sucedido).
fuente
Yo también soy un novato y sigo los consejos de Zuur et al. Lo uso
lme
delnlme
paquete en lugar delme4
cuando necesito agregar una estructura de error jerárquico a un modelo lineal. Mi respuesta podría estar muy lejos.Dos comentarios:
(1) No estoy seguro de que tenga sentido probar
condition
en el subconjuntoappropriate==1
solo cuando . Si desea obtener valores p para los efectos principales, puede usarAnova
el paquete 'car':Si desea resolver la interacción, puede ejecutar comparaciones emparejadas directamente (?) O hacer lo que hizo pero en ambos subconjuntos (es decir, también con el subconjunto donde
appropriate==0
).(2) Es posible que desee seleccionar su estructura de error primero en lugar de asumir que
(1 | subject) + (1 | target)
es la mejor estructura de error. Por lo que escribió, deduzco quecondition
es un factor dentro del sujeto, mientras que es un factorappropriate
entre sujetos o entre objetivos. Es posible que desee agregar pendientes para factores dentro del sujeto y / o dentro del objetivo, por ejemplo:dv ~ condition + appropriate + (1+condition | subject) + (1 | target)
agrega una pendiente aleatoria para el factor dentro del sujetocondition
. No se necesitan pendientes para factores entre sujetos / objetivos.Salud
fuente
Anova
embargo, ¿no pretenderá que las correlaciones entre sujetos y objetivos no están ahí? La razón por la que repito el análisis solo con datosappropriate==1
es que algunos de los materiales utilizados resultaron problemáticos en una prueba posterior, por lo tanto, "inapropiados". Finalmente, no he usado pendientes aleatorias por la simple razón de que el modelo se ajusta mejor sin ellas.