2012-10-12 8 views
4

IMIS 패키지 (증분 혼합 중요성 샘플링)를 사용하여 매개 변수를 추정하고 있습니다. 불행히도 함수가 호출 된 환경에서 likelihood, sample.priorprior을 찾도록 작성되었으므로 함수 (내 목표)로 감쌀 수 없습니다. ?IMIS에서 단 변량 예는 함수에 포장, 당연히,환경을 채우는 방법 R

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, , sample.priorresult이있는 환경을 만드는 방법을 모르겠습니다. 티.

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) 
} 

하지만 여전히 기능을 찾을 수 없습니다 :


편집 : BenBolker의 우수한 의견 내가이 개선하지만 여전히 시도를 작동하지 않은 @ 사용.

+4

환경을 채우기 위해'assign'을 사용할 수 있다고 생각합니다. 패키지 작성자에게 물건을 좀더 건강하게 재 작성하도록 요청하는 것을 고려 했습니까? –

+0

@BenBolker 또는 단순히'trace'를 사용하여 함수를 실시간으로 다시 작성하십시오. –

답변

2

imisWrap 상단에 environment(IMIS) <- environment()을 입력하면 작동합니다. 이는 IMIS의 동작을 imisWrap에만 수정합니다. 패키지 네임 스페이스의 함수 버전은 변경되지 않습니다.

2

당신은 그것 (청소 사용 후 보내고 및 detach) attach enviromnent을 보내고에 의해 작동하도록 할 수 있습니다 그러나

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 에코 (echo) 패키지 작성자는보다 명확하게 해결해야합니다.