我正在使用IMIS
包(增量混合重要性采样)来估计参数。不幸的是,它被编写为在其调用的环境中查找函数likelihood
,sample.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
,但是我不知道如何创建一个包含likelihood
,prior
,sample.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)
}
但是这仍然找不到功能。
答案 0 :(得分:2)
你可以通过attach
enviromnent(和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,因为包装作者应该更干净地解决这个功能的问题。
答案 1 :(得分:2)
您可以将environment(IMIS) <- environment()
放在imisWrap
的顶部以使其生效。这仅修改了IMIS
中imisWrap
的行为。包命名空间中的函数版本未更改。