nlme出错

时间:2011-10-27 22:56:02

标签: r

对于来自IGF库的nlme数据,我收到此错误消息:

lme(conc ~ 1, data=IGF, random=~age|Lot)
Error in lme.formula(conc ~ 1, data = IGF, random = ~age | Lot) : 
  nlminb problem, convergence error code = 1
  message = iteration limit reached without convergence (10)

但是这个代码的一切都很好

lme(conc ~ age, data=IGF)
Linear mixed-effects model fit by REML
  Data: IGF 
  Log-restricted-likelihood: -297.1831
  Fixed: conc ~ age 
 (Intercept)          age 
 5.374974367 -0.002535021 

Random effects:
 Formula: ~age | Lot
 Structure: General positive-definite
            StdDev      Corr  
(Intercept) 0.082512196 (Intr)
age         0.008092173 -1    
Residual    0.820627711       

Number of Observations: 237
Number of Groups: 10 

由于IGFgroupedData,因此两个代码都相同。我很困惑为什么第一个代码会产生错误。感谢您的时间和帮助。

2 个答案:

答案 0 :(得分:5)

如果您绘制数据,您可以看到age没有效果,所以尽管如此,尝试拟合age的随机效果似乎很奇怪。难怪它没有融合。

library(nlme)
library(ggplot2)

dev.new(width=6, height=3)
qplot(age, conc, data=IGF) + facet_wrap(~Lot, nrow=2) + geom_smooth(method='lm')

enter image description here

我认为你想要做的是模拟Lot对拦截的随机效果。我们可以尝试将age作为固定效果包含在内,但我们会发现它并不重要且可以被抛弃:

> summary(lme(conc ~ 1 + age, data=IGF, random=~1|Lot))
Linear mixed-effects model fit by REML
 Data: IGF 
       AIC      BIC    logLik
  604.8711 618.7094 -298.4355

Random effects:
 Formula: ~1 | Lot
        (Intercept) Residual
StdDev:  0.07153912 0.829998

Fixed effects: conc ~ 1 + age 
                Value  Std.Error  DF  t-value p-value
(Intercept)  5.354435 0.10619982 226 50.41849  0.0000
age         -0.000817 0.00396984 226 -0.20587  0.8371
 Correlation: 
    (Intr)
age -0.828

Standardized Within-Group Residuals:
        Min          Q1         Med          Q3         Max 
-5.46774548 -0.43073893 -0.01519143  0.30336310  5.28952876 

Number of Observations: 237
Number of Groups: 10 

答案 1 :(得分:4)

我发现另一个较旧的答案不能令人满意。我区分的情况是,在统计上,年龄没有影响,相反,我们遇到计算错误。就个人而言,我通过混淆这两个案件犯了职业错误。 R已经发出了后者的信号,我想深入了解为什么会这样。

OP指定的模型是增长模型,具有随机斜率和截距。包括一个大的拦截但不是一个大的年龄斜坡。通过拟合随机斜率而不添加其“大”项而施加的一个令人讨厌的约束是,您迫使随机斜率具有0均值,这是非常难以优化的。边际模型表明年龄在模型中与0没有统计学上显着的不同值。此外,将年龄添加为固定效应并不能解决问题。

> lme(conc~ age, random=~age|Lot, data=IGF)
Error in lme.formula(conc ~ age, random = ~age | Lot, data = IGF) : 
  nlminb problem, convergence error code = 1
  message = iteration limit reached without convergence (10)

这里的错误是显而易见的。设置迭代次数可能很诱人。 lmeControl有许多迭代估计。但即使这样也行不通:

> fit <- lme(conc~ 1, random=~age|Lot, data=IGF, 
control = lmeControl(maxIter = 1e8, msMaxIter = 1e8))

