Jags:尝试重新定义节点错误,混合效应回归

Jags: Attempt to redefine node error, mixed effect regression

我想在 rjags 中使用随机斜率和截距执行混合效应回归。我定义了以下玩具数据集:

library(ggplot2)
library(data.table)

global_slope <- 1
global_int <- 1

Npoints_per_group <- 50
N_groups <- 10
pentes <- rnorm(N_groups,-1,.5)

centers_x <- seq(0,10,length = N_groups)
center_y <- global_slope*centers_x + global_int

group_spread <- 2
group_names <- sample(LETTERS,N_groups)

df <- lapply(1:N_groups,function(i){
  x <- seq(centers_x[i]-group_spread/2,centers_x[i]+group_spread/2,length = Npoints_per_group)
  y <- pentes[i]*(x- centers_x[i])+center_y[i]+rnorm(Npoints_per_group)
  data.table(x = x,y = y,ID = group_names[i])
}) %>% rbindlist()

ggplot(df,aes(x,y,color = as.factor(ID)))+
  geom_point()

这是辛普森悖论的典型情况:当你在每个组内有下降趋势时整体上升趋势(由 ID 变量给出)。

我定义如下模型:

library(rjags)

model_code_simpson <- 
" model
{

 # first level
  for (i in 1:n) {
    y[i] ~ dnorm(alpha[i] + beta[i] * x[i], tau)
    alpha[i] = alpha[group[i]] # random intercept
    beta[i] = beta[group[i]] # random slope
  }

# second level
for(j in 1:J){
alpha[j] ~ dnorm(mu.alpha, tau.alpha)
beta[j] ~ dnorm(mu.beta, tau.beta)
}

# Priors
mu.alpha ~ dnorm(0,0.001)
mu.beta ~ dnorm(0,0.001)
sigma ~ dunif(0,10)
sigma.alpha ~ dunif(0,10)
sigma.beta ~ dunif(0,10)

# Derived quantities
tau <- pow(sigma,-2)
tau.alpha <- pow(sigma.alpha,-2)
tau.beta <- pow(sigma.beta,-2)

}
"

# Choose the parameters to watch
model_parameters <- c("mu.alpha","tau.alpha","tau.beta","tau")

# define numeric grouping variable
df[,ID2 := .GRP,by = ID]

model_data <- list(n = nrow(df), 
                   y = df$y, 
                   x = df$x,
                   group = df$ID2,
                   J = df[,uniqueN(ID)])

model <- jags.model(textConnection(model_code_simpson),
                    data = model_data,
                    n.chains = 2)

我收到以下错误:

Compiling model graph
   Resolving undeclared variables
   Allocating nodes
Deleting model

Error in jags.model(textConnection(model_code_simpson), data = model_data,  : 
  RUNTIME ERROR:
Compilation error on line 8.
Attempt to redefine node beta[1]

我不明白这是怎么回事,相关问题对我帮助不大。

您定义了 beta 两次。首先,当您循环数据时,beta 是一个长度为 n 的向量。其次,当您创建随机效果时,beta 是一个长度为 J 的向量。这种“重新定义”导致了这个问题,但它很容易解决。您只需要删除模型中 beta 的第一个实例,它就会编译(即,只需将嵌套索引移动到 dnorm() 内,就可以了)。

model_code_simpson <- 
  " model
{

 # first level
  for (i in 1:n) {
    y[i] ~ dnorm(
      alpha[group[i]] + beta[group[i]] * x[i],
      tau
    )
  }

# second level
for(j in 1:J){
alpha[j] ~ dnorm(mu.alpha, tau.alpha)
beta[j] ~ dnorm(mu.beta, tau.beta)
}

# Priors
mu.alpha ~ dnorm(0,0.001)
mu.beta ~ dnorm(0,0.001)
sigma ~ dunif(0,10)
sigma.alpha ~ dunif(0,10)
sigma.beta ~ dunif(0,10)

# Derived quantities
tau <- pow(sigma,-2)
tau.alpha <- pow(sigma.alpha,-2)
tau.beta <- pow(sigma.beta,-2)

}
"