使用integrate()计算R中高斯模型的边际似然

时间:2018-03-11 11:31:35

标签: r bayesian numerical-integration integrate log-likelihood

我正在尝试计算R中高斯模型的边际似然性。更准确地说,我试图将可能性整合到mu上的高斯先验和sigma上的高斯先验,并进行一些观察yi。

换句话说,我正在尝试计算:

enter image description here

我尝试使用以下函数在R中编写此代码(遵循类似的SA问题:Quadrature to approximate a transformed beta distribution in R):

marglik <- function(data) {

    integrand <-
        Vectorize(function(data, mu, sigma) {
            prod(dnorm(data, mu, sigma) ) * dnorm(mu, 110, 1) * dnorm(sigma, 10, 1)
            } )

    integrate(integrand, lower = 0, upper = Inf, mu = 100, sigma = 10)$value

}

使用这个函数,我可以计算出一组观察结果的上述模型的边际似然性:

set.seed(666)

d <- rnorm(100, mean = 107.5, sd = 2.5)
marglik(data = d)

[1] 9.704133e-24

但是,我通过此程序获得的结果与使用网格近似或使用其他软件包/软件获得的结果完全不同。

我的问题是:是否有可能与集成进行双重集成?如果是的话,你会怎么做?

1 个答案:

答案 0 :(得分:1)

integrate()只接受单变量函数。也就是说,你输入的功能必须是一维的。

一般来说,使用专门的工具可以更好地解决这个问题,或者使用桥接采样,即。如果您有MCMC输出,则通过bridgesampling package;如果您有更多一般的多变量集成问题,则通过cubature package

但是,如果我们绝对必须使用integrate()两次执行此操作,我们可以使其工作,但是需要从代码中取出一些错误,并且。像下面这样的东西可以工作,虽然在数字上大多数时候结果似乎是零,这就是为什么你通常会尝试获得对数边际可能性。

marglik <- function(data) {

  # Function that integrates over mu for given sigma.
  mu_integrand <- Vectorize(function(sigma) {
    mu_given_sigma_fun <- Vectorize(function(mu) {
      prod(dnorm(data, mu, sigma) ) * dnorm(mu, 110, 1) * dnorm(sigma, 10, 1)
      })
    integrate(mu_given_sigma_fun, lower = -Inf, upper = Inf)$value
  })

  integrate(mu_integrand, lower = 0, upper = Inf)$value

}

set.seed(666)

d <- rnorm(100, mean = 110, sd = 10)
marglik(data = d)