我正在学习如何在R中拟合贝叶斯多项Logistic模型。这是我第一次尝试通过rjags
使用JAGS。该代码用MWE说明了我要做的事情:
## simulate data
set.seed(123)
n=2000
rr<-rmultinom(n, 3, c(.1,.3,.2))
r2=as.numeric(rr==1)
r3=as.numeric(rr==2)
r4=as.numeric(rr==3)
abt=rbinom(n,1,.1);smk=rbinom(n,1,.3)
age=rnorm(n);bmi=rnorm(n)
## load programs
library("rjags")
## model
NMMmodel.string <- "
model{
for (i in 1:N){
## outcome levels 2, 3, and 4
r2[i] ~ dbern(pi2[i])
r3[i] ~ dbern(pi3[i])
r4[i] ~ dbern(pi4[i])
## linear predictors
logit(pi2[i]) <- g[1]+g[2]*age[i]+g[3]*abt[i]+g[4]*smk[i]
logit(pi3[i]) <- g[5]+g[6]*bmi[i]+g[7]*age[i]+g[8]*smk[i]
logit(pi4[i]) <- g[9]+g[10]*age[i]+g[11]*smk[i]+g[12]*bmi[i]
## probability that outcome is level 1
pi1[i] <- 1-pi2[i]-pi3[i]-pi4[i]
}
for (j in 1:12) {
g[j] ~ dnorm(0, 0.01)
}
}
"
NMMmodel.spec<-textConnection(NMMmodel.string)
## fit model w JAGS
jags <- jags.model(NMMmodel.spec,
data = list('r2'=r2,'r3'=r3,'r4'=r4,
'abt'=abt,'smk'=smk,
'age'=age,'bmi'=bmi,'N'=n),
n.chains=4,
n.adapt=100)
以下是两个问题,按降低重要性的顺序:
问题1 :我想对g[1]
到g[12]
索引的估算参数设置约束,使得pi1
位于某个任意上层和下限:比如,a=0.25
和b=0.75
。一种方法是使用拒绝抽样,其中rjags将拒绝所有返回pi1
小于a
或更大b
的样本。我怎么能这样做?
问题2 :这个程序到底在做什么?例如,如果这个程序实现了一个Gibbs采样器,有没有办法对它进行编码而不需要使用JAGS,STAN或BUGS?像this网站上的第一组代码?