lmerTest :: anova没有显示p值

时间:2017-03-04 11:42:36

标签: r lme4 lmertest

我问了一个新问题,因为dublicate(anova() does not display p-value when used with lmerTest)并没有真正提供答案: 我遇到了同样的问题,即lmerTest :: anova不会输出特定模型的自由度和p值(这比上面提到的帖子复杂得多):

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

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

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

1 个答案:

答案 0 :(得分:3)

基本问题是你有一个单一的契合;估计的随机效应方差 - 协方差矩阵在其可行空间的边界上(等效地,lme4用于表征方差 - 协方差矩阵的内部参数之一,其必须是非负的,恰好为零)。这优化问题本身;它通常意味着您的模型对于您的数据来说过于复杂,应该简化(例如,请参阅GLMM FAQ中的相关部分以获取更多信息)。特别是,虽然您的实验设计原则上允许您适应picture_categoryComparisonType的效果之间的主题变化,但希望估计4x4方差 - 协方差矩阵39名受试者的随机效应非常乐观。 (您可能正在关注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矩阵。