具有主体间因子的贝叶斯混合模型回归

机器算法验证 贝叶斯 混合模式 锯齿
2022-04-09 22:10:02

我试图在 JAGS/rjags 中指定一个模型,其中一个主题因子(a,具有两个级别 - YN)与一个重复测量连续变量x加上相关的主题变化斜率和截距相互作用。我可以使用 lmer 函数简单地指定这个模型:

lmer(y ~ a + x + a:x + (1 + a | id))

我的 JAGS/rjags 很生锈(或很新鲜)。在我看来,在估计a的两个水平的斜率时,下面似乎正在拟合一个具有不同截距和不同斜率的模型,但我不确定我正在做我认为我正在做的事情。两者之间也没有指定相关性。

modelstring = "
model {
  for ( i in 1:Ntotal ) {
    y[i] ~ dnorm( mu[i] , tau )
    mu[i] <- a1[aLvl[i]] + s1[sLvl[i]] + a2[aLvl[i]] * x[i] + s2[sLvl[i]] * x[i]
  }
  # Prior:
  tau <- pow( sigma , -2 )
  sigma ~ dunif(0,1000)
  for ( j in 1:2 ) { 
      a1[j] ~ dnorm( 0.0 , aTau ) 
      a2[j] ~ dnorm( 0.0 , aTau ) 
  }
  aTau <- 1 / pow( aSD , 2 )
  aSD <- abs( aSDunabs ) + .1
  aSDunabs ~ dt( 0 , 1.0E-7 , 2 )
  #
  for ( j in 1:NsLvl ) { 
    s1[j] ~ dnorm( 0.0 , sTau ) 
    s2[j] ~ dnorm( 0.0 , sTau )
  }
  sTau <- 1 / pow( sSD , 2 )
  sSD <- abs( sSDunabs ) + .1
  sSDunabs ~ dt( 0 , 1.0E-7 , 2 )
}
"

这方面的框架来自Kruschke也提供了一些帮助。我将不胜感激一些指向类似分析示例的指针或链接。

1个回答

在Doing Bayesian Data Analysis (Kruschke) Data Analysis Using Regression and Multilevel/Hierarchical Models (Gelman)的帮助下,我最终弄清楚了这一点该模型给出了不同的截距和斜率以及它们之间的相关性。

y = 因变量
sLvl = 每个数据点的参与者 ID
aLvlx = 每个 ID 的受试者之间因子 NaLvl = 受试者之间因子
的级别数
Ntotal = 长格式数据的总长度

modelstring = "
model {
for( r in 1 : Ntotal ) {
    y[r] ~ dnorm( mu[r] , tau )
    mu[r] <- b0[ sLvl[r] ] + b1[ sLvl[r] ] * x[r]
}
#General priors
tau ~ dgamma( sG , rG )
sG <- pow(m,2)/pow(d,2)
rG <- m/pow(d,2)
m ~ dgamma(1, 0.001)
d ~ dgamma(1, 0.001)
#Subject level priors
for ( s in 1 : NsLvl ) {
    b0[s] <- B[s,1]
    b1[s] <- B[s,2]
    B[s, 1:2] ~ dmnorm( B.hat[s, ], Tau.B[ , ] )
    B.hat[s,1] <- hix1[aLvlx[s]]
    B.hat[s,2] <- hix2[aLvlx[s]]        
}
Tau.B[1:2 , 1:2] <- inverse(Sigma.B[,])
Sigma.B[1,1] <- pow(tau0G, 2)
Sigma.B[2,2] <- pow(tau1G, 2)
Sigma.B[1,2] <- rho * tau0G * tau1G
Sigma.B[2,1] <- Sigma.B[1,2]

tau0G ~ dunif(0.001,100)
tau1G ~ dunif(0.001,100)
rho ~ dunif(-1,1)
#Between subjects level priors
for ( k in 1:NaLvl ) { 
    hix1[k] ~ dnorm( 0 , 0.0000001 )
    hix2[k] ~ dnorm( 0 , 0.0000001 ) 
}
}"
writeLines(modelstring,con="model.txt")