Error in lme.formula(conc ~ 1, random = ~age | Lot, 
data = IGF, control = lmeControl(maxIter = 1e+08,  : 
  nlminb problem, convergence error code = 1
  message = singular convergence (7)

因此,这不是一个精确的事情,优化器正在超出范围。

您建议拟合的两个模型之间必须存在关键差异,以及诊断您发现的错误的方法。一种简单的方法是为有问题的模型指定“详细”:

> lme(conc~ 1, random=~age|Lot, data=IGF, control = lmeControl(msVerbose = TRUE))
  0:     602.96050:  2.63471  4.78706  141.598
  1:     602.85855:  3.09182  4.81754  141.597
  2:     602.85312:  3.12199  4.97587  141.598
  3:     602.83803:  3.23502  4.93514  141.598
   (truncated)
 48:     602.76219:  6.22172  4.81029  4211.89
 49:     602.76217:  6.26814  4.81000  4425.23
 50:     602.76216:  6.31630  4.80997  4638.57
 50:     602.76216:  6.31630  4.80997  4638.57

第一个词是REML(我认为)。第二到第四项是类lmeStlmeStructIntlmeStruct中名为modelStruct的对象的参数。如果你使用Rstudio的调试器来检查这个对象的属性(问题的关键),你会发现它是在这里爆炸的随机效果组件。 50次迭代后coef(lmeSt)生成 reStruct.Lot1 reStruct.Lot2 reStruct.Lot3 6.316295 4.809975 4638.570586

如上所示并产生

> coef(lmeSt, unconstrained = FALSE)

    reStruct.Lot.var((Intercept)) reStruct.Lot.cov(age,(Intercept)) 
                         306382.7                         2567534.6 
            reStruct.Lot.var(age) 
                       21531399.4 

相同
Browse[1]> lmeSt$reStruct$Lot
Positive definite matrix structure of class pdLogChol representing
            (Intercept)      age
(Intercept)    306382.7  2567535
age           2567534.6 21531399

所以很明显随机效应的协方差在这里为这个特定的优化器爆发了。 nlminb中的PORT例程因其无法解释的错误而受到批评。来自David Gay(贝尔实验室)的文本在这里http://ms.mcmaster.ca/~bolker/misc/port.pdf PORT文档表明我们的错误7来自使用10亿iter max“x可能有太多免费组件。参见§5。”。我们应该问,是否存在应该产生类似结果的近似结果,而不是修复算法。例如,很容易拟合lmList对象来得出随机截距和随机斜率方差:

> fit <- lmList(conc ~ age | Lot, data=IGF)
> cov(coef(fit))
            (Intercept)          age
(Intercept)  0.13763699 -0.018609973
age         -0.01860997  0.003435819

虽然理想情况下这些将按其各自的精确权重进行加权:

要使用nlme包,我注意到使用BFGS的无约束优化不会产生这样的错误,并且会得到类似的结果:

> lme(conc ~ 1, data=IGF, random=~age|Lot, control = lmeControl(opt = 'optim'))
Linear mixed-effects model fit by REML
  Data: IGF 
  Log-restricted-likelihood: -292.9675
  Fixed: conc ~ 1 
(Intercept) 
   5.333577 

Random effects:
 Formula: ~age | Lot
 Structure: General positive-definite, Log-Cholesky parametrization
            StdDev      Corr  
(Intercept) 0.032109976 (Intr)
age         0.005647296 -0.698
Residual    0.820819785       

Number of Observations: 237
Number of Groups: 10 

可以使用MUCH更简单的lme4包完成此类模型的替代语法声明:

library(lme4)
lmer(conc ~ 1 + (age | Lot), data=IGF)

产生:

> lmer(conc ~ 1 + (age | Lot), data=IGF)
Linear mixed model fit by REML ['lmerMod']
Formula: conc ~ 1 + (age | Lot)
   Data: IGF
REML criterion at convergence: 585.7987
Random effects:
 Groups   Name        Std.Dev. Corr 
 Lot      (Intercept) 0.056254      
          age         0.006687 -1.00
 Residual             0.820609      
Number of obs: 237, groups:  Lot, 10
Fixed Effects:
(Intercept)  
      5.331 

lmer及其优化器的属性是非常接近1,0或-1的随机效应相关性被简单地设置为这些值,因为它简化了优化(以及估计的统计效率)基本上

总而言之,表明年龄没有效果,如前所述,数字结果可以支持这个论点。