2013-06-18 58 views
0

我想將先前的分配信息輸入到函數中。我可以通過修改函數體來手動輸入個人發行版,但是我正在尋找這樣做的一般方法?例如,我想繪製一個函數的先驗分佈的後驗分佈。將先前分配信息輸入功能的一般方法?

set.seed(1) 
n <- 10 
pars <- runif(n) 
y <- NA 
for (i in 1:n) 
    y[i] <- rbinom(1,1, prob=pars[i]) 

plotPosterior <- function(pars,y,mean=0,vari=4) 
{ 
    x <- seq(-3,3,by = .1) 
    logLik <- NA 
    for (i in seq(along.with=x)) 
    logLik[i] <- sum(y*log(1 + exp(pars-x[i])) - (y-1)*log(1 + exp(x[i]-pars))) 

    posterior <- logLik * dnorm(x,mean=mean,sd=sqrt(vari)) 
    plot(x,posterior,type="l") 
} 
plotPosterior(pars,y,0,4) 

我可以輸入均值爲正態分佈的方差參數。但是,如果我想使用,例如,beta版本,我必須重寫該函數。相反,我想要一種方式來輸入分佈,如「dnorm(mean=xx,sd=yy)」或「dbeta(shape1=xx, shape2=yy)」...
只有可行的方式,我看到輸入dnorm(x,mean=mean,sd=sqrt(vari))作爲輸入功能。但我不想事先指定x。有沒有其他方法可以做到這一點?

+1

如果我沒有理解好了,你可以取代'dnorm()'由'有趣的功能(X,... )',其中'fun'和'...'被傳遞給'plotPosterior(pars,y,fun = dnorm,...)' – baptiste

+0

這正是我想要的。我將函數頭改爲'plotPosterior < - 函數(pars,y,fun = dnorm,...)',將相關函數行改爲'後< HBat

+0

另一種方法是編寫'plotPosterior(pars,y,fun = dbeta,params.fun = list(shape1 = 2,shape2 = 3))'並用後面的< - logLik * do.call(fun, c(x,params.fun))'。 – baptiste

回答

1

爲了清楚起見,這裏是從評論中提取的有效的解決方案,

set.seed(1) 
n <- 10 
pars <- runif(n) 
y <- NA 
for (i in 1:n) 
    y[i] <- rbinom(1,1, prob=pars[i]) 

plotPosterior <- function(pars,y, fun = dnorm, 
          params.fun = list(mean=0, sd=2)) 
{ 
    x <- seq(-3,3,by = .1) 
    logLik <- NA 
    for (i in seq(along.with=x)) 
    logLik[i] <- sum(y*log(1 + exp(pars-x[i])) - (y-1)*log(1 + exp(x[i]-pars))) 

    posterior <- logLik * do.call(fun, c(list(x), params.fun)) 
    plot(x,posterior,type="l") 
} 

plotPosterior(pars, y) # default params and function 
plotPosterior(pars, y, fun = dbeta, params.fun = list(shape1=2, shape2=3))