nlme 示例中的错误消息存在于 R 但不存在于 S

Error message in nlme example present in R but not in S

我正在研究 R 中的 S 和 S-Plus 中的混合效应模型,但某些代码不会产生文本结果。在第 6 章中,其中一个示例无法与提供的代码收敛。

该示例是对 nlme 包提供的 Phenobarb 数据集执行的非线性混合效应模型。

library(nlme)

fm1Pheno.nlme <- nlme(model = conc ~ phenoModel(Subject, time, dose, lCl, lV),
                      data = Phenobarb,
                      fixed = lCl + lV ~ 1,
                      random = pdDiag(lCl + lV ~ 1),
                      start = c(-5,0),
                      na.action = na.pass, 
                      naPattern = ~ !is.na(conc))

fm1Pheno.nlme

第一个模型运行良好,但第二个模型基于第一个

fm2Pheno.nlme <- update( fm1Pheno.nlme,
                         fixed = list(lCl ~ Wt, lV ~ Wt + ApgarInd),
                         start = c(-5.0935, 0, 0.34259, 0, 0),
                         control = list(pnlsTol = 1e-6) )

..returns 错误

Error in nlme.formula(model = conc ~ phenoModel(Subject, time, dose, lCl,  : 
  maximum number of iterations (maxIter = 50) reached without convergence

第二个模型显然在 S 中有效,但在 R 中无效。有人可以提出解决方案吗?错误是由于S和R之间的某些差异造成的吗?

我们可以通过调整pnlsTol参数来解决这个问题:

fm2Pheno.nlme <- update(fm1Pheno.nlme,
                        fixed = list(lCl ~ Wt, lV ~ Wt + ApgarInd),
                        start = c(-5.0935, 0, 0.34259, 0, 0),
                        control = list(pnlsTol = 0.019))

要了解它为什么有意义,请尝试将 msVerbose = TRUE 添加到 control 并查看如果容差参数较低,值如何不断跳跃。增加 pnlsTol 是处理此类收敛问题的一种非常常见的方法,例如,参见