r regression linear-regression lme4 mixed-models

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



regression linear-regression (2)

Está un poco preocupado por el mensaje de advertencia:

la matriz del modelo de efectos fijos es de rango deficiente, por lo que se eliminan 7 columnas / coeficientes.

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

Durante la ejecución de lmer , su fórmula modelo se divide en una fórmula de efecto fijo y una fórmula de efecto aleatorio , y para cada uno se construye una matriz modelo . La construcción para el fijo es a través del modelo estándar de matriz constructor model.matrix ; La construcción de la aleatoria es complicada pero no está relacionada con tu pregunta, así que solo la omito.

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

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

Todas tus variables son factores por lo que X será binario. Aunque model.matrix aplica contrasts para cada factor y su interacción , todavía es posible que X no obtenga el rango completo de la columna, ya que una columna puede ser una combinación lineal de algunas otras ( que pueden ser precisas o numéricamente cercanas ). En su caso, algunos niveles de un factor pueden estar anidados en algunos niveles de otro factor .

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

  • Para el caso 1, las personas pueden hacer un modelo de selección de características a través de, por ejemplo, LASSO.
  • Los casos 2 y 3 están relacionados con el proceso de recolección de datos. Un buen diseño de experimento es la mejor manera de prevenir la deficiencia de rango, pero para muchas personas que construyen modelos, los datos ya están allí y no es posible mejorar (como obtener más datos). Sin embargo, me gustaría enfatizar que incluso para un conjunto de datos sin deficiencia de rango, podemos seguir teniendo 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 de rango numérico y this es un buen ejemplo.
  • Los casos 6 y 7 indican el hecho de que los cálculos numéricos se realizan con 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 lograrlo. Por lo tanto, cualquier rutina de ajuste de modelo bien escrita, como lm , glm , mgcv::gam , aplicará la descomposición QR para X para usar solo su subespacio de rango completo, es decir, un subconjunto máximo de columnas de X que proporciona un completo Rango de espacio, para estimación, fijación de coeficientes asociados con el resto de las columnas en 0 o NA . La advertencia que tienes simplemente implica esto. Originalmente ncol(X) coeficientes de ncol(X) para estimar, pero debido a la deficiencia, solo se ncol(X) - 7 , y el resto será 0 o NA . Dicha solución numérica garantiza que se pueda 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 predeterminados, así que en realidad no necesitamos 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

A continuación, puede comprobar 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 . lm no informará de deficiencia mientras lmer hace. De hecho, esto es informativo, ya que con demasiada frecuencia, veo a personas preguntándose por qué le lm NA para algunos coeficientes.

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

Déjeme 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 todavía puedo comparar modelos con anova o mirando el BIC?

No te preocupes por el uso de summary o anova . Los métodos se escriben de manera que el número correcto de parámetros (grado de libertad) se usará para producir estadísticas de resumen válidas.

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

También escuchemos qué paquete lme4 autor de lme4 : advertencia de deficiencia de rango lmer modelo mixto . Ben Bolker también mencionó caret::findLinearCombos , en particular porque el OP quiere abordar el problema 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 de modelos válidos, pero podría ser un peligro en la predicción. Recientemente compuse una respuesta detallada con ejemplos simulados en 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 una estimación deficiente de rango. Pero en realidad, no existe el llamado "modelo verdadero" : tratamos de aprenderlo a partir de los datos. Nunca podemos comparar un modelo estimado con la "verdad"; La mejor opción es elegir el mejor de una serie de modelos que hemos construido. Entonces, si el "mejor" modelo termina con una deficiencia de rango, podemos ser escépticos al respecto, pero probablemente no hay nada que podamos hacer de inmediato.

Estoy intentando ejecutar un modelo de efectos mixtos que predice la F2_difference con el resto de las columnas como predictores, pero F2_difference un mensaje de error que dice

la matriz del modelo de efectos fijos es de rango deficiente, por lo que se eliminan 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 intento findLinearCombos(data.df) , findLinearCombos(data.df) el mensaje de error

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

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

Todos mis datos son factores excepto el valor numérico que estoy tratando de 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)

Edición: Aquí hay algo más de 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)

Editor de edición:

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 esto no es un problema demasiado grande. ¡Este es todavía un muy buen post!


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

Verbigracia:

  1. Muy pocos datos: no puede estimar 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 escalado.
  6. Variación en números: 12.001 vs. 12.005 y 44566 vs 44555
  7. Precisión de datos: incluso las variables de precisión doble tienen límites