r-当lmer模型不收敛时,如何防止模拟停止



我运行了一个模拟,其中有一个类似于的循环

simulate_study <- function(params){
pats <- simulate_pats(params) # a function that simulate the pats data frame
model <- lmer(SFD ~ group*month + (1 + month|id), data=pats, REML=TRUE)
reject <- as.numeric(confint(model, method="Wald")[8, 1] > 0)
return(reject)
}
res <- sapply(1:1000, FUN=simulate_study, params=some_values)

有时模型不收敛,我得到以下错误消息:

Error in eigen(Sigma, symmetric = TRUE) : 
infinite or missing values in 'x'
In addition: Warning message:
In Ops.factor(sd, 2) :
Error in eigen(Sigma, symmetric = TRUE) : 
infinite or missing values in 'x' 

我不在乎这个错误。我希望循环继续运行,但错误使整个循环停止。我试着把这样的东西插入函数

if(is.null(summary(model)$optinfo$message) == FALSE) {return(NA)}

但为时已晚。

我将感谢任何帮助。

尝试tryCatch,因为error=参数使用长度与预期输出相对应的NAs向量示例:

library(lme4)
simulate_study <- function(params) { 
# pats <- simulate_pats(params) # a function that simulate the pats data frame
reject <- tryCatch({
# stop()  ## uncomment line to produce error and see the effect
model <- lmer(Reaction ~ Days + (Days | Subject), sleepstudy, REML=TRUE)
as.numeric(confint(model, method="Wald")[5:6, ] > 0)
}, error=function(e) rep(NA, 4L))
return(reject)
}
replicate(10L, simulate_study(params=0))  ## more suitable than `sapply` here

您也可以尝试使用REML=FALSE, lmerControl(optCtrl=list(maxit=100L)),看看它是否收敛得更好。

最新更新