4

我正在使用IMIS包(增量混合重要性采样)来估计参数。不幸的是,它是为查找函数而编写的likelihoodsample.prior并且prior在它被调用的环境中,所以我不能将它包装在一个函数中(我的最终目标)。作品中的单变量示例?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.call中运行IMIS,但我不知道如何创建一个包含likelihoodpriorsample.prior和其中的新环境result


编辑:使用@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

您可以将environment(IMIS) <- environment()其放在顶部imisWrap以使其正常工作。这只会修改IMISin的行为imisWrap。包命名空间中的函数版本不变。

于 2012-10-12T08:39:16.800 回答
2

您可以通过attaching 环境(并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 回答