我使用IMIS
包(增量混合重要性抽樣)來估計參數。不幸的是,它被寫入尋找函數likelihood
,sample.prior
和prior
在它被調用的環境中,所以我不能將它包裝在函數中(我的最終目標)。從?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.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)
}
但是,這仍然無法找到的功能。
我想你可以使用'assign'來填充環境。你有沒有考慮過讓軟件包作者改寫一些更理智的東西......? –
@BenBolker或者只是使用'trace'實時重寫函數。 –