复本
例如,我可以通过使用isSingular()函数来评估这个多级模型是否为奇异拟合。
同样,我是否可以知道这个模式是融合了还是失败了呢?
我的顾问说,如果模型不能收敛,标准误差就无法估计。然而,尽管以下内容未能收敛,但似乎估计了一个标准错误。
是否有任何好的指标表明该模型已收敛或未能收敛?(注意到警告讯息除外)
我正在使用lme4包和lmer()函数。
例如,有一个失败的收敛多层模型的例子。
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。
然而,标准误差似乎是估计出来的,尽管它不能收敛。
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(上面的数据和代码不是我的模型,我从堆栈溢出问题中复制和粘贴了这些数据和代码。)
总之,我的问题是
之外,是否有任何明确的函数或方法通知此函数是否已收敛或失败?
(就像评估奇点一样,isSingular()函数给出了明确的指示)
最终的目的是为了我的仿真研究,我将计算收敛速度。
发布于 2022-05-05 13:54:32
我的顾问说,如果模型不能收敛,标准误差将不会被估计。然而,尽管以下内容未能收敛,但似乎估计了一个标准错误。
您向展示的模型已经收敛。你之所以知道这一点,是因为这条信息:
optimizer (nloptwrap) convergence code: 0 (OK)如果没有收敛,您就会看到这样的警告:
In checkConv(attr(opt, "derivs"), opt$par, ctrl = control$checkConv, :
Model failed to converge: degenerate Hessian with 1 negative eigenvalues但是,如下一行所示,它已经收敛到了奇异匹配:
boundary (singular) fit: see ?isSingular除了注意警告消息外,是否有任何明确的函数或方法通知此函数是否已收敛或失败?
为此,我使用以下助手函数:
# 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。
继续前进:
为什么在模型无法收敛时仍估计标准误差?
嗯,正如上面提到的,它已经收敛了,而您的顾问在这里错了:
我的顾问说,如果模型不能收敛,标准误差将不会被估计。
如果模型不能收敛,它将输出在最后一次迭代中得到的估计值,然后放弃。
https://stackoverflow.com/questions/72090177
复制相似问题