我运行了一个模拟,其中有一个类似于的循环
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=
参数使用长度与预期输出相对应的NA
s向量示例:
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))
,看看它是否收敛得更好。