如何在 modelr/tidyverse 引导期间使用 tryCatch()?
How to use tryCatch() during bootstrapping with modelr/tidyverse?
这个问题类似于 Using tryCatch() to catch a bootstrap loop,但我无法使用 bootstrapping 的 tidyverse 方法将这些建议应用到我的案例中。我正在尝试从复杂的混合效应模型中获取系数的置信区间估计值,但某些模型在 bootstrap 期间失败,从而停止了整个 bootstrapping 过程。我想忽略这些失败的运行(但也计算并存储它们以知道它们是什么)并继续 bootstrap。我也乐于接受将引导包与 tryCatch 一起使用的建议。使用钻石数据集的示例:
diamonds <- diamonds
diamonds$clarity <- factor(diamonds$clarity, ordered=FALSE)
diamonds$cut <- factor(diamonds$cut, ordered=FALSE)
diamonds$color <- factor(diamonds$color, ordered=FALSE)
diamonds <- diamonds[diamonds$price <= 500,] # truncate the data set for faster processing
随机的无意义模型,但运行时没有错误:
my_mod <- glmmTMB(carat ~
cut*x*poly(depth,3) + table + price +
(1|color) + (1|clarity),
REML=TRUE,
data = diamonds)
summary(my_mod)
我想在 'clarity' 的水平上进行替换抽样(即,通过集群,而不是观察)。
set.seed(30)
my_boot <- diamonds %>%
modelr::bootstrap(n = 20, id = 'clarity') %>%
group_by(clarity) %>%
mutate(fit = map(strap,
~glmmTMB(carat ~
cut*x*poly(depth,3) +
table + price +
(1|color) + (1|clarity),
REML=T,
data = data.frame(.))))
Warning message:
In fitTMB(TMBStruc) :
Model convergence problem; false convergence (8). See vignette('troubleshooting')
只需将 tryCatch
包裹在对 glmmTMB
的调用周围。并编写 error
和 warning
函数。
类型的错误信息
Timing stopped at: 0.484 0.071 0.556
Timing stopped at: 0.919 0.052 0.972
Timing stopped at: 0.542 0.04 0.583
仍会显示,但 my_boot$fit
会出现错误或警告。
set.seed(30)
my_boot <- diamonds %>%
modelr::bootstrap(n = 20, id = 'clarity') %>%
group_by(clarity) %>%
mutate(fit = map(strap,
~tryCatch(glmmTMB(carat ~
cut*x*poly(depth,3) +
table + price +
(1|color) + (1|clarity),
REML=T,
data = data.frame(.)),
error = function(e) e,
warning = function(w) w)))
然后您可以使用
检查结果
err <- sapply(my_boot$fit, inherits, "error")
warn <- sapply(my_boot$fit, inherits, "warning")
ok <- !(err | warn)
并使用这些向量对列表进行子集化 my_boot
。例如:
my_boot[ok]
err
和 warn
也一样。
这个问题类似于 Using tryCatch() to catch a bootstrap loop,但我无法使用 bootstrapping 的 tidyverse 方法将这些建议应用到我的案例中。我正在尝试从复杂的混合效应模型中获取系数的置信区间估计值,但某些模型在 bootstrap 期间失败,从而停止了整个 bootstrapping 过程。我想忽略这些失败的运行(但也计算并存储它们以知道它们是什么)并继续 bootstrap。我也乐于接受将引导包与 tryCatch 一起使用的建议。使用钻石数据集的示例:
diamonds <- diamonds
diamonds$clarity <- factor(diamonds$clarity, ordered=FALSE)
diamonds$cut <- factor(diamonds$cut, ordered=FALSE)
diamonds$color <- factor(diamonds$color, ordered=FALSE)
diamonds <- diamonds[diamonds$price <= 500,] # truncate the data set for faster processing
随机的无意义模型,但运行时没有错误:
my_mod <- glmmTMB(carat ~
cut*x*poly(depth,3) + table + price +
(1|color) + (1|clarity),
REML=TRUE,
data = diamonds)
summary(my_mod)
我想在 'clarity' 的水平上进行替换抽样(即,通过集群,而不是观察)。
set.seed(30)
my_boot <- diamonds %>%
modelr::bootstrap(n = 20, id = 'clarity') %>%
group_by(clarity) %>%
mutate(fit = map(strap,
~glmmTMB(carat ~
cut*x*poly(depth,3) +
table + price +
(1|color) + (1|clarity),
REML=T,
data = data.frame(.))))
Warning message:
In fitTMB(TMBStruc) :
Model convergence problem; false convergence (8). See vignette('troubleshooting')
只需将 tryCatch
包裹在对 glmmTMB
的调用周围。并编写 error
和 warning
函数。
Timing stopped at: 0.484 0.071 0.556
Timing stopped at: 0.919 0.052 0.972
Timing stopped at: 0.542 0.04 0.583
仍会显示,但 my_boot$fit
会出现错误或警告。
set.seed(30)
my_boot <- diamonds %>%
modelr::bootstrap(n = 20, id = 'clarity') %>%
group_by(clarity) %>%
mutate(fit = map(strap,
~tryCatch(glmmTMB(carat ~
cut*x*poly(depth,3) +
table + price +
(1|color) + (1|clarity),
REML=T,
data = data.frame(.)),
error = function(e) e,
warning = function(w) w)))
然后您可以使用
检查结果err <- sapply(my_boot$fit, inherits, "error")
warn <- sapply(my_boot$fit, inherits, "warning")
ok <- !(err | warn)
并使用这些向量对列表进行子集化 my_boot
。例如:
my_boot[ok]
err
和 warn
也一样。