所以这是我的问题。我在R中有一个数据集,我需要运行混合效果模型。这是代码:
data <- read.csv("D:/blahblah.csv")
analysis.data <- lmer(intdiff ~ stress_limit * word_position * follows + (1|speaker), data)
summary(analysis.data)
当我尝试运行脚本时,它会返回以下错误:
Error in mer_finalize(ans) : Downdated X'X is not positive definite, 15.
我已将错误跟踪到“follow”参数,因为当我只使用stress_limit和word_position时,它运行正常。如果有帮助,“跟随”中的数据只有3个字符串:n或l,辅音,元音。我试过用_替换空格但没有成功。在这种情况下,lmer()函数的内部工作是否阻止使用“跟随”?任何帮助都会很棒!
有关详细信息:intdiff包含数值,stress_limit是字符串(Stressed或Unstressed),word位置也是字符串(Word Medial或Word Initial)。
编辑:这是一个重现错误的数据样本:
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")
我也尝试了lme()函数,但它返回了这个错误:
Error in MEEM(object, conLin, control$niterEM) :
Singularity in backsolve at level 0, block 1
我原始帖子中的代码是我正在使用的确切代码,减去了库(lme4)调用,所以我不会留下任何我能想到的信息。
我的R版本是2.15.2
答案 0 :(得分:10)
如果没有可重复的示例,很难确定:How to make a great R reproducible example?
但是,猜测:这些问题通常是由于设计矩阵中的共线性造成的。集中连续预测器(intdiff
)可能会有所帮助。您也可以直接探索设计矩阵
X <- model.matrix( ~ stress_limit * word_position * follows, data)
对之间的共线性:cor(X)
。不幸的是,我没有建议检测多 - 共线性(即不在对之间,但在> 2个预测变量的组合之间),尽管你可以查看工具计算方差通胀因素(例如library("sos"); findFn("VIF")
)。
作为交叉检查,lme
也应该能够处理您的模型:
library(nlme)
lme(intdiff ~ stress_limit * word_position * follows,
random=~1|speaker, data=data)
当我在lme4(available on github)的开发版本中运行测试数据时,我得到Error in lmer(intdiff ~ stress_limit * word_position * follows + (1 | : rank of X = 5 < ncol(X) = 12
。另一方面,使用这个小的输入数据集(6个观察值),没有可能适合12个参数的方法。要确切地说出问题的位置有点困难。您的3个变量的所有12种组合是否实际出现在您的数据中?如果缺少某些内容,那么您需要遵循开发版本帮助中给出的建议:
与一些更简单的建模框架不同,例如'lm'和'glm' 自动检测完全共线的预测变量, '[gn] lmer'无法处理低于满级的设计矩阵。对于 例如,在具有未观察到的交互的模型的情况下 级别的组合,由用户定义一个新变量 (例如,从结果中创建数据中的'ab' “droplevels(相互作用(A,B))”)。
特别是,您可以按如下方式拟合此模型:
data <- transform(data,
allcomb=interaction(stress_limit,word_position,follow,drop=TRUE))
lme(intdiff ~ allcomb, random=~1|speaker, data=data)
这将为您提供单向ANOVA,将数据中实际存在的级别的唯一组合视为类别。你必须弄清楚他们的意思。
另一种方法是减少模型中的交互次数,直到找到没有任何缺失组合的集合;如果你很幸运(stress_limit+word_position+follow)^2
(所有双向互动)都会有效,但你可能还需要进一步缩小模型(例如stress_limit + word_position*follow
)。
另一种测试方法是在您提出的模型上使用lm()
,并检查估算系数中没有NA
个值。
你将在这些方面失去的主要是方便/易于解释,因为无论如何都无法从数据中估计缺失组合的参数......