我正在使用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)
}
1条答案
按热度按时间elcex8rz1#
这里有一个办法。
主要的错误是把函数赋值给一个对象,没有必要这样做,你应该返回函数创建。
还有另一个问题,获取
dens$x
中的位置的代码是新的x
,基函数findInterval
会自动执行,但如果小于最小值,则返回零,因此将NA
赋值给那些y
。由于R的惰性求值,
dens
必须在函数生成器中求值。这是用force
完成的。如果dens
没有改变,那么它创建的所有函数也会改变。见下文,当应用于相同的向量newx
时,f
和g
的图形是完全不同的。创建于2023年1月11日,使用reprex v2.0.2