Estoy tratando de usar lme4::glmer()
para ajustar un modelo mixto binomial generalizado (GLMM) con una variable dependiente que no es binaria, sino una variable continua entre cero y uno. Uno puede pensar en esta variable como una probabilidad; de hecho, es la probabilidad según lo informado por sujetos humanos (en un experimento que ayudo a analizar). Es decir, no es una fracción "discreta", sino una variable continua.
Mi glmer()
llamada no funciona como se esperaba (ver más abajo). ¿Por qué? ¿Que puedo hacer?
Edición posterior: mi respuesta a continuación es más general que la versión original de esta pregunta, por lo que modifiqué la pregunta para que sea más general también.
Más detalles
Aparentemente, es posible utilizar la regresión logística no solo para DV binario sino también para DV continuo entre cero y uno. De hecho, cuando corro
glm(reportedProbability ~ a + b + c, myData, family="binomial")
Recibo un mensaje de advertencia
Warning message:
In eval(expr, envir, enclos) : non-integer #successes in a binomial glm!
pero un ajuste muy razonable (todos los factores son categóricos, por lo que puedo verificar fácilmente si las predicciones del modelo están cerca de las medias entre sujetos, y lo están).
Sin embargo, lo que realmente quiero usar es
glmer(reportedProbability ~ a + b + c + (1 | subject), myData, family="binomial")
Me da la misma advertencia, devuelve un modelo, pero este modelo está claramente muy apagado; Las estimaciones de los efectos fijos están muy lejos de glm()
las de los medios transversales. (Y necesito incluir glmerControl(optimizer="bobyqa")
en la glmer
llamada, de lo contrario no converge en absoluto).
glmmadmb(reportedProbability ~ a + b + c + (1 | subject), myData, family="beta")
, obtengo el ajuste correcto y los intervalos de confianza razonables, pero una advertencia de convergencia falló : - / Intentando descubrir cómo aumentar el número de iteraciones. Beta podría funcionar para mí porque no tengo DV = 0 o DV = 1 casos.+ (1 | rowid)
a mi llamada glmer y esto produce estimaciones estables e intervalos de confianza estables, independientemente de mi elección de peso (probé 100 y 500). También intenté ejecutar lmer en logit (reportedProbability) y obtengo casi exactamente lo mismo. ¡Entonces ambas soluciones parecen funcionar bien! Beta MM con glmmadmb también da resultados muy cercanos, pero por alguna razón no logra converger completamente y tarda una eternidad en ejecutarse. ¡Considere publicar una respuesta que enumere estas opciones y explique un poco las diferencias y los pros / contras! (Los intervalos de confianza que menciono son todos de Wald.)Respuestas:
Tiene sentido comenzar con un caso más simple sin efectos aleatorios.
Hay cuatro formas de lidiar con la variable de respuesta continua de cero a uno que se comporta como una fracción o una probabilidad ( este es nuestro hilo más canónico / votado / visto sobre este tema, pero desafortunadamente no se discuten las cuatro opciones allí):
n
Logit transforma la respuesta y usa regresión lineal. Esto generalmente no se aconseja.
Ajuste un modelo binomial pero luego calcule los errores estándar teniendo en cuenta la dispersión excesiva. Los errores estándar se pueden calcular de varias maneras:
(a) errores estándar escalados a través de la estimación de sobredispersión ( uno , dos ). Esto se llama GLM "cuasi-binomial".
(b) errores estándar robustos a través del estimador sandwich ( uno , dos , tres , cuatro ). Esto se llama "logit fraccional" en econometría.
Las letras (a) y (b) no son idénticas (vea este comentario , y las secciones 3.4.1 y 3.4.2 en este libro , y esta publicación SO y también esta y esta ), pero tienden a dar resultados similares. La opción (a) se implementa de la
glm
siguiente manera:Las mismas cuatro formas están disponibles con efectos aleatorios.
Usando
weights
argumento ( uno , dos ):De acuerdo con el segundo enlace anterior, podría ser una buena idea modelar la sobredispersión, ver allí (y también el # 4 a continuación).
Usando el modelo beta mixto:
o
Si hay ceros exactos o unos en los datos de respuesta, entonces se puede usar el modelo beta cero / uno inflado en
glmmTMB
.Usando la transformación logit de la respuesta:
Contabilización de la sobredispersión en el modelo binomial. Esto usa un truco diferente: agregar un efecto aleatorio para cada punto de datos:
Por alguna razón, esto no funciona correctamente, ya que se
glmer()
queja de no enterosp
y produce estimaciones sin sentido. Una solución que se me ocurrió es usar una constante falsaweights=k
y asegurarme de quep*k
siempre sea un número entero. Esto requiere redondeo,p
pero al seleccionark
que sea lo suficientemente grande, no debería importar mucho. Los resultados no parecen depender del valor dek
.Actualización posterior (enero de 2018): este podría ser un enfoque no válido. Ver discusión aquí . Tengo que investigar esto más.
En mi caso específico, la opción 1 no está disponible.
La opción n. ° 2 es muy lenta y tiene problemas para converger:Actualización: intentéglmmadmb
tarda entre cinco y diez minutos en ejecutarse (¡y aún se queja de que no convergió!), Mientras quelmer
funciona en una fracción de segundo yglmer
tarda un par de segundos.glmmTMB
como se sugiere en los comentarios de @BenBolker y funciona casi tan rápido comoglmer
sin problemas de convergencia. Entonces esto es lo que usaré.Las opciones 3 y 4 producen estimaciones muy similares e intervalos de confianza de Wald muy similares (obtenidos con
confint
). Sin embargo, no soy un gran fanático del # 3 porque es una especie de trampa. Y el # 4 se siente algo hacky.Muchísimas gracias a @Aaron que me señaló hacia el # 3 y # 4 en su comentario.
fuente
devtools::install_github("glmmTMB/glmmTMB",sub="glmmTMB")
, usarglmmTMB(p ~ a+b+c + (1|subject), myData, family=list(family="beta",link="logit"))
debería funcionar ...glmmTMB
es más rápido y más estable queglmmADMB
, y con un desarrollo (ligeramente) más activo, aunque no tan maduro.