web-dev-qa-db-fra.com

lme4 :: lmer rapporte "la matrice du modèle à effets fixes est déficiente en rang", ai-je besoin d'un correctif et comment?

J'essaie d'exécuter un modèle à effets mixtes qui prédit F2_difference Avec le reste des colonnes comme prédicteurs, mais je reçois un message d'erreur qui dit

la matrice du modèle à effet fixe est déficiente en rang, ce qui laisse tomber 7 colonnes/coefficients.

A partir de ce lien, le modèle à effets fixes est déficient en rang , je pense que je devrais utiliser findLinearCombos dans le package R caret. Cependant, lorsque j'essaie findLinearCombos(data.df), cela me donne le message d'erreur

Erreur dans qr.default (objet): NA/NaN/Inf dans l'appel de fonction étrangère (arg 1) En outre: Message d'avertissement: Dans qr.default (objet): NA introduits par coercition

Mes données n'ont pas de NA - Quelle pourrait être la cause de cela? (Désolé si la réponse est évidente - je suis nouveau pour R).

Toutes mes données sont des facteurs à l'exception de la valeur numérique que j'essaie de prédire. Voici un petit échantillon de mes données.

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)

Edit: Voici un peu plus de code, si cela peut vous aider.

formula <- F2_difference ~ sex + nasal + type + vowelLabel + 
           type * vowelLabel + nasal * type +
           (1|speaker) + (1|Word_1)

lmer(formula, REML = FALSE, data = data.df)

Édition de l'éditeur:

L'OP n'a pas fourni un nombre suffisant de données de test pour permettre au lecteur une exécution réelle du modèle dans lmer. Mais ce n'est pas un problème trop important. C'est toujours un très bon article!

16
Lisa

Vous êtes légèrement trop préoccupé par le message d'avertissement:

la matrice du modèle à effet fixe est déficiente en rang, ce qui laisse tomber 7 colonnes/coefficients.

Il s'agit d'un avertissement et non d'une erreur. Il n'y a ni mauvaise utilisation de lmer ni mauvaise spécification de la formule du modèle, vous obtiendrez donc un modèle estimé. Mais pour répondre à votre question, je m'efforcerai de l'expliquer.


Lors de l'exécution de lmer, votre formule de modèle est divisée en formule à effet fixe et en aléatoire formule d'effet , et pour chacun, une matrice de modèle est construite. La construction pour le fixe est via le constructeur de matrice de modèle standard model.matrix; la construction de l'aléatoire est compliquée mais n'est pas liée à votre question, donc je la saute.

Pour votre modèle, vous pouvez vérifier à quoi ressemble la matrice du modèle à effet fixe en:

fix.formula <- F2_difference ~ sex + nasal + type + vowelLabel + 
               type * vowelLabel + nasal * type

X <- model.matrix (fix.formula, data.df)

Toutes vos variables sont des facteurs donc X sera binaire. Bien que model.matrix Applique contrasts pour chaque facteur et leur interaction , il est toujours possible que X ne se retrouve pas avec le rang de colonne complet, comme un La colonne peut être une combinaison linéaire de quelques autres ( qui peut être précise ou numériquement proche). Dans votre cas, certains niveaux d'un facteur peuvent être imbriqués dans certains niveaux d'un autre .

La déficience du classement peut survenir de différentes manières. L'autre réponse partage une réponse CrossValidated proposant des discussions substantielles, sur lesquelles je ferai quelques commentaires.

  • Pour le cas 1, les gens peuvent réellement faire un modèle de sélection de fonctionnalités via, disons, LASSO.
  • Les cas 2 et 3 sont liés au processus de collecte de données. Une bonne conception de l'expérience est le meilleur moyen de prévenir le manque de classement, mais pour de nombreuses personnes qui construisent des modèles, les données sont déjà là et aucune amélioration (comme l'obtention de plus de données) n'est possible. Cependant, je voudrais souligner que même pour un ensemble de données sans déficience de rang, nous pouvons toujours rencontrer ce problème si nous ne l'utilisons pas avec précaution. Par exemple, la validation croisée est une bonne méthode de comparaison de modèles. Pour ce faire, nous devons diviser l'ensemble de données complet en un ensemble d'apprentissage et un test, mais sans précaution, nous pouvons obtenir un modèle de classement déficient de l'ensemble de données d'apprentissage.
  • Le cas 4 est un gros problème qui pourrait être complètement hors de notre contrôle. Un choix naturel consiste peut-être à réduire la complexité du modèle, mais une alternative consiste à essayer une régression pénalisée.
  • Le cas 5 est une préoccupation numérique menant à une déficience de rang numérique et this est un bon exemple.
  • Les cas 6 et 7 indiquent que les calculs numériques sont effectués avec une précision finie. Habituellement, cela ne sera pas un problème si le cas 5 est traité correctement.

