将lambda的向量传递给泊松()或关于惯用函数组成的指导

时间:2014-05-16 00:51:32

标签: julia

我正在尝试通过做一些贝叶斯分析来学习一点Julia。在Peter Hoff's textbook中,他描述了一个从Poisson-Gamma模型的后验预测分布中抽样的过程,其中他:

  1. 从伽玛分布中采样值
  2. 从泊松分布中采样值,通过lambdas矢量
  3. 以下是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™,但我喜欢我不需要多次设置我的样本数量。也就是说,我不确定我是否习惯性地这样做,无论是人们如何使用发行版包,还是更普遍地如何编写函数。

    有人能提出比我的示例代码更好,更惯用的方法吗?

1 个答案:

答案 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。