从R中的lme4包捕获聚合消息

从R中的lme4包捕获聚合消息,r,function,regression,lme4,R,Function,Regression,Lme4,我想知道是否有一种方法可以编写逻辑测试(TRUE/FALSE),以显示lme4包中的模型是否收敛 下面是一个示例,我想捕获是否有任何模型带有收敛警告(即,模型未能收敛)消息 库(lme4) dat我们可以使用tryCatch,使用和callinghandlers从帖子中汲取灵感 我们可以从purr安全地使用。它还将返回错误作为列表元素,并捕获错误。如果没有错误,则为NULL library(purrr) safelmer <- safely(lmer, otherwise = NA) ou

我想知道是否有一种方法可以编写逻辑测试(
TRUE/FALSE
),以显示
lme4
包中的模型是否收敛

下面是一个示例,我想捕获是否有任何模型带有收敛警告(即,
模型未能收敛
)消息

库(lme4)

dat我们可以使用
tryCatch
,使用
和callinghandlers
从帖子中汲取灵感


我们可以从
purr
安全地使用
。它还将返回
错误
作为
列表
元素,并捕获错误。如果没有错误,则为
NULL

library(purrr)
safelmer <- safely(lmer, otherwise = NA)
out <- safelmer(math ~ ses*sector + (ses | sch.id), data = dat)
库(purrr)

谢谢你,罗纳克!因此,对于我们的逻辑测试,我们是否可以编写一个函数,在该函数中,如果模型具有该警告,则该函数将获得一个类似于
m
的模型,并输出
TRUE
,否则输出该警告?您的解决方案需要在列表中重新键入整个模型!就像我说的,我只需要一个函数,它在我的问题中接受一个模型对象,如
m
,并检查是否有警告(返回
TRUE
)或其他
FALSE
。请参阅更新的答案,将模型
m
传递给函数
是否生成警告
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
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
library(purrr)
safelmer <- safely(lmer, otherwise = NA)
out <- safelmer(math ~ ses*sector + (ses | sch.id), data = dat)