Advertencia "El modelo no pudo converger" en lmer ()

21

Con el siguiente conjunto de datos, quería ver si la respuesta (efecto) cambia con respecto a los sitios, la temporada, la duración y sus interacciones. Algunos foros en línea sobre estadísticas me sugirieron que siguiera con los Modelos lineales de efectos mixtos, pero el problema es que, dado que las réplicas son aleatorias dentro de cada estación, tengo pocas posibilidades de recolectar la muestra exactamente del mismo lugar en temporadas sucesivas (por ejemplo, repl-1 de s1 de post-monzón puede no ser el mismo que el de monzón). Es diferente a los ensayos clínicos (con diseño dentro del sujeto) donde se mide el mismo sujeto repetidamente durante las estaciones. Sin embargo, considerando los sitios y la temporada como un factor aleatorio, ejecuté los siguientes comandos y recibí un mensaje de advertencia:

Warning messages:
1: In checkConv(attr(opt, "derivs"), optpar,ctrl=controlpar,ctrl=controlcheckConv, 
: unable to evaluate scaled gradient
2: In checkConv(attr(opt, "derivs"), optpar,ctrl=controlpar,ctrl=controlcheckConv, 
: Model failed to converge: degenerate Hessian with 1 negative eigenvalues

¿Alguien puede ayudarme a resolver el problema? Los códigos se dan a continuación:

library(lme4)
read.table(textConnection("duration season  sites   effect
                          4d    mon s1  7305.91
                          4d    mon s2  856.297
                          4d    mon s3  649.93
                          4d    mon s1  10121.62
                          4d    mon s2  5137.85
                          4d    mon s3  3059.89
                          4d    mon s1  5384.3
                          4d    mon s2  5014.66
                          4d    mon s3  3378.15
                          4d    post    s1  6475.53
                          4d    post    s2  2923.15
                          4d    post    s3  554.05
                          4d    post    s1  7590.8
                          4d    post    s2  3888.01
                          4d    post    s3  600.07
                          4d    post    s1  6717.63
                          4d    post    s2  1542.93
                          4d    post    s3  1001.4
                          4d    pre s1  9290.84
                          4d    pre s2  2199.05
                          4d    pre s3  1149.99
                          4d    pre s1  5864.29
                          4d    pre s2  4847.92
                          4d    pre s3  4172.71
                          4d    pre s1  8419.88
                          4d    pre s2  685.18
                          4d    pre s3  4133.15
                          7d    mon s1  11129.86
                          7d    mon s2  1492.36
                          7d    mon s3  1375
                          7d    mon s1  10927.16
                          7d    mon s2  8131.14
                          7d    mon s3  9610.08
                          7d    mon s1  13732.55
                          7d    mon s2  13314.01
                          7d    mon s3  4075.65
                          7d    post    s1  11770.79
                          7d    post    s2  4254.88
                          7d    post    s3  753.2
                          7d    post    s1  11324.95
                          7d    post    s2  5133.76
                          7d    post    s3  2156.2
                          7d    post    s1  12103.76
                          7d    post    s2  3143.72
                          7d    post    s3  2603.23
                          7d    pre s1  13928.88
                          7d    pre s2  3208.28
                          7d    pre s3  8015.04
                          7d    pre s1  11851.47
                          7d    pre s2  6815.31
                          7d    pre s3  8478.77
                          7d    pre s1  13600.48
                          7d    pre s2  1219.46
                          7d    pre s3  6987.5
                          "),header=T)->dat1


m1 = lmer(effect ~ duration + (1+duration|sites) +(1+duration|season),
          data=dat1, REML=FALSE)
Syamkumar. R
fuente
@Ian_Fin. Gracias por la edición En realidad, no sé cómo incluir los códigos r como se
indica

Respuestas:

47

"Resolver" el problema que experimenta en el sentido de no recibir advertencias sobre convergencia fallida es bastante sencillo: no utiliza el optimizador BOBYQA predeterminado, sino que opta por utilizar la rutina de optimización Nelder-Mead utilizada de forma predeterminada en 1.0.xversiones anteriores anteriores. O instale el paquete optimxpara poder directamente una rutina L-BFGS-B o nlminb(igual que las lme4versiones anteriores a la ver. 1). Por ejemplo:

m1 = lmer(effect~duration+(1+duration|sites)+(1+duration|season), 
          data = dat1, REML = FALSE, 
          control = lmerControl(optimizer ="Nelder_Mead")
library(optimx)
m1 = lmer(effect~duration+(1+duration|sites)+(1+duration|season), 
          data = dat1, REML = FALSE, 
          control = lmerControl(
                           optimizer ='optimx', optCtrl=list(method='L-BFGS-B')))
m1 = lmer(effect~duration+(1+duration|sites)+(1+duration|season), 
          data = dat1, REML = FALSE, 
          control = lmerControl(
                           optimizer ='optimx', optCtrl=list(method='nlminb')))

todo funciona bien (sin advertencias). Las preguntas interesantes son:

  1. por qué tienes estas advertencias para empezar y
  2. ¿Por qué cuando lo usaste REML = TRUEno recibiste advertencias?

De manera sucinta, 1. recibió esas advertencias porque definió durationtanto un efecto fijo como una pendiente aleatoria para el factor sitesy también season. El modelo efectivamente agotó los grados de libertad para estimar las correlaciones entre las pendientes y las intersecciones que definió. Si utilizó un modelo marginalmente más simple como:

m1 = lmer(effect~duration+ (1+duration|sites) + (0+duration|season) + (1|season),
          data=dat1, REML = FALSE)

no experimentaría problemas de convergencia. Este modelo efectivamente estimaría intercepciones aleatorias no correlacionadas y pendientes aleatorias para cada una season.

REML = FALSEXy=Xβ+Zγ+ϵKKX=0 0yKyZKZZ

Una nota final es que no estoy seguro de si tiene sentido usar seasoncomo efecto aleatorio para empezar. Después de todo, solo hay tantas estaciones, por lo que también podría tratarlas como efectos fijos.

usεr11852 dice Reinstate Monic
fuente
Por cierto, ¡bienvenido a la comunidad!
usεr11852 dice Reinstate Monic el
1
@ Syamkumar.R: Genial, me alegra haber podido ayudar. Si cree que esto responde a su pregunta, podría considerar aceptar la respuesta.
usεr11852 dice Reinstate Monic el
¡¡muchas gracias!! La tercera variante - REML = FALSE, glmerControl(optimizer ='optimx', optCtrl=list(method='nlminb'))- en realidad resolvió el problema de convergencia en glmer!
Curioso
0

La pregunta es estadística más que técnica. En realidad, utilicé un modelo de efectos aleatorios en lugar de uno de efectos fijos. Creo que ninguno de los factores debe tratarse como factor aleatorio, ya que necesitamos al menos 5 o 6 niveles o réplicas para tratar un factor como efecto aleatorio (ver aquí ¿Cuál es el número mínimo recomendado de grupos para un factor de efectos aleatorios? ).

El conjunto de datos anterior contiene solo muestras por triplicado / sitio / temporada, lo que es insuficiente para un modelo de efectos aleatorios. En el conjunto de datos, la duración, 4 días y 7 días, pertenecen a dos experimentos paralelos separados realizados al mismo tiempo. Entonces, dividir el conjunto de datos por duración (4 días y 7 días) y realizar una anova de 2 vías para cada duración con la temporada y los sitios, ya que los factores serían suficientes para modelar el efecto (variable de respuesta) aquí. El modelo debe ser el siguiente:

lm(day_4_effect~sites*season, data=dat1)

lm(day_7_effect~sites*season, data=dat1)

Gracias a Bodo Winter ( http://www.bodowinter.com/tutorial/bw_LME_tutorial2.pdf ) y a @ usεr11852 que me ayudaron a resolver el problema.

Syamkumar. R
fuente