有没有办法用R写一个生成函数的函数?

dm7nw8vv  于 2023-01-15  发布在  其他
关注(0)|答案(1)|浏览(174)

我正在使用BayesianTools包对数据运行MCMC,但我的特定项目需要我获取一个MCMC的一些输出,并将其转换为一个新MCMC的先验。据我所知,在BayesianTools中,先验需要定义为单输入函数。所以我要做的是写一个函数,从一轮MCMC中提取后验概率,然后生成一个概率密度函数。我试着用下面的代码来做这件事,但是R并没有像我希望的那样在函数probabilityDensityFunction中保存dens。我需要生成16个这样的对象,如果我能以这样的方式自动生成它们,而不是手动为每个对象编码,我的生活会变得容易得多,所以任何帮助都是感激的。
谢谢!

probabilityDensityFunction_generator <- function(dens) {
  # This function is to generate a separate function called the probability density function. 
  #It takes objects of type density() as an imput and returns a function which estimates the probability density. 
  
  probabilityDensityFunction <- function(x){
    if(x < dens$x[1]){
      out = 0
    } else if(x>dens$x[length(dens$x)]){
      out = 0
    } else{
      for(i in 1:length(dens$x)){
        if(x<dens$x){
          out = dens$y[i]
        } else{
          break
        }
      }
    }
    return(out)
  }
  
  return(probabilityDensityFunction)
}
elcex8rz

elcex8rz1#

这里有一个办法。
主要的错误是把函数赋值给一个对象,没有必要这样做,你应该返回函数创建。
还有另一个问题,获取dens$x中的位置的代码是新的x,基函数findInterval会自动执行,但如果小于最小值,则返回零,因此将NA赋值给那些y
由于R的惰性求值,dens必须在函数生成器中求值。这是用force完成的。如果dens没有改变,那么它创建的所有函数也会改变。见下文,当应用于相同的向量newx时,fg的图形是完全不同的。

probabilityDensityFunction_generator <- function(dens) {
  # This function is to generate a separate function called the probability density function. 
  # It takes objects of type density() as an imput and returns a function which estimates the probability density. 
  force(dens)
  function(x){
    i <- sapply(x, findInterval, dens$x)
    is.na(i) <- i == 0
    dens$y[i]
  }
}

set.seed(2023)
X <- rnorm(1e3)
d <- density(X)
f <- probabilityDensityFunction_generator(d)

Y <- rchisq(1e3, df = 3)
e <- density(Y)
g <- probabilityDensityFunction_generator(e)

xlim <- range(range(d$x), range(e$x))
ylim <- range(range(d$y), range(e$y))
plot(d, xlim = xlim, ylim = ylim)
lines(e)
#
newx <- seq(xlim[1], xlim[2], 0.2)
points(newx, f(newx), col = "red", pch = 3)
points(newx, g(newx), col = "blue", pch = 3)

创建于2023年1月11日,使用reprex v2.0.2

相关问题