将先前的分配信息输入功能的一般方法?

时间:2013-06-18 20:35:42

标签: r distribution

我想将先前的分发信息输入到函数中。我可以通过修改函数体手动输入单个发行版但我正在寻找一种通用的方法吗? 例如,我想绘制给定先前分布的函数的后验分布。

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 个答案:

答案 0 :(得分: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))