在R中引导lmer回归系数时的错误消息

时间:2018-01-30 00:48:24

标签: r

我有以下型号:

res7=lmer(Residence_time~Species+Sex+(1|Chamber), data=ResidTimes, REML=FALSE)

物种和性别是两个层面的因素。此模型提供以下输出:

    Linear mixed model fit by maximum likelihood  ['lmerMod']
    Formula: Residence_time ~ Species + Sex + (1 | Chamber)
       Data: ResidTimes

         AIC      BIC   logLik deviance df.resid 
      2103.2   2124.0  -1046.6   2093.2      471 

    Scaled residuals: 
        Min      1Q  Median      3Q     Max 
    -1.4434 -0.7568 -0.3249  0.7676  2.5752 

    Random effects:
     Groups   Name        Variance Std.Dev.
     Chamber  (Intercept) 0.247    0.497   
     Residual             4.585    2.141   
    Number of obs: 476, groups:  Chamber, 27

    Fixed effects:
                  Estimate Std. Error t value
    (Intercept)     5.0674     0.1846  27.454
    Speciesrubrus  -1.0195     0.2180  -4.676
    Sexmale         0.3949     0.2021   1.954

    Correlation of Fixed Effects:
                (Intr) Spcsrb
    Speciesrbrs -0.457       
    Sexmale     -0.531  0.154

此模型的残差不正常,因此我想使用参数自举来引导参数估计值。为此,我做了以下事情:

library(boot)
b_par7<-bootMer(x=res7,FUN=fixef,nsim=2000, use.u = FALSE, type="parametric")

但是我收到以下警告信息:

    Warning messages:
    1: In optwrap(object@optinfo$optimizer, ff, x0, lower = lower, control = control$optCtrl,  :
      convergence code 3 from bobyqa: bobyqa -- a trust region step failed to reduce q
    2: In optwrap(object@optinfo$optimizer, ff, x0, lower = lower, control = control$optCtrl,  :
      convergence code 3 from bobyqa: bobyqa -- a trust region step failed to reduce q

有什么办法可以解决这个错误,还是我需要运行较少数量的bootstrap重复?

1 个答案:

答案 0 :(得分:1)

因此,优化程序失败k = 2次R = 2000次尝试重新拟合模型以获取数据的随机子样本。无论如何调整优化器,在困难的情况下它仍会偶尔失败,特别是因为我们希望将R设置得尽可能大,以便获得更准确的统计数据。

当我们等待更好(更稳定)的优化器开发时,我建议将这些警告静音

be.quiet <- capture.output(b_par7 <- bootMer(...), type="message")

并使用剩余的R-k = 1998重新采样来计算你的引导统计数据。再次尝试通过使用多个带

的CPU来获得更多的重新采样,例如R = 2e4
options(boot.parallel="multicore")
options(boot.ncpus=4)

P.S。为了确保boot.ci()永远不会崩溃,但总是返回置信区间或c(NA,NA),你可以像这样包装它。 R =非失败重采样的实际数量。

tt <- tryCatch(boot::boot.ci(b_par7, index=i, type="perc")$percent[4:5], 
               error = function(e) c(NA,NA))
if( length(tt)<2 ) tt <- c(NA,NA)  # catch peculiar boot.ci error reported by "print"

c(R = sum(!is.na(b_par7$t[,i])), lower.CI = tt[1], upper.CI = tt[2])