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!
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.
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.
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: