如何在 lme4 中获取收敛错误消息或最大梯度
How to get convergence error messages or max gradient in lme4
在使用 lme4 建立随机效应模型后,如何获得最大梯度值?默认大于0.002就显示,但是我想做一个原函数如下,需要一个最大梯度的返回值,是否大于0.002。
- 做原始模型
MM<- lmer(Y ~ 1 + X + (1 |cluster_ID ), data=data)
summary(MM)
- 如果上述原始模型的最大梯度大于0.002,则进行以下处理。
MM_par <- getME(MM, c("theta", "fixef"))
RS_MM <- update(MM, start=MM_par, control=lmerControl(optCtrl = list(maxeval=1e4)))
summary(RS_MM)
示例:
library(lme4)
fm1 <- lmer(Reaction~Days+(Days|Subject), sleepstudy)
提取 @optinfo
插槽并查看其中的内容:
names(fm1@optinfo)
检查 $derivs
元素:
fm1@optinfo$derivs
这是渐变:
max(abs(fm1@optinfo$derivs$gradient))
但是我们想要缩放渐变(感谢@RobertLong的提醒)
dd <- fm1@optinfo$derivs
sc_grad <- with(dd, solve(Hessian, gradient))
max(abs(sc_grad))
笔记
- 直接通过
@
提取插槽并不能100%保证future-proof(尽管lme4
相当稳定)
- 增加最大评估次数实际上不会改变最大梯度。您可能会考虑 tightening/decreasing 收敛公差(参见
?lme4::convergence
)
你可以得到收敛误差:
myModel@optinfo$conv$lme4
你可以获得最大梯度:
myModel@optinfo$derivs %>% with(. , solve(Hessian, gradient)) %>% abs() %>% max()
在使用 lme4 建立随机效应模型后,如何获得最大梯度值?默认大于0.002就显示,但是我想做一个原函数如下,需要一个最大梯度的返回值,是否大于0.002。
- 做原始模型
MM<- lmer(Y ~ 1 + X + (1 |cluster_ID ), data=data)
summary(MM)
- 如果上述原始模型的最大梯度大于0.002,则进行以下处理。
MM_par <- getME(MM, c("theta", "fixef"))
RS_MM <- update(MM, start=MM_par, control=lmerControl(optCtrl = list(maxeval=1e4)))
summary(RS_MM)
示例:
library(lme4)
fm1 <- lmer(Reaction~Days+(Days|Subject), sleepstudy)
提取 @optinfo
插槽并查看其中的内容:
names(fm1@optinfo)
检查 $derivs
元素:
fm1@optinfo$derivs
这是渐变:
max(abs(fm1@optinfo$derivs$gradient))
但是我们想要缩放渐变(感谢@RobertLong的提醒)
dd <- fm1@optinfo$derivs
sc_grad <- with(dd, solve(Hessian, gradient))
max(abs(sc_grad))
笔记
- 直接通过
@
提取插槽并不能100%保证future-proof(尽管lme4
相当稳定) - 增加最大评估次数实际上不会改变最大梯度。您可能会考虑 tightening/decreasing 收敛公差(参见
?lme4::convergence
)
你可以得到收敛误差:
myModel@optinfo$conv$lme4
你可以获得最大梯度:
myModel@optinfo$derivs %>% with(. , solve(Hessian, gradient)) %>% abs() %>% max()