1

我有以下 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() 中运行它时,我收到以下错误:RUNTIME ERROR: Invalid vector argument to exp。所以看起来我不能像在 R 中那样将向量输入到 exp() 中。作为确定性示例,TTD_aquifer 和 O2s_all 的方程在 R 中运行良好。我应该如何在 JAGS 中编写 TTD_aquifer 方程以避免 exp 问题?

4

1 回答 1

1

在 JAGS 中,反向链接函数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_aquifer并且02s_all应该是每个 的向量,因此它们应该是与MCMC 链中的每个步骤i大小相同的二维矩阵。tau_s如果您有一个大数据集(即大 N 和 K)并且正在运行该模型进行多次迭代,那么跟踪这些派生参数将占用大量内存。如果您在没有足够 RAM 的计算机上运行此程序,请记住一些事情。细化链是帮助处理跟踪所述参数的计算强度的一种方法。

于 2017-10-05T13:41:29.907 回答