我问了一个新问题,因为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 谢谢你的帮助!
答案 0 :(得分:3)
基本问题是你有一个单一的契合;估计的随机效应方差 - 协方差矩阵在其可行空间的边界上(等效地,lme4
用于表征方差 - 协方差矩阵的内部参数之一,其必须是非负的,恰好为零)。这不优化问题本身;它通常意味着您的模型对于您的数据来说过于复杂,应该简化(例如,请参阅GLMM FAQ中的相关部分以获取更多信息)。特别是,虽然您的实验设计原则上允许您适应picture_category
和ComparisonType
的效果之间的主题变化,但希望估计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矩阵。