使用 purrr::possibly() 捕捉 non-positive 定矩阵

Using purrr::possibly() to catch non-positive definite matrix

我正在使用 nlmelme 函数对混合效应模型进行分层分析,因此使用 purrrmap 函数。有时,观察的数量太少,我从 nlme 得到错误,认为矩阵是 non-positive 确定的。出现以下两个错误之一:

与其停止一切,不如在发生错误时使用 purrr::possibly() 替换“NA”。

这里有一个简单的例子来说明这个问题。

library(nlme)
library(purrr)
set.seed(423)
 fm2 <- nlme::lme(distance ~ age + Sex, data = Orthodont[sample(108, 3), ], random = ~ 1)
# Error in chol.default((value + t(value))/2) : 
#  the leading minor of order 1 is not positive definite


## Using purrr::possibly()
set.seed(423)
fm2 <- purrr::possibly(
lme(distance ~ age + Sex, data = Orthodont[sample(108, 3), ], random = ~ 1), 
NA
)
# Error in chol.default((value + t(value))/2) : 
#   the leading minor of order 1 is not positive definite

因为我在 nlme 函数上使用 possibly() 而不是 lme() 中的函数,这可以解释为什么 possibly() 不起作用吗?

谢谢

Session 信息

R version 4.2.0 (2022-04-22 ucrt)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows 10 x64 (build 19042), RStudio 2022.2.2.485

Locale:
  LC_COLLATE=English_United States.utf8  LC_CTYPE=English_United States.utf8    LC_MONETARY=English_United States.utf8
  LC_NUMERIC=C                           LC_TIME=English_United States.utf8    

Package version:
  lattice_0.20.45 magrittr_2.0.3  nlme_3.1-157    purrr_0.3.4      rlang_1.0.2       

possibly 将函数作为输入。我们可以做到

lme2 <- purrr::possibly(lme, otherwise = NA)
set.seed(423)
 fm2 <- 
 lme2(distance ~ age + Sex, data = Orthodont[sample(108, 3), ], random = ~ 1)
fm2
[1] NA