2012-10-12 81 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,但我不知道如何創建一個新環境,該環境在i中有likelihood,prior,sample.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

我想你可以使用'assign'來填充環境。你有沒有考慮過讓軟件包作者改寫一些更理智的東西......? –

+0

@BenBolker或者只是使用'trace'實時重寫函數。 –

回答

2

你可以把environment(IMIS) <- environment()放在imisWrap的頂部來讓它工作。這隻會修改在imisWrap中的行爲。包名稱空間中的函數版本未更改。

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那包作者應該更乾淨地解決。