首页 文章

lmer模型和lsmeans输出出错

提问于
浏览
1

我正在使用 lme4 包运行LME模型,然后使用 lsmeans 包跟进成对比较 .

这是我的代码:

lmer_full <- lmer (VOT ~ Place*Laryngeal + (1+Place+Laryngeal|Sp), 
    data = LME,control=lmerControl(optCtrl=list(maxfun=50000)))

lsmeans (lmer_full, pairwise~Laryngeal|Place)

但是,运行 lmer 后,我收到以下错误消息:

固定效应模型矩阵排名不足所以丢弃1列/系数警告消息:1:在checkConv(attr(opt,“derivs”),opt $ par,ctrl = control $ checkConv,:无法评估缩放梯度2:在checkConv(attr(opt,“derivs”)中,opt $ par,ctrl = control $ checkConv,:模型未能收敛:使用1个负特征值退化Hessian

然后运行 lsmeans 后出现另一个错误:

base :: chol2inv(x,...)中的错误:'a'必须是数字矩阵

这是我的数据结构:

data.structure

如果有人能告诉我这个型号有什么问题,我真的很感激 .

1 回答

  • 1

    tl;dr 我可以't exactly reproduce your error, but I can come pretty close. Your data set is most likely too small/noisy for the model you want to fit (you'获得一个奇异的模型);使用 emmeans 包(它是 lsmeans 的后继版)会有所帮助,但你应该简化你的模型 .

    • 从大型完全交叉数据集开始:
    library(lme4)
    library(emmeans)
    dd <- expand.grid(Place=factor(1:3),Laryngeal=factor(1:3),
                      Sp=factor(1:10),rep=6)
    set.seed(101)
    dd$y <- rnorm(nrow(dd))
    
    This works fine:
    
    m1 <- lmer(y~Place*Laryngeal + (1+Place+Laryngeal|Sp), dd)
    emmeans(m1,pairwise~Laryngeal|Place)  ## lsmeans() also works
    
    • 减少数据集(删除一个级别组合)会导致"fixed-effect model matrix is rank deficient"消息,但一切都有效:
    dd_missing <- subset(dd,!(Place=="2" & Laryngeal=="2"))
    m2 <- update(m1, data=dd_missing)
    emmeans(m2,pairwise~Laryngeal|Place) ## lsmeans() also works
    
    • 如果我们随机地对一小部分数据进行子采样,我们就可以得到错误,虽然我不能用我的数据来做,而不是告诉 lmer 忽略数据集的其他一些问题(没有足够的样本来表示随机效应的数量)指定):
    set.seed(102)
    dd_small <- dd_missing[sample(1:nrow(dd_missing),
                                  size=round(nrow(dd_missing)*0.3),
                                  replace=FALSE),]
    m3 <- update(m1, data=dd_small,
                 control=lmerControl(check.nobs.vs.nlev="ignore",
                                     check.nobs.vs.nRE="ignore",
                                     optCtrl=list(maxfun=50000)))
    
    
    emmeans(m3,pairwise~Laryngeal|Place)  ## works (sort of)
    lsmeans::lsmeans(m3,pairwise~Laryngeal|Place)  ## fails
    
    • 最后,简化模型会让事情变得更好:
    m4 <- update(m3, . ~ Place*Laryngeal + (1+Place|Sp))
    emmeans(m4,pairwise~Laryngeal|Place)
    lsmeans::lsmeans(m4,pairwise~Laryngeal|Place)
    

相关问题