基本问题是你有一个奇异的配合;估计的随机效应方差-协方差矩阵在其可行空间的边界上(等效地,lme4
用于表征方差-协方差矩阵的内部参数之一,必须是非负的,正好为零)。这本身不是优化问题;这通常意味着您的模型对于您的数据来说太复杂了,应该简化(例如,有关更多信息,请参阅GLMM FAQ中的相关部分)。特别是,尽管您的实验设计原则上允许您适应受试者之间的影响和picture_category
ComparisonType
,希望为来自 39 个受试者的随机效应估计一个 4x4 方差-协方差矩阵是非常乐观的。(您可能会遵循 Barr 等人的“保持最大建议”...)
接下来的内容可能比您真正想要的更具技术性,但我将其提供为将来解决此类问题的参考。如果你想忽略你的模型是单数的这一事实(我不推荐),并且你愿意修复当前版本lmerTest
[我正在向维护者发送电子邮件] 中的错误,你可以实际上通过 Kenward-Roger 近似得到这个问题的 p 值:summary(m2, ddf="Kenward-Roger")
虽然它很慢(在我的笔记本电脑上是 163 秒)。
因为lmerTest
拦截错误消息,很难看到发生了什么,我通常尝试lmerTest
从lme4
.
适合型号:
DirectionData <- read.csv("TestData.csv")
library(lme4)
DirectionFit <- lmer(Similarity ~ picture_category * ComparisonType +
(1 + picture_category + ComparisonType|Subject),
data = DirectionData, REML=FALSE)
## Warning messages:
## 1: In checkConv(attr(opt, "derivs"), opt$par, ctrl = control$checkConv, :
## unable to evaluate scaled gradient
## 2: In checkConv(attr(opt, "derivs"), opt$par, ctrl = control$checkConv, :
## Model failed to converge: degenerate Hessian with 1 negative eigenvalues
好的,让我们看看发生了什么。summary(DirectionFit)
,特别是VarCorr(DirectionFit)
,没有向我们显示任何 0 方差或 +/-1 相关性,但拟合仍然是奇异的:
th <- getME(DirectionFit,"theta")
which(th==0)
## Subject.picture_categoryland
## 8
(在实践中测试可能会更好which(th<1e-10)
)
那么这对lmerTest
输出有什么影响呢?
library(lmerTest)
m2 <- as(DirectionFit,"merModLmerTest")
trace("summary",sig="merModLmerTest",browser) ## debug
summary(m2)
当我们深入挖掘时,我们发现问题出在calcApvar
函数中,它有这样的代码:
dd <- devfunTheta(rho$model) ## set up deviance function
h <- myhess(dd, c(rho$thopt, sigma = rho$sigma)) ## compute Hessian
ch <- try(chol(h), silent = TRUE)
如果我们尝试最后一个命令而没有静音/捕获我们得到的错误消息
chol.default(h) 中的错误:10 阶的前导次要不是正定的
基本上,我们不能 Cholesky 分解 Hessian(二阶导数)矩阵,因为它不是正定矩阵:正如您可以在Wikipedia上阅读的那样,Cholesky 分解适用于 PD 矩阵。