Sha*_*ery 4 r syntax-error lme4 lmer
所以这是我的问题.我在R中有一个数据集,我需要运行混合效果模型.这是代码:
data <- read.csv("D:/blahblah.csv")
analysis.data <- lmer(intdiff ~ stress_limit * word_position * follows + (1|speaker), data)
summary(analysis.data)
Run Code Online (Sandbox Code Playgroud)
当我尝试运行脚本时,它返回以下错误:
Error in mer_finalize(ans) : Downdated X'X is not positive definite, 15.
Run Code Online (Sandbox Code Playgroud)
我已将错误跟踪到"跟随"参数,因为当我只使用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")
Run Code Online (Sandbox Code Playgroud)
我也尝试了lme()函数,但它返回了这个错误:
Error in MEEM(object, conLin, control$niterEM) :
Singularity in backsolve at level 0, block 1
Run Code Online (Sandbox Code Playgroud)
我原来帖子中的代码是我正在使用的确切代码,减去了库(lme4)调用,所以我不会留下任何我能想到的信息.
我的R版本是2.15.2
Ben*_*ker 10
如果没有可重复的例子,很难说清楚:如何制作一个很好的R可重复的例子?
但是,猜测:这些问题通常是由于设计矩阵中的共线性造成的.集中连续预测器(intdiff)可能会有所帮助.您还可以直接探索设计矩阵
X <- model.matrix( ~ stress_limit * word_position * follows, data)
Run Code Online (Sandbox Code Playgroud)
对之间的共线性:cor(X).不幸的是,虽然你可以研究用于计算方差膨胀因子的工具(例如),但我没有建议检测多重共线性(即不在对之间,但在> 2个预测变量的组合之间library("sos"); findFn("VIF")).
作为交叉检查,lme还应该能够处理您的模型:
library(nlme)
lme(intdiff ~ stress_limit * word_position * follows,
random=~1|speaker, data=data)
Run Code Online (Sandbox Code Playgroud)
当我在lme4的开发版本中运行你的测试数据(在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'不能处理低于满秩的设计矩阵.例如,在具有未观察到的级别组合的交互的模型的情况下,由用户定义新变量(例如,根据'droplevels的结果在数据中创建'ab'(交互(a,b)) )").
特别是,您可以按如下方式拟合此模型:
data <- transform(data,
allcomb=interaction(stress_limit,word_position,follow,drop=TRUE))
lme(intdiff ~ allcomb, random=~1|speaker, data=data)
Run Code Online (Sandbox Code Playgroud)
这将为您提供单向ANOVA,将数据中实际存在的级别的唯一组合视为类别.你必须弄清楚他们的意思.
另一种方法是减少模型中的交互次数,直到找到没有任何缺失组合的集合; 如果你很幸运(stress_limit+word_position+follow)^2(所有双向交互)都可以工作,但你可能还需要进一步减少模型(例如stress_limit + word_position*follow).
另一种测试方法是lm()在您提出的模型上使用,并检查NA估计系数中没有值.
你将在这些方面失去的主要是方便/易于解释,因为无论如何都无法从数据中估计缺失组合的参数......
| 归档时间: |
|
| 查看次数: |
11170 次 |
| 最近记录: |