0

在此处输入图像描述

我有 2 列数据,y并且grp我正在尝试创建一个JAGS如上所示的模型。grp是组,我有 5 个组。以下代码来自这里。我使用这段代码是因为标题下的描述Model and Data看起来几乎像这个分层模型。

但是mu当我查看摘要时,我只得到一个。应该有 5mu's个,每组一个。有人可以更正代码吗?您也可以指出其他地方提供的类似示例,我可以尝试对其进行修改。我在代码中遗漏了一些东西,我相信代码可能就像问题一样,但是当我像这样修改它时,即使有 5 种方法,我似乎也没有得到适当的方法。

不确定这个问题是否属于数学堆栈交换。

mod_string = " model {
   for (i in 1:length(y) {
    theta[i] ~ dnorm(mu[grp[i]], invTau2)
    y[i] ~ dnorm(theta[i], 1/sig)
  }
  mu ~ dnorm(0, 1e6)
  invTau2 ~ dgamma(1.0/2.0, 1.3/2.0)
  tau2 <- 1/invTau2

  invgamma2 ~ dgamma(1.0/2.0, 2.1/2.0)
  sig = 1/invgamma2
    } "

summary(mod_sim)

Iterations = 2001:52000
Thinning interval = 1 
Number of chains = 3 
Sample size per chain = 50000 

1. Empirical mean and standard deviation for each variable,
   plus standard error of the mean:

         Mean    SD  Naive SE Time-series SE
mu  5.639e-07 0.001 2.582e-06      2.582e-06
sig 1.570e+00 1.888 4.874e-03      7.068e-03
4

1 回答 1

0

看起来您正在使用嵌套索引,其中grp是一个长度向量,y并描述了每个元素y所属的组。如果每个组都需要它自己的平均值,那么您需要生成 5 个theta先验。这在它自己的循环中最容易完成。因此,您的模型字符串将类似于:

mod_string <- " model {
   # loop for y
   for (i in 1:length(y)) {
     y[i] ~ dnorm(theta[grp[i]], sig)
   }
   # loop for theta
   for (g in 1:ntheta){
     theta[g] ~ dnorm(mu, tau2)
   }
   # other priors. JAGS uses precision so you need to use the reciprocal 
   # of 1e6 for the variance of mu.
   mu ~ dnorm(0, 0.000001)
   invTau2 ~ dgamma(1.0/2.0, 1.3/2.0)
   tau2 <- 1/invTau2

   invgamma2 ~ dgamma(1.0/2.0, 2.1/2.0)
   sig <- 1/invgamma2
} "

请注意,您还需要为ntheta模型提供标量,这将是唯一组的数量(在本例中ntheta = 5)。现在,如果您跟踪theta,您最终将得到 5 个估计值,而mu有 1 个估计值(它是所有组的总估计平均值)。

于 2020-01-26T18:57:17.677 回答