我正在从JAGS迁移到LaplacesDemon,并尝试重写一些代码。我已经阅读了LaplacesDemon TutorialLaplacesDemon Examples小插曲,并对小插曲中的某些示例有些困惑。

在LaplacesDemon教程(p.5)的简单示例中,模型写为:

Model <- function(parm, Data)
{beta <- parm[Data$pos.beta]
 sigma <- interval(parm[Data$pos.sigma], 1e-100, Inf)
 parm[Data$pos.sigma] <- sigma
 beta.prior <- dnormv(beta, 0, 1000, log=TRUE)
 sigma.prior <- dhalfcauchy(sigma, 25, log=TRUE)
 mu <- tcrossprod(beta, Data$X)
 LL <- sum(dnorm(Data$y, mu, sigma, log=TRUE))
 LP <- LL + sum(beta.prior) + sigma.prior
 Modelout <- list(LP=LP, Dev=-2*LL, Monitor=LP,
 yhat=rnorm(length(mu), mu, sigma), parm=parm)
 return(Modelout)}


此处,由于存在多个beta参数,因此将beta.prior汇总为LP

但是我在LaplacesDemon Example小插图中的更高级示例中发现,它似乎并不总是遵循规则。例如示例87(第162页):

Model <- function(parm, Data)
{### Log-Prior
 beta.prior <- sum(dnormv(beta[,1], 0, 1000, log=TRUE), dnorm(beta[,-1], beta[,-Data$T], matrix(tau, Data$K, Data$T-1), log=TRUE))
 zeta.prior <- dmvn(zeta, rep(0,Data$S), Sigma[ , , 1], log=TRUE)
 phi.prior <- sum(dhalfnorm(phi[1], sqrt(1000), log=TRUE), dtrunc(phi[-1], "norm", a=0, b=Inf, mean=phi[-Data$T], sd=sigma[2], log=TRUE))
 ### Log-Posterior
 LP <- LL + beta.prior + zeta.prior + sum(phi.prior) + sum(kappa.prior) + sum(lambda.prior) + sigma.prior + tau.prior
 Modelout <- list(LP=LP, Dev=-2*LL, Monitor=LP, yhat=rnorm(prod(dim(mu)), mu, sigma[1]), parm=parm)
 return(Modelout)}


(由于示例代码的长度,仅放入部分代码)

此处,zeta大于一个,但未在Log-PriorLog-Posterior部分中求和,beta大于一个且在Log-Prior中求和,并且phi也是多个参数但在Log-PriorLog-Posterior部分中将其相加。

在第167页的下一个示例中,情况似乎又有所不同。

我想知道在什么情况下我们应该对先验密度求和?非常感谢!

最佳答案

您是否尝试过逐行运行代码?您将了解到没有什么可累加的,因为dmvn是多元正态分布的密度函数,并且它返回一个值-观测向量zeta的概率密度。所有总和的原因是,为了获得将两个独立事件一起观察的概率,我们将其边际概率(或对其对数求和)相乘。因此,我们将观察所有先验的概率相乘,以获得它们的联合分布。

关于r - LaplacesDemon:我应该何时对先前的密度求和?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43115842/

10-12 17:10