我在 R 中有一个概率密度函数,我想从中抽取一个样本。我怎么做?
我目前的解决方案(以及谷歌一直给我的解决方案)是为一组密集的值(x)评估函数,给出相关的概率(px),然后使用sample(x, size=1, prob=px). 由于我以这种方式绘制了数千个样本,因此模拟分布的计算量非常大,并且是离散的,即使它应该是连续的。
具体来说,我正在编写自己的 Gibbs 采样器来推断哪些均值和标准差可能导致观察向量(贝叶斯推断)。我从由可能性 * 先验组成的分布中采样。这是我目前正在做的循环版本的最小示例:
# values to assign posterior probabilities to. here 1000 values are used to simulate continuity.
mu.x = seq(from=0.001, to=20, length.out=1000)
# the likelihood distribution which will be called for varying mu and a fixed sigma and fixed D.
likelihoodMu = function(mu, sigma, D) mu.likelihood = ((2 * pi * sigma^2) ^ (-length(D) / 2)) * exp(-1 / (2 * sigma^2) * sum((D - mu)^2))
# will collect samples
mySamples = rep(NA, length(mu.x))
# Draw 5000 samples
for(i in 1:5000) {
# Loop over mu.x and get likelihood for each value
mu.likelihoodDistribution = sapply(mu.x, likelihoodMu, sigma=2, D=c(1,2,3))
# Draw a sample from the likelihood distribution calculated above
mySample = sample(mu.x, size=1, prob=mu.likelihoodDistribution)
}
我正在寻找一种直接从 R 中的似然函数进行采样的方法,而不是通过离散且计算量大的 seq-sapply-sample 模拟。在上面的例子中,像 sample('mu', FUN=likelihoodMu, sigma=2, D=c(1,2,3), size=1) 这样的东西会很好。它最好是通用的,因为我是从不同类型的分布中抽样的。

