4

IMISパッケージ(Incremental Mixture Importance Sampling)を使用してパラメーターを推定しています。残念ながら、関数、、を検索するように記述されてlikelihoodおりsample.priorprior呼び出された環境では、関数でラップすることはできません(私の最終目標)。からの単変量の例は?IMISうまく機能しますが、

require(IMIS)
likelihood <- function(theta) exp(-1*sin(3*theta)*sin(theta^2) - 0.1*theta^2)
prior <- function(theta) dnorm(theta, 0, 5)
sample.prior <- function(n) rnorm(n, 0, 5)
result = IMIS(500, 3000, 100, 10)

## also fine using do.call (pertinent below)
result <- do.call(IMIS, args = list(B = 500, B.re = 3000, number_k = 100, D = 10))

しかし、当然のことながら、関数でラップしても次のことはできません。

rm(likelihood, prior, sample.prior, result)
imisWrap <- function() {
    likelihood <- function(theta) exp(-1*sin(3*theta)*sin(theta^2) - 0.1*theta^2)
    prior <- function(theta) dnorm(theta, 0, 5)
    sample.prior <- function(n) rnorm(n, 0, 5)
    result = IMIS(500, 3000, 100, 10)
    return(result)
}
imisWrap() ## can't find sample.prior

これを回避する方法は、ラッパーで環境を作成し(またはその環境を使用して)、その環境で実行することだと思いますが、、、、を含む新しい環境を作成する方法がわかりません。do.callIMISlikelihoodpriorsample.priorresult


編集: @BenBolkerの優れたコメントを使用して、改善されましたが、まだ機能していません:

imisWrap2 <- function() {
    likelihood <- function(theta) exp(-1*sin(3*theta)*sin(theta^2) - 0.1*theta^2)
    prior <- function(theta) dnorm(theta, 0, 5)
    sample.prior <- function(n) rnorm(n, 0, 5)
    imisEnv <- new.env()
    assign("likelihood", likelihood, envir = imisEnv)
    assign("sample.prior", sample.prior, envir = imisEnv)
    assign("prior", prior, envir = imisEnv)
    result = do.call(IMIS,
                     args = list(B = 500, B.re = 3000, number_k = 100, D = 10),
                     envir = imisEnv)
    return(result)
}

しかし、これでも関数を見つけることができません。

4

2 に答える 2

2

attach環境を実行する(およびdetach使用後にクリーンアップする)ことで、それを機能させることができます。

imisWrap() <- function() {
    imisList <- list(
      likelihood = function(theta) exp(-1*sin(3*theta)*sin(theta^2) - 0.1*theta^2),
      prior = function(theta) dnorm(theta, 0, 5),
      sample.prior = function(n) rnorm(n, 0, 5)
    )
    imisEnv <- as.environment(imisList)
    attach(imisEnv)
    result = IMIS(500, 3000, 100, 10)
    detach(imisEnv)
    return(result)
}

imisWrap()
[1] "5000 likelihoods are evaluated in 0 minutes"
[1] "Stage   MargLike   UniquePoint   MaxWeight   ESS"
[1]    1.000   -0.806 1796.246    0.001 2434.921
[1] "maximum posterior= -1.96 , likelihood= 0.61 , prior= -2.57 , time used= 0 minutes, convergence= 0"
...

ただし、@ BenBolkerは、パッケージの作成者がよりクリーンに解決する必要がある関数の問題であるという点でエコーします。

于 2012-10-12T07:13:35.560 に答える
2

あなたはそれを機能させるためenvironment(IMIS) <- environment()に上部に置くことができimisWrapます。これは、の動作を変更するだけIMISですimisWrap。パッケージ名前空間の関数のバージョンは変更されていません。

于 2012-10-12T08:39:16.800 に答える