lmer模型和lsmeans输出出错

时间:2018-03-29 04:48:30

标签: r lme4 mixed-models lsmeans

我正在使用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,&#34; derivs&#34;)中,选择$ par,ctrl = control $ checkConv,:     无法评估比例梯度
  2:在checkConv(attr(opt,&#34; derivs&#34;)中,选择$ par,ctrl = control $ checkConv,:     模型未能收敛:使用1个负特征值退化Hessian

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

  

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

以下是我的数据结构:

data.structure

如果有人能告诉我模特的错误,我真的很感激。

1 个答案:

答案 0 :(得分:1)

tl; dr 我无法完全重现您的错误,但我可以非常接近。对于您想要拟合的模型,您的数据集很可能太小/太嘈杂(您获得的是单一模型);使用emmeans包(它是lsmeans的后继包)会有所帮助,但您应该简化模型。

  1. 从大型完全交叉数据集开始:
  2. 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
    
    1. 减少数据集(删除一个级别组合)会导致“固定效应模型矩阵排名不足”的消息,但一切都行不通:
    2. dd_missing <- subset(dd,!(Place=="2" & Laryngeal=="2"))
      m2 <- update(m1, data=dd_missing)
      emmeans(m2,pairwise~Laryngeal|Place) ## lsmeans() also works
      
      1. 如果我们随机对一小部分数据进行二次采样,我们就会得到错误,虽然我不能用我的数据做,但也没有告诉lmer忽略数据集的其他一些问题(样本不够)对于指定的随机效应的数量):
      2. 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
        
        1. 最后,简化模型可以让事情变得更好:
        2. m4 <- update(m3, . ~ Place*Laryngeal + (1+Place|Sp))
          emmeans(m4,pairwise~Laryngeal|Place)
          lsmeans::lsmeans(m4,pairwise~Laryngeal|Place)