JAGS 模型中向量的求幂,R 中的贝叶斯分析

Exponentiation of vector in JAGS model, Bayesian analysis in R

我有以下 JAGS 模型用于 R 中的贝叶斯模型。我正在尝试估计我的变量 "R" 的后验分布。除 R 之外的所有变量都应该是确定性节点。每个变量 s_A、z_A、z_W 和 d 都是向量。而 tau_s 是 data.frame。因此,TTD_aquifer 和 O2s_all 应该是每个 i 的向量。

model {
for (i in 1:N){
    y[i] ~ dnorm(mu[i], tau)
    mu[i] <- sum(O2s_all)/2


tau_s_bar[i] = (s_A[i]*z_A[i])/R[i]*log(z_A[i]/(z_A[i]-z_W[i]))


TTD_aquifer <- t((d[i]*sqrt(tau_s_bar[i]))/sqrt(4*3.14*d[i]*t(tau_s[,i]^3))*exp(-1*((d[i]*tau_s_bar[i])/(4*t(tau_s[,i])))*
                                                                      (1-t(tau_s[,i])/tau_s_bar[i])^2))

O2s_all <- t(O2_o[i]-k_o[i]*t(tau_s[,i]))*TTD_aquifer

# prior on R
 R[i] ~ dlnorm(-2, 1/(0.6)^2)
 }
# prior on tau and sigma
 tau <- pow(sigma, -2)
 sigma ~ dunif(0, 100)
}

当我在 jags.model() 中 运行 时,出现以下错误:运行时错误: exp 的向量参数无效。所以看起来我不能像在 R 中那样将向量输入到 exp() 中。TTD_aquifer 和 O2s_all 运行 的等式在 R 中是一个确定性的例子。我应该如何在 JAGS 中编写 TTD_aquifer 的方程式以避免 exp 问题?

在 JAGS 中,反 link 函数如 exp 只接受标量参数。您可以将您的模型更改为此以便使用 exp。请注意,您需要在数据列表中包含一个对象,该对象表示 tau_s 数据框中有多少行。因为我不知道你的模型在做什么,所以我没有检查你的括号是否在你所有的除法和乘法中的正确位置。

model {
for (i in 1:N){
    y[i] ~ dnorm(mu[i], tau)
    mu[i] <- sum(O2s_all[,i])/2

tau_s_bar[i] <- (s_A[i]*z_A[i])/R[i]*log(z_A[i]/(z_A[i]-z_W[i]))

for(j in 1:K){ # K = nrow of tau_s

TTD_aquifer[j,i] <- t((d[i]*sqrt(tau_s_bar[i]))/
sqrt(4*3.14*d[i]*t(tau_s[j,i]^3))*
exp(-1*((d[i]*tau_s_bar[i])/(4*t(tau_s[j,i])))*
(1-t(tau_s[j,i])/tau_s_bar[i])^2))

O2s_all[j,i] <- t(O2_o[i]-k_o[i]*t(tau_s[j,i]))*TTD_aquifer[j,i]

} # close K loop
# prior on R
 R[i] ~ dlnorm(-2, 1/(0.6)^2)
 }
# prior on tau and sigma
 tau <- pow(sigma, -2)
 sigma ~ dunif(0, 100)
}

由于 TTD_aquifer02s_all 应该是每个 i 的向量,因此它们应该是每个步骤的 tau_s 大小相同的二维矩阵在 MCMC 链中。如果您有一个大数据集(即大 N 和 K)并且 运行 这个模型进行了多次迭代,那么跟踪这些派生参数将占用大量内存。如果您 运行 在没有足够 RAM 的计算机上使用此功能,请牢记这一点。细化链是帮助处理跟踪所述参数的计算强度的一种方法。