(我不确定这是评论还是答案,但它有点长,可能是一个答案。)
- 重现结果困难的近端原因是同时
lme4
使用环境和参考类:这些很难“序列化”,即转换为可以通过dput()
或保存的线性流save()
。(你能试试看save()
它是否比它更好用dput()
吗?
- 此外,环境和引用类都使用“按引用传递”语义,因此对保存的模型进行操作可以更改它。
anova()
自动重新调整模型,这会对保存的模型对象的内部结构进行一些微小但非零的更改(我们仍在尝试追踪这一点)。
- @alexkeil 的评论是错误的:其中使用的非线性优化器
lme4
不使用对伪随机数生成器的任何调用。它们是确定性的(但上面的两点解释了为什么事情看起来有点奇怪)。
为了减轻您对拟合的担忧,我会通过在最终拟合时计算梯度和 Hessian 来检查拟合,例如
library(lme4)
library(numDeriv)
fm1 <- lmer(Reaction ~ Days + (Days | Subject), sleepstudy)
dd <- update(fm1,devFunOnly=TRUE)
params <- getME(fm1,"theta") ## also need beta for glmer fits
grad(dd,params)
## all values 'small', say < 1e-3
## [1] 0.0002462423 0.0003276917 0.0003415010
eigen(solve(hessian(dd,params)),only.values=TRUE)$values
## all values positive and of similar magnitude
## [1] 0.029051631 0.002757233 0.001182232
我们正在实施类似的检查以在lme4
.
也就是说,如果有一种方法可以相对容易地复制它,我仍然很想看看你的例子。
PS:为了使用bobyqa
,您必须要么正在使用,glmer
要么已经使用lmerControl
修改默认优化器选择......??