LaplacesDemon:我什么时候应该对先验密度求和?
LaplacesDemon: when should I sum prior density?
我正在从 JAGS 迁移到 LaplacesDemon 并尝试重写我的一些代码。我已阅读 LaplacesDemon Tutorial and LaplacesDemon Examples 小插图,对小插图中的一些示例感到有些困惑。
在LaplacesDemon Tutorial (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.prior
被汇总为 LP
,因为有多个 beta 参数。
但我发现在LaplacesDemon Example vignette中更高级的例子中,它似乎并不总是遵循规则。例如示例 87 (p.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-Prior
或Log-Posterior
部分求和,beta
多于一且在Log-Prior
部分求和Log-Prior
和 phi
也是一个以上的参数,但它在 Log-Prior
和 Log-Posterior
部分求和。
而在第167页的下一个例子中,似乎又不一样了。
我想知道在什么情况下我们应该对先验密度求和?非常感谢!
您是否逐行尝试过 运行 代码?你会发现没有什么可以求和的,因为 dmvn
是多元正态分布的密度函数,它 returns 是一个单一的值——观察向量的概率密度 zeta
。所有总和的原因是为了获得一起观察两个独立事件的概率,我们将它们的边际概率相乘(或求和它们的对数)。所以我们将观察到所有先验的概率相乘,得到它们的联合分布。
我正在从 JAGS 迁移到 LaplacesDemon 并尝试重写我的一些代码。我已阅读 LaplacesDemon Tutorial and LaplacesDemon Examples 小插图,对小插图中的一些示例感到有些困惑。
在LaplacesDemon Tutorial (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.prior
被汇总为 LP
,因为有多个 beta 参数。
但我发现在LaplacesDemon Example vignette中更高级的例子中,它似乎并不总是遵循规则。例如示例 87 (p.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-Prior
或Log-Posterior
部分求和,beta
多于一且在Log-Prior
部分求和Log-Prior
和 phi
也是一个以上的参数,但它在 Log-Prior
和 Log-Posterior
部分求和。
而在第167页的下一个例子中,似乎又不一样了。
我想知道在什么情况下我们应该对先验密度求和?非常感谢!
您是否逐行尝试过 运行 代码?你会发现没有什么可以求和的,因为 dmvn
是多元正态分布的密度函数,它 returns 是一个单一的值——观察向量的概率密度 zeta
。所有总和的原因是为了获得一起观察两个独立事件的概率,我们将它们的边际概率相乘(或求和它们的对数)。所以我们将观察到所有先验的概率相乘,得到它们的联合分布。