问题描述
我想知道是否可以编写逻辑测试(TRUE/FALSE
)来显示lme4
包中的模型是否已经收敛?
下面显示一个示例,我想捕获是否有任何模型带有收敛警告(即Model Failed to converge
)消息?
library(lme4)
dat <- read.csv('https://raw.githubusercontent.com/rnorouzian/e/master/nc.csv')
m <- lmer(math ~ ses*sector + (ses | sch.id),data = dat)
Warning message:
In checkConv(attr(opt,"derivs"),opt$par,ctrl = control$checkConv,:
Model Failed to converge with max|grad| = 0.00279 (tol = 0.002,component 1)
解决方法
我们可以使用tryCatch
,并使用withCallingHandlers
从this帖子中汲取灵感。
dat <- read.csv('https://raw.githubusercontent.com/rnorouzian/e/master/nc.csv')
m <- tryCatch({
withCallingHandlers({
error <- FALSE
list(model = lmer(math ~ ses*sector + (ses | sch.id),data = dat),error = error)
},warning = function(w) {
if(grepl('failed to converge',w$message)) error <<- TRUE
}
)})
m$model
#Linear mixed model fit by REML ['lmerMod']
#Formula: math ~ ses * sector + (ses | sch.id)
# Data: dat
#REML criterion at convergence: 37509.07
#Random effects:
# Groups Name Std.Dev. Corr
# sch.id (Intercept) 1.9053
# ses 0.8577 0.46
# Residual 3.1930
#Number of obs: 7185,groups: sch.id,160
#Fixed Effects:
#(Intercept) ses sector ses:sector
# 11.902 2.399 1.677 -1.322
#convergence code 0; 0 optimizer warnings; 1 lme4 warnings
m$error
#[1] TRUE
输出m
是包含model
和error
元素的列表。
如果在创建模型后需要测试警告,则可以使用:
is_warning_generated <- function(m) {
df <- summary(m)
!is.null(df$optinfo$conv$lme4$messages) &&
grepl('failed to converge',df$optinfo$conv$lme4$messages)
}
m <- lmer(math ~ ses*sector + (ses | sch.id),data = dat)
is_warning_generated(m)
#[1] TRUE
,
我们可以使用safely
中的purrr
。它还将返回error
作为list
元素并捕获错误。如果没有错误,它将为NULL
library(purrr)
safelmer <- safely(lmer,otherwise = NA)
out <- safelmer(math ~ ses*sector + (ses | sch.id),data = dat)