0

我问了一个新问题,因为重复( anova( ) 与 lmerTest 一起使用时不显示 p 值)并没有真正提供答案:我遇到了 lmerTest::anova 不会输出自由度和 p 的相同问题-特定模型的值(比上面提到的帖子中的要简单得多):

DirectionFit <- lmer(Similarity ~  picture_category * ComparisonType + (1 + picture_category + ComparisonType|Subject), data = DirectionData, REML=FALSE)

我注意到,模型报告包含收敛代码 0 并且有 2 个优化器警告。可能是因为这个 lmerTest::anova 没有报告 p 值吗?模型本身的输出看起来很正常,只有非常高的 AIC、BIC 等(-10625)。有谁知道该怎么做?我读过也许应该选择另一个优化器,但这也能解决收敛问题吗?任何帮助表示赞赏!

编辑: 我上传了我的数据:http ://www.sharecsv.com/s/1e303e9cef06d02af51ed5231385b759/TestData.csv 谢谢你的帮助!

4

1 回答 1

3

基本问题是你有一个奇异的配合;估计的随机效应方差-协方差矩阵在其可行空间的边界上(等效地,lme4用于表征方差-协方差矩阵的内部参数之一,必须是非负的,正好为零)。这本身不是优化问题;这通常意味着您的模型对于您的数据来说太复杂了,应该简化(例如,有关更多信息,请参阅GLMM FAQ中的相关部分)。特别是,尽管您的实验设计原则上允许您适应受试者之间的影响和picture_categoryComparisonType,希望为来自 39 个受试者的随机效应估计一个 4x4 方差-协方差矩阵是非常乐观的。(您可能会遵循 Barr 等人的“保持最大建议”...)

接下来的内容可能比您真正想要的更具技术性,但我将其提供为将来解决此类问题的参考。如果你想忽略你的模型是单数的这一事实(我不推荐),并且你愿意修复当前版本lmerTest[我正在向维护者发送电子邮件] 中的错误,你可以实际上通过 Kenward-Roger 近似得到这个问题的 p 值:summary(m2, ddf="Kenward-Roger")虽然它很慢(在我的笔记本电脑上是 163 秒)。


因为lmerTest拦截错误消息,很难看到发生了什么,我通常尝试lmerTestlme4.

适合型号:

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 矩阵。

于 2017-03-07T13:43:58.687 回答