2016-10-14 12 views
0

Я использую некоторые алгоритмы, которые используют приблизительное байесовское вычисление (например, см. Toni et al., 2009), и они требуют многократного решения системы уравнений Лотки-Вольтерра со случайно генерируемым набором входных данных параметры. Я использую функцию lsoda от deSolve package.Подавить ошибку от deSolve :: lsoda

Иногда эта функция вызывает ошибку, и я надеялся проигнорировать это, используя функцию try(..., silent = TRUE), хотя это, похоже, не работает (см. Пример ниже). Установка options(show.error.messages = FALSE) не работает.

Как отключить печать сообщения об ошибке от deSolve :: lsoda?

require(deSolve) 

# Differential equations defining the system 
LV <- function(Time, State, Pars){ 

    with(as.list(c(State, Pars)), { 

    dx <- a*x - x*y 
    dy <- b*x*y - y 

    return(list(c(dx, dy))) 
    } 
    ) 
} 

# Parameters 
pars <- c(a = 1.0, b = 1.0) 

# Initial conditions 
init <- c(x = 1.0, y = 0.5) 

# Time steps 
times <- seq(0, 15, length.out = 100) 

problem_seeds <- c(7, 241, 361, 365, 468, 473, 649, 704, 724, 745, 838) 

for (i in problem_seeds){ 
    set.seed(i) 

    # Sample from pi(theta), prior for parameter vector (a, b) 
    theta_star <- runif(2, -10, 10) 
    names(theta_star) <- c("a", "b") 

    # Simulate a dataset using these parameters (at the specified times) 
    try(out <- lsoda(func = LV, 
      y = init, 
      parms = theta_star, 
      times = times), 
      silent = TRUE) 
    dfs <- as.data.frame(out) 
} 

ответ

2

Посмотрите на странице 44 виньетки в deSolve, такая ошибка описана here.

Вы можете решить эту проблему в уменьшении абсолютного допуска решения. В вашем примере, следующий подход работает:

out <- lsoda(func = LV, 
      y = init, 
      parms = theta_star, 
      times = times, 
      atol = 1e-3) 

Примечание: ваш data.frame dfs будут перезаписаны в каждом цикле, и если вы хотите, чтобы выход из problem_seeds в data.frame, вы можете запустить fuinction из семья apply. И теперь вам не нужна функция try.

+0

Это полезная работа. Re: переписывание df - это всего лишь небольшая часть алгоритма ABC (просто для воспроизведения проблемы), в главном алгоритме используется датафрейм перед перезаписью. Я подожду, чтобы узнать, есть ли у кого-то мысли о том, как подавить ошибку. Большое спасибо за ответ. –

+1

Вы читали это? https://stat.ethz.ch/pipermail/r-sig-dynamic-models/2013q1/000164.html –

+0

Я пробовал Google и SO, но не видел этого. Спасибо, что поделился! Похоже, что проблема все еще присутствует в 2016 году после публикации в 2013 году. О, хорошо, я попробую обход, который они предлагают. Спасибо. –

Смежные вопросы