Erreur lors de l'exécution de lmer() dans R
Alors, voici mon problème. J'ai un jeu de données dans R que j'ai besoin d'exécuter un modèle à effets mixtes. Voici le code:
data <- read.csv("D:/blahblah.csv")
analysis.data <- lmer(intdiff ~ stress_limit * word_position * follows + (1|speaker), data)
summary(analysis.data)
Lorsque j'essaie d'exécuter le script, il renvoie l'erreur suivante:
Error in mer_finalize(ans) : Downdated X'X is not positive definite, 15.
J'ai suivi l'erreur jusqu'à la "suit" paramètre parce que quand je viens de l'utiliser stress_limit et word_position, il fonctionne très bien. Si cela peut aider, les données dans le "suit" ne sont que de 3 chaînes: n ou l, consonne, voyelle. J'ai essayé de remplacer les espaces par_, mais sans succès. Est-il quelque chose sur le fonctionnement interne de la lmer() fonction qui empêche l'utilisation de la "suit" dans ce cas? Toute aide serait super!
Pour plus d'info: intdiff contient des valeurs numériques, stress_limit est cordes (Souligné ou Non) et la position du mot est aussi des chaînes de caractères (Mot Médial ou le Mot Initial).
EDIT: Voici un échantillon de données qui reproduit l'erreur:
structure(list(intdiff = c(11.45007951, 12.40144758, 13.47898367,
6.279497762, 18.19461897, 16.15539707), word_position = structure(c(2L,
2L, 2L, 1L, 1L, 1L), .Label = c("Word Initial", "Word Medial"
), class = "factor"), follows = structure(c(4L, 4L, 4L, 1L, 2L,
4L), .Label = c("Consonant", "n or l", "Pause", "Vowel"), class = "factor"),
stress_limit = structure(c(2L, 1L, 1L, 2L, 2L, 2L), .Label = c("Stressed",
"Unstressed"), class = "factor"), speaker = structure(c(2L,
2L, 2L, 2L, 2L, 2L), .Label = c("f11r", "f13r", "f15a", "f16a",
"m09a", "m10a", "m12r", "m14r"), class = "factor")), .Names = c("intdiff",
"word_position", "follows", "stress_limit", "speaker"), row.names = c(NA,
6L), class = "data.frame")
J'ai essayé de la lme() fonction en tant que bien, mais elle est revenue cette erreur:
Error in MEEM(object, conLin, control$niterEM) :
Singularity in backsolve at level 0, block 1
Le code dans mon premier post, c'est exactement le code que j'utilise, moins de la bibliothèque(lme4), alors je ne pars pas toute l'information que je peux penser.
Ma version R est 2.15.2
data
?Le bloc de données est d'environ 1110 lignes. Les données sont prévisibles donné un échantillon, bien que.
Faites vos variables prédictives contenir des toutes les combinaisons possibles de la limite du stress, la position du mot, et suit, ou certains sont manquants (parce qu'ils sont irréalisables, ou vous n'avez pas arriver à les mesurer)? Est
with(data,all(table(stress_limit,word_position,follows)>=1))
vrai? (Ce qui est en train de devenir un des stats question plutôt que d'une question de programmation ...)Le résultat est faux, donc je suppose qu'en effet, pas toutes les combinaisons possibles existent. Est-ce à dire un modèle à effets mixtes ne peuvent pas être exécutés à tout? Ou puis-je prendre cela en compte quand je lance la fonction?
Ma réponse vous dit ...
OriginalL'auteur Shakesbeery | 2013-02-01
Vous devez vous connecter pour publier un commentaire.
Difficile à dire sans reproductible exemple: Comment faire un grand R reproductible exemple?
Mais, devinant: ces sortes de problèmes sont généralement à cause de la colinéarité dans la conception de la matrice. Le centrage de votre prédicteur (
intdiff
) peut aider. Vous pouvez aussi explorer la matrice de conception directementColinéarité entre les paires:
cor(X)
. Malheureusement je n'ai pas de suggestion pour la détection de multi-colinéarité (c'est à dire pas entre les paires, mais entre des combinaisons de >2 prédicteurs) sur le dessus de ma tête, même si vous pouvez regarder dans les outils pour le calcul des facteurs d'inflation de la variance (par exemplelibrary("sos"); findFn("VIF")
).Comme un cross-check,
lme
devrait également être en mesure de gérer votre modèle:Lorsque j'exécute vos données de test dans la version de développement de lme4 ( disponible sur github ), j'ai
Error in lmer(intdiff ~ stress_limit * word_position * follows + (1 | : rank of X = 5 < ncol(X) = 12
. D'autre part, avec cet ensemble de données d'entrée (6 observations), il n'y a aucun moyen possible que vous pourriez tenir 12 paramètres. C'est un peu plus difficile de dire exactement où est ton problème. Faire tous les 12 combinaisons de votre 3 variables produisent réellement dans vos données? Si certains sont manquants, vous devez suivre les conseils donnés dans la version de développement de l'aide:En particulier, vous pouvez adapter ce modèle comme suit:
Cela vous donnera une ANOVA à un traitement de l'unique combinaisons de niveaux qui sont effectivement présents dans les données que les catégories. Vous aurez à comprendre ce qu'ils signifient.
L'alternative est de réduire le nombre d'interactions dans le modèle jusqu'à ce que vous arrivez à un ensemble qui n'ont pas toutes disparues combinaisons; si vous avez de la chance
(stress_limit+word_position+follow)^2
(toutes les interactions à deux) va fonctionner, mais vous pourriez avoir à réduire le modèle encore plus loin (p. ex.stress_limit + word_position*follow
).Un autre moyen de tester cela est d'utiliser
lm()
sur votre proposition de modèles et de vérifier qu'il n'y a pasNA
valeurs dans l'estimation des coefficients.La principale chose que vous serez perdant dans ces façons est confort/facilité d'interprétation, parce que les paramètres pour les combinaisons ne pouvait pas ont été estimés à partir des données de toute façon ...
yep, c'est la difficulté. Les outils ne peuvent faire ce que les données permettent 🙁 . Me rappelle de ma première exposition à la méthode des moindres carrés analyse. Je gaiement pensé que (réduction de premier cycle laboratoire de physique de données), même si le modèle sous-jacent a y ~x^2, j'ai pu obtenir une beaucoup plus "cool" adapter à la 8-ème polynôme d'ordre. un échec. Ce genre de choses arrive à chacun de nous.
Fantastique, cela a été extrêmement utile et instructif répondre! Je pense que je peux le prendre à partir d'ici. Encore une fois, vous avez mes remerciements les plus sincères.
OriginalL'auteur Ben Bolker