Donc, parfois, nous pouvons contourner la carence, mais il n'est pas toujours possible d'y parvenir. Ainsi, toute routine d'ajustement de modèle bien écrite, comme lm, glm, mgcv::gam, Appliquera la décomposition QR pour X pour utiliser uniquement son rang complet sous-espace, c'est-à-dire un sous-ensemble maximal de colonnes de X qui donne un espace complet, pour l'estimation, fixant les coefficients associés au reste des colonnes à 0 ou NA =. L'avertissement que vous avez reçu implique simplement cela. Il existe à l'origine ncol(X) coefficients à estimer, mais en raison d'une déficience, seule ncol(X) - 7 sera estimée, le reste étant 0 ou NA. Une telle solution de contournement numérique garantit qu'une solution des moindres carrés peut être obtenue de la manière la plus stable.


Pour mieux digérer ce problème, vous pouvez utiliser lm pour ajuster un modèle linéaire avec fix.formula.

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

method = "qr" Et singular.ok = TRUE Sont par défaut, nous n'avons donc pas besoin de le définir. Mais si nous spécifions singular.ok = FALSE, lm s'arrêtera et se plaindra d'un manque de classement.

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

Vous pouvez ensuite vérifier les valeurs retournées dans fix.fit.

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

Il est garanti que p = ncol(X), mais vous devriez voir no.NA = 7 Et rank + no.NA = p.

Exactement la même chose se produit dans lmer. lm ne signalera pas de déficience alors que lmer le fera. C'est en fait informatif, car trop souvent, je vois des gens se demander pourquoi lm renvoie NA pour certains coefficients.


Mise à jour 1 (2016-05-07):

Voyons si j'ai ce droit: La version courte est qu'une de mes variables prédictives est corrélée avec une autre, mais je ne devrais pas m'en inquiéter. Il convient d'utiliser des facteurs, n'est-ce pas? Et je peux toujours comparer les modèles avec anova ou en regardant le BIC?

Ne vous inquiétez pas de l'utilisation de summary ou anova. Les méthodes sont écrites de sorte que le nombre correct de paramètres (degré de liberté) soit utilisé pour produire des statistiques sommaires valides.

Mise à jour 2 (2016-11-06):

Écoutons également ce que l'auteur du package de lme4 Dirait: avertissement de déficience de rang du modèle mixte lmer . Ben Bolker a également mentionné caret::findLinearCombos, En particulier parce que le PO souhaite résoudre lui-même le problème de carence.

Mise à jour 3 (2018-07-27):

Le manque de rang n'est pas un problème pour une estimation et une comparaison de modèle valides, mais pourrait être un danger dans la prédiction. J'ai récemment composé une réponse détaillée avec des exemples simulés sur CrossValidated: R lm, Quelqu'un pourrait-il me donner un exemple du cas trompeur sur "la prédiction d'un rang déficient"? Alors, oui , en théorie nous devrions éviter une estimation déficiente en rang. Mais en réalité, il n'y a pas de soi-disant "vrai modèle" : nous essayons de l'apprendre à partir des données. Nous ne pouvons jamais comparer un modèle estimé à la "vérité"; le meilleur pari est de choisir le meilleur parmi un certain nombre de modèles que nous avons construits. Donc, si le "meilleur" modèle finit par manquer de rang, nous pouvons être sceptiques à ce sujet, mais il n'y a probablement rien que nous puissions faire immédiatement.

27
李哲源

Cette réponse fait un excellent travail pour expliquer ce qu'est un déficit de rang et quelles peuvent être les causes possibles.

Viz:

  1. Trop peu de données: vous ne pouvez pas estimer de manière unique n paramètres avec moins de n points de données
  2. Trop de points sont des répliques.
  3. Information au mauvais endroit.
  4. Modèle compliqué (trop de variables)
  5. Unités et mise à l'échelle
  6. Variation en nombre: 12,001 vs 12,005 & 44566 vs 44555
  7. Précision des données: même les variables à double précision ont des limites
4
Mox