lme4 :: lmer informa que “la matriz del modelo de efectos fijos tiene una clasificación deficiente”, ¿necesito una solución y cómo hacerlo?

Estoy tratando de ejecutar un modelo de efectos mixtos que prediga F2_difference con el rest de las columnas como predictores, pero recibo un mensaje de error que dice:

la matriz del modelo de efectos fijos tiene un rango deficiente, por lo que cae 7 columnas / coeficientes.

Desde este enlace, el modelo de efectos fijos tiene un rango deficiente , creo que debería usar findLinearCombos en el paquete de R caret . Sin embargo, cuando bash findLinearCombos(data.df) , me da el mensaje de error

Error en qr.default (objeto): NA / NaN / Inf en llamada de función externa (arg 1) Además: Mensaje de advertencia: En qr.default (objeto): NA introducidas por coerción

Mis datos no tienen ninguna NA. ¿Qué podría estar causando esto? (Lo siento si la respuesta es bastante obvia, soy nuevo en R).

Todos mis datos son factores, excepto el valor numérico que bash predecir. Aquí hay una pequeña muestra de mis datos.

 sex <- c("f", "m", "f", "m") nasal <- c("TRUE", "TRUE", "FALSE", "FALSE") vowelLabel <- c("a", "e", "i", "o") speaker <- c("Jim", "John", "Ben", "Sally") word_1 <- c("going", "back", "bag", "back") type <- c("coronal", "coronal", "labial", "velar") F2_difference <- c(345.6, -765.8, 800, 900.5) data.df <- data.frame(sex, nasal, vowelLabel, speaker, word_1, type, F2_difference stringsAsFactors = TRUE) 

Editar: Aquí hay más código, si ayuda.

 formula <- F2_difference ~ sex + nasal + type + vowelLabel + type * vowelLabel + nasal * type + (1|speaker) + (1|word_1) lmer(formula, REML = FALSE, data = data.df) 

Edición del editor:

El OP no proporcionó una cantidad suficiente de datos de prueba para permitir una ejecución real del modelo en lmer para el lector. Pero este no es un gran problema. ¡Esta sigue siendo una muy buena publicación!

Está un poco excesivamente preocupado con el mensaje de advertencia:

la matriz del modelo de efectos fijos tiene un rango deficiente, por lo que cae 7 columnas / coeficientes.

Es una advertencia, no un error. No hay uso indebido de lmer ni una mala especificación de la fórmula del modelo, por lo que obtendrá un modelo estimado. Pero para responder a su pregunta, me esforzaré por explicarlo.


Durante la ejecución de lmer , la fórmula de su modelo se divide en una fórmula de efectos fijos y una fórmula de efectos aleatorios , y para cada uno se construye una matriz modelo . La construcción para el fijo es a través del constructor matricial modelo estándar model.matrix ; la construcción para el al azar es complicada pero no está relacionada con su pregunta, así que simplemente me lo salteo.

Para su modelo, puede verificar cómo se ve la matriz del modelo de efectos fijos mediante:

 fix.formula <- F2_difference ~ sex + nasal + type + vowelLabel + type * vowelLabel + nasal * type X <- model.matrix (fix.formula, data.df) 

Todas sus variables son factor, por lo que X será binario. Aunque model.matrix aplica contrasts para cada factor y su interacción , aún es posible que X no termine con el rango de columna completo, ya que una columna puede ser una combinación lineal de algunos otros ( que puede ser precisa o numéricamente cercana ). En su caso, algunos niveles de un factor pueden estar nesteds en algunos niveles de otro .

La deficiencia de rango puede surgir de muchas maneras diferentes. La otra respuesta comparte una respuesta CrossValidated ofreciendo discusiones sustanciales, sobre las cuales haré algunos comentarios.

  • Para el caso 1, las personas pueden hacer un modelo de selección de características por ejemplo, LASSO.
  • Los casos 2 y 3 están relacionados con el proceso de recostackción de datos. Un buen diseño de experimento es la mejor manera de prevenir la deficiencia de rango, pero para muchas personas que crean modelos, los datos ya están allí y no es posible ninguna mejora (como obtener más datos). Sin embargo, me gustaría hacer hincapié en que incluso para un conjunto de datos sin rango de deficiencia, todavía podemos obtener este problema si no lo usamos con cuidado. Por ejemplo, la validación cruzada es un buen método para la comparación de modelos. Para hacer esto, necesitamos dividir el conjunto de datos completo en uno de entrenamiento y uno de prueba, pero sin cuidado podemos obtener un modelo de rango deficiente del conjunto de datos de entrenamiento.
  • El caso 4 es un gran problema que podría estar completamente fuera de nuestro control. Quizás una opción natural es reducir la complejidad del modelo, pero una alternativa es intentar la regresión penalizada.
  • El caso 5 es una preocupación numérica que conduce a una deficiencia numérica de rango y este es un buen ejemplo.
  • Los casos 6 y 7 indican que los cálculos numéricos se realizan en precisión finita. Por lo general, estos no serán un problema si el caso 5 se trata adecuadamente.

Entonces, a veces podemos solucionar la deficiencia pero no siempre es posible lograr esto. Por lo tanto, cualquier rutina de ajuste modelo bien escrita, como lm , glm , mgcv::gam , aplicará la descomposición QR para que X use solo su subespacio de rango completo, es decir, un subconjunto máximo de columnas de X que proporcione una rango de espacio, para la estimación, fijación de coeficientes asociados con el rest de las columnas en 0 o NA . La advertencia que recibiste solo implica esto. Hay originalmente ncol(X) para estimar, pero debido a la deficiencia, solo se ncol(X) - 7 , siendo el rest 0 o NA . Tal solución numérica asegura que se puede obtener una solución de mínimos cuadrados de la manera más estable.


Para digerir mejor este problema, puede usar lm para ajustar un modelo lineal con fix.formula .

 fix.fit <- lm(fix.formula, data.df, method = "qr", singular.ok = TRUE) 

method = "qr" y singular.ok = TRUE son singular.ok = TRUE predeterminados, por lo que en realidad no es necesario configurarlo. Pero si especificamos singular.ok = FALSE , lm se detendrá y se quejará de la deficiencia de rango.

 lm(fix.formula, data.df, method = "qr", singular.ok = FALSE) #Error in lm.fit(x, y, offset = offset, singular.ok = singular.ok, ...) : # singular fit encountered 

Luego puede verificar los valores devueltos en fix.fit .

 p <- length(coef) coef <- fix.fit$coef no.NA <- sum(is.na(coef)) rank <- fix.fit$rank 

Se garantiza que p = ncol(X) , pero debería ver no.NA = 7 y rank + no.NA = p .

Exactamente lo mismo sucede dentro de lmer . No reportaré la deficiencia mientras que lmer hace. Esto es, de hecho, informativo, ya que con demasiada frecuencia, veo gente preguntando por qué lm devuelve NA para algunos coeficientes.


Actualización 1 (07/05/2016):

Déjame ver si tengo este derecho: la versión corta es que una de mis variables de predicción está correlacionada con otra, pero no debería preocuparme por eso. Es apropiado usar factores, ¿correcto? ¿Y aún puedo comparar modelos con anova o mirando el BIC?

No se preocupe por el uso de summary o anova . Los métodos se escriben de modo que se use la cantidad correcta de parámetros (grado de libertad) para producir estadísticas de resumen válidas.

Actualización 2 (2016-11-06):

También escuchemos qué diría el autor del paquete de lme4 : advertencia de deficiencia de rango de modelo mixto lmer . Ben Bolker también ha mencionado a caret::findLinearCombos , sobre todo porque el OP quiere abordar el tema de la deficiencia por sí mismo.

Actualización 3 (2018-07-27):

La deficiencia de rango no es un problema para la estimación y comparación del modelo válido, pero podría ser un peligro en la predicción. Hace poco compuse una respuesta detallada con ejemplos simulados sobre CrossValidated: R lm , ¿podría alguien darme un ejemplo del caso engañoso sobre "predicción de un rango deficiente"? Entonces, sí, en teoría deberíamos evitar la estimación deficiente de rango. Pero, en realidad, no existe el llamado "verdadero modelo" : tratamos de aprenderlo a partir de los datos. Nunca podemos comparar un modelo estimado con la "verdad"; la mejor opción es elegir la mejor de entre una serie de modelos que hemos creado. Entonces, si el "mejor" modelo termina con deficiencia de rango, podemos ser escépticos al respecto, pero probablemente no hay nada que podamos hacer de inmediato.

Esta respuesta es un excelente trabajo para explicar qué es la deficiencia de rango y cuáles pueden ser las posibles causas.

Verbigracia:

  1. Muy pocos datos: no puede estimar de forma única n parámetros con menos de n puntos de datos
  2. Demasiados puntos son réplicas.
  3. Información en los lugares equivocados.
  4. Modelo complicado (demasiadas variables)
  5. Unidades y escala
  6. Variación en números: 12.001 contra 12.005 y 44566 contra 44555
  7. Precisión de datos: incluso las variables de precisión doble tienen límites
    Intereting Posts