我正在尝试通过做一些贝叶斯分析来学习一点Julia。在Peter Hoff's textbook中,他描述了一个从Poisson-Gamma模型的后验预测分布中抽样的过程,其中他:
以下是R:
中的内容a <- 2
b <- 1
sy1 <- 217; n1 <- 111
theta1.mc <- rgamma(1000, a+sy1, b+n1)
y1.mc <- rpois(1000, theta1.mc)
在朱莉娅,我看到分布不能采用参数向量。所以,我最终做了这样的事情:
using Distributions
a = 2
b = 1
sy1 = 217; n1 = 111
theta_mc = rand(Gamma(a+217, 1/(b+n1)), 5000)
y1_mc = map(x -> rand(Poisson(x)), theta_mc)
虽然我最初在分发功能中没有使用矢量并使用Just Like R™,但我喜欢我不需要多次设置我的样本数量。也就是说,我不确定我是否习惯性地这样做,无论是人们如何使用发行版包,还是更普遍地如何编写函数。
有人能提出比我的示例代码更好,更惯用的方法吗?
答案 0 :(得分:2)
我通常会做类似以下的事情,它使用列表推导:
a, b = 2, 1
sy1, n1 = 217, 111
theta_mc = rand(Gamma(a + sy1, 1 / (b + n1)), 1000)
y1_mc = [rand(Poisson(theta)) for theta in theta_mc]
混淆的一个原因可能是Poisson不是一个真正的函数,它是一个类型构造函数,它返回一个对象。因此,对theta的矢量化并不真正有意义,因为它不会构造一个对象,而是很多 - 这将需要另一个步骤来调用每个生成对象的rand。