【问题标题】:skip errors triggered by the package `rstan` in a for loop in R在 R 的 for 循环中跳过包 `rstan` 触发的错误
【发布时间】:2020-09-12 21:14:59
【问题描述】:

如标题所述,我想在 R 的 for 循环中跳过由 rstan 触发的错误,让循环继续运行。我知道有类似的答案建议tryCatch()try(),例如this。但是,当错误源自循环内的stan 时,它们不起作用。这是一个最小的例子:

library(rstan)

stancode = 'data {
  int<lower=0> J;          // number of schools
  real y[J];               // estimated treatment effects
  real<lower=0> sigma[J];  // s.e. of effect estimates
}
parameters {
  real mu;
  real<lower=0> tau;
  vector[J] eta;
}
transformed parameters {
  vector[J] theta;
  theta = mu + tau * eta;
}
model {
  target += normal_lpdf(eta | 0, 1);
  target += normal_lpdf(y | theta, sigma);
}'

schools_data <- list(
  J = 8,
  y = c(28,  8, -3,  7, -1,  1, 18, 12),
  sigma = c(-15, 10, 16, 11,  9, 11, 10, 18)#Intentionally created a negative value here
)

for (i in 1:3) {
  tryCatch({fit1 <- stan(model_code  = stancode, data = schools_data,
               chains = 1, iter = 1000, refresh = 0)}, error=function(e){})
}

答案不应该修复负值,而是在 for 循环中跳过 stan 错误。谢谢!

【问题讨论】:

  • 这个答案对你有帮助吗?如果是这样,请将其标记为已接受,以表示社区知道它。否则,请指出缺少的内容。谢谢!

标签: r for-loop error-handling stan


【解决方案1】:

我的系统无法运行 stan 代码,但您尝试过purrrs safely()possibly() 吗?

x <- list(1, "d", 3)
purrr::map(x, ~1/.x)
# error in 1/.x: non numeric argument for binary operator
purrr::map(x, safely(~1/.x))
# [[1]]
# [[1]]$result
# [1] 1
#  
# [[1]]$error
# NULL
#  
#  
# [[2]]
# [[2]]$result
# NULL
#  
# [[2]]$error
# <simpleError in 1/.x: non numeric argument for binary operator>
#   
#   
# [[3]]
# [[3]]$result
# [1] 0.3333333
#  
# [[3]]$error
# NULL

【讨论】:

    猜你喜欢
    • 2013-01-22
    • 2015-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-23
    • 2023-03-08
    • 2014-08-29
    • 2018-01-25
    相关资源
    最近更新 更多