Подавить ошибку из deSolve::lsoda

#r #error-handling #ode #differential-equations

#r #обработка ошибок #ode #дифференциальные уравнения

Вопрос:

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

Иногда эта функция выдает ошибку, и я надеялся проигнорировать это с помощью 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)
}
 

Ответ №1:

Посмотрите на страницу 44 виньетки deSolve , здесь описана ошибка такого рода.

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

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

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

Комментарии:

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

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

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