我正在尝试计算R中高斯模型的边际似然性。更准确地说,我试图将可能性整合到mu上的高斯先验和sigma上的高斯先验,并进行一些观察yi。
换句话说,我正在尝试计算:
我尝试使用以下函数在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
但是,我通过此程序获得的结果与使用网格近似或使用其他软件包/软件获得的结果完全不同。
我的问题是:是否有可能与集成进行双重集成?如果是的话,你会怎么做?
答案 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)