使用 purrr::possibly() 捕捉 non-positive 定矩阵
Using purrr::possibly() to catch non-positive definite matrix
我正在使用 nlme 的 lme
函数对混合效应模型进行分层分析,因此使用 purrr的 map
函数。有时,观察的数量太少,我从 nlme 得到错误,认为矩阵是 non-positive 确定的。出现以下两个错误之一:
Error in MEEM(object, conLin, control$niterEM) : Singularity in backsolve at level 0, block 1
Error in chol.default((value + t(value))/2) : the leading minor of order 1 is not positive definite
与其停止一切,不如在发生错误时使用 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
我正在使用 nlme 的 lme
函数对混合效应模型进行分层分析,因此使用 purrr的 map
函数。有时,观察的数量太少,我从 nlme 得到错误,认为矩阵是 non-positive 确定的。出现以下两个错误之一:
Error in MEEM(object, conLin, control$niterEM) : Singularity in backsolve at level 0, block 1
Error in chol.default((value + t(value))/2) : the leading minor of order 1 is not positive definite
与其停止一切,不如在发生错误时使用 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