2016-10-14 17 views
0

私は近似ベイジアン計算を使用するいくつかのアルゴリズムを実行しています(例えばToni et al。、2009を参照)。これらは、Lotka-Volterraの方程式をランダムに生成された入力パラメーター。私はdeSolve packageからlsoda関数を使用しています。deSolve :: lsodaからのエラーを抑制する

時々、この関数はエラーをスローし、これは動作しないようですが、try(..., silent = TRUE)関数を使用してこれを無視することを望んでいました(下記の例を参照)。設定options(show.error.messages = FALSE)も動作しません。

deSolve :: lsodaからのエラーメッセージの印刷を抑制するにはどうすればよいですか? deSolveでビネットの44ページで

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

ルックは、この種のエラーはhereに記載されています。

この問題は、ソリューションの絶対許容誤差を小さくすることで解決できます。あなたの例では、次のようなアプローチは動作します:

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

注:data.frame dfsはループごとに上書きされ、あなたはdata.frame中problem_seedsの出力をしたい場合、あなたはのfuinctionを実行することができますapplyファミリー。そして今からtry機能は必要ありません。

+0

これは便利な回避策です。 Re:上書きdf - これはABCアルゴリズムのほんの一部です(問題を再現するだけです)。メインアルゴリズムでは、上書きされる前にデータフレームが使用されます。誰もがエラーを抑制する方法についての考えを持っているかどうかを確認するのを待つ。答えに感謝します。 –

+1

これは読んでいますか? https://stat.ethz.ch/pipermail/r-sig-dynamic-models/2013q1/000164.html –

+0

私はGoogleを試してみましたが、これは見ていませんでした。共有ありがとう!問題が2013年に投稿されてから2016年にはまだ存在しているようです。ああ、私は彼らが提案する回避策を試してみます。ありがとうございました。 –

関連する問題