Search code examples
rfor-looperror-handlingstan

skip errors triggered by the package `rstan` in a for loop in R


As stated in the title, I wanted to skip errors triggered by rstan in a for loop in R and let the loop continue running. I know there are similar answers suggesting tryCatch() or try(), such as this. However, they do not work when the error originates from stan within a loop. Here is a minimal example:

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){})
}

The answer is not supposed to fix the negative value, but skipping the stan error in a for loop. Thank you!


Solution

  • My system has troubles to run the stan code but did you try purrrs safely() or 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