首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我如何知道模型是收敛的,还是没有在r中的警告消息下在lme4中收敛?

我如何知道模型是收敛的,还是没有在r中的警告消息下在lme4中收敛?
EN

Stack Overflow用户
提问于 2022-05-02 17:21:54
回答 1查看 404关注 0票数 3

复本

例如,我可以通过使用isSingular()函数来评估这个多级模型是否为奇异拟合。

同样,我是否可以知道这个模式是融合了还是失败了呢?

我的顾问说,如果模型不能收敛,标准误差就无法估计。然而,尽管以下内容未能收敛,但似乎估计了一个标准错误。

是否有任何好的指标表明该模型已收敛或未能收敛?(注意到警告讯息除外)

我正在使用lme4包和lmer()函数。

例如,有一个失败的收敛多层模型的例子。

代码语言:javascript
复制
library(lme4)
read.table(textConnection("duration season  sites   effect
                          4d    mon s1  7305.91
                          4d    mon s2  856.297
                          4d    mon s3  649.93
                          4d    mon s1  10121.62
                          4d    mon s2  5137.85
                          4d    mon s3  3059.89
                          4d    mon s1  5384.3
                          4d    mon s2  5014.66
                          4d    mon s3  3378.15
                          4d    post    s1  6475.53
                          4d    post    s2  2923.15
                          4d    post    s3  554.05
                          4d    post    s1  7590.8
                          4d    post    s2  3888.01
                          4d    post    s3  600.07
                          4d    post    s1  6717.63
                          4d    post    s2  1542.93
                          4d    post    s3  1001.4
                          4d    pre s1  9290.84
                          4d    pre s2  2199.05
                          4d    pre s3  1149.99
                          4d    pre s1  5864.29
                          4d    pre s2  4847.92
                          4d    pre s3  4172.71
                          4d    pre s1  8419.88
                          4d    pre s2  685.18
                          4d    pre s3  4133.15
                          7d    mon s1  11129.86
                          7d    mon s2  1492.36
                          7d    mon s3  1375
                          7d    mon s1  10927.16
                          7d    mon s2  8131.14
                          7d    mon s3  9610.08
                          7d    mon s1  13732.55
                          7d    mon s2  13314.01
                          7d    mon s3  4075.65
                          7d    post    s1  11770.79
                          7d    post    s2  4254.88
                          7d    post    s3  753.2
                          7d    post    s1  11324.95
                          7d    post    s2  5133.76
                          7d    post    s3  2156.2
                          7d    post    s1  12103.76
                          7d    post    s2  3143.72
                          7d    post    s3  2603.23
                          7d    pre s1  13928.88
                          7d    pre s2  3208.28
                          7d    pre s3  8015.04
                          7d    pre s1  11851.47
                          7d    pre s2  6815.31
                          7d    pre s3  8478.77
                          7d    pre s1  13600.48
                          7d    pre s2  1219.46
                          7d    pre s3  6987.5
                          "),header=T)->dat1

lmer(effect ~ duration + (1+duration|sites) +(1+duration|season),
                                  data=dat1)

这将生成错误警告信息:模型未能收敛到一个负特征值:-2.3e+01。

然而,标准误差似乎是估计出来的,尽管它不能收敛。

代码语言:javascript
复制
Linear mixed model fit by REML. t-tests use Satterthwaite's method ['lmerModLmerTest']
Formula: effect ~ duration + (1 + duration | sites) + (1 + duration |      season)
   Data: dat1

REML criterion at convergence: 969

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-2.0515 -0.6676  0.0075  0.5333  3.2161 

Random effects:
 Groups   Name        Variance Std.Dev. Corr
 sites    (Intercept) 8033602  2834         
          duration7d  1652488  1285     1.00
 season   (Intercept)       0     0         
          duration7d  1175980  1084      NaN
 Residual             5292365  2301         
Number of obs: 54, groups:  sites, 3; season, 3

Fixed effects:
            Estimate Std. Error       df t value Pr(>|t|)  
(Intercept) 4183.896   1695.252    2.008   2.468    0.132  
duration7d  3265.641   1155.357    3.270   2.827    0.060 .
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
           (Intr)
duration7d 0.520 
optimizer (nloptwrap) convergence code: 0 (OK)
boundary (singular) fit: see ?isSingular

(上面的数据和代码不是我的模型,我从堆栈溢出问题中复制和粘贴了这些数据和代码。)

总之,我的问题是

  1. 除了注意警告消息

之外,是否有任何明确的函数或方法通知此函数是否已收敛或失败?

(就像评估奇点一样,isSingular()函数给出了明确的指示)

  1. 为什么在模型无法收敛时仍估计标准误差?

最终的目的是为了我的仿真研究,我将计算收敛速度。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-05-05 13:54:32

我的顾问说,如果模型不能收敛,标准误差将不会被估计。然而,尽管以下内容未能收敛,但似乎估计了一个标准错误。

您向展示的模型已经收敛。你之所以知道这一点,是因为这条信息:

代码语言:javascript
复制
optimizer (nloptwrap) convergence code: 0 (OK)

如果没有收敛,您就会看到这样的警告:

代码语言:javascript
复制
In checkConv(attr(opt, "derivs"), opt$par, ctrl = control$checkConv,  :
Model failed to converge: degenerate  Hessian with 1 negative eigenvalues

但是,如下一行所示,它已经收敛到了奇异匹配:

代码语言:javascript
复制
boundary (singular) fit: see ?isSingular

除了注意警告消息外,是否有任何明确的函数或方法通知此函数是否已收敛或失败?

为此,我使用以下助手函数:

代码语言:javascript
复制
# helper function
# Has the model converged ?

hasConverged <- function (mm) {
  
  if ( !inherits(mm, "merMod")) stop("Error: must pass a lmerMod object")
  
  retval <- NULL
  
  if(is.null(unlist(mm@optinfo$conv$lme4))) {
    retval = 1
  }
  else {
    if (isSingular(mm)) {
      retval = 0
    } else {
      retval = -1
    }
  }
  return(retval)
}

如果模型正常收敛(即不收敛到奇异拟合),则返回1;如果模型收敛到奇异拟合,则返回0;如果模型不能收敛,则返回-1。另一种方法是按照@SamR的注释将警告传递到错误:

通常,如果警告不够,可以将警告转换为带有选项(

,warn=2)的错误,这意味着操作将结束,因此不应获得任何标准错误或其他输出。只需记住之后将警告设置为1。

继续前进:

为什么在模型无法收敛时仍估计标准误差?

嗯,正如上面提到的,它已经收敛了,而您的顾问在这里错了:

我的顾问说,如果模型不能收敛,标准误差将不会被估计。

如果模型不能收敛,它将输出在最后一次迭代中得到的估计值,然后放弃。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72090177

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档