我使用Kruschke描述的分层建模框架来设置JAGS中两个模型之间的比较。此框架中的想法是通过将每个版本指定为分类变量的一个级别来运行和比较模型的多个版本。然后,该分类变量的后验分布可以解释为各种模型的相对概率。
在下面的代码中,我比较了两个模型。模型形式相同。每个参数都需要估算一个参数mE
。可以看出,这些模型的先验不同。两个先验都作为beta分布分布,模式为0.5。然而,模型2的先前分布更加集中。另请注意,我曾使用伪先验,我希望这些伪先生可以防止链条卡在其中一个模型上。但无论如何,这个模型似乎都被卡住了。
以下是模型:
model {
m ~ dcat( mPriorProb[] )
mPriorProb[1] <- .5
mPriorProb[2] <- .5
omegaM1[1] <- 0.5 #true prior
omegaM1[2] <- 0.5 #psuedo prior
kappaM1[1] <- 3 #true prior for Model 1
kappaM1[2] <- 5 #puedo prior for Model 1
omegaM2[1] <- 0.5 #psuedo prior
omegaM2[2] <- 0.5 #true prior
kappaM2[1] <- 5 #puedo prior for Model 2
kappaM2[2] <- 10 #true prior for Model 2
for ( s in 1:Nsubj ) {
mE1[s] ~ dbeta(omegaM1[m]*(kappaM1[m]-2)+1 , (1-omegaM1[m])*(kappaM1[m]-2)+1 )
mE2[s] ~ dbeta(omegaM2[m]*(kappaM2[m]-2)+1 , (1-omegaM2[m])*(kappaM2[m]-2)+1 )
mE[s] <- equals(m,1)*mE1[s] + equals(m,2)*mE2[s]
z[s] ~ dbin( mE[s] , N[s] )
}
}
以下是相关数据的R代码:
dataList = list(
z = c(81, 59, 36, 18, 28, 59, 63, 57, 42, 28, 47, 55, 38,
30, 22, 32, 31, 30, 32, 33, 32, 26, 13, 33, 30),
N = rep(96, 25),
Nsubj = 25
)
当我运行此模型时,MCMC将每次迭代都花费在m = 1
,并且永远不会跳转到m = 2
。我尝试了很多不同的先验和伪先验组合,但似乎找不到MCMC会考虑m = 2
的组合。我甚至尝试为模型1和模型2指定相同的先验和伪先验,但这没有帮助。在这种情况下,我希望MCMC在模型之间相当频繁地跳跃,花费大约一半时间考虑一个模型,一半时间考虑另一个模型。但是,JAGS仍然在m = 1
度过了整个时间。我已经运行了6000次迭代链,这对于像这样的简单模型应该足够长。
如果有人对如何解决这个问题有任何想法,我将非常感激。
干杯, 添
答案 0 :(得分:1)
我还没有能够解决这个问题,但我认为其他任何从事此工作的人都可能会欣赏以下代码,这些代码将使用rjgs重现R从头到尾的问题(必须有JAGS)安装)。
请注意,由于此示例中只有两个竞争模型,因此我将m ~ dcat()
更改为m ~ dbern()
,然后将m
替换为代码中其他位置的m+1
。我希望这可以改善这种行为,但事实并非如此。另请注意,如果我们指定m的初始值,则无论我们选择哪个值,它都会一直停留在该值,因此我无法正确更新(而不是被一个模型或另一个模型所吸引)。对我来说是一个令人头疼的事;可能值得在http://sourceforge.net/p/mcmc-jags/discussion/
library(rjags)
load.module('glm')
dataList = list(
z = c(81, 59, 36, 18, 28, 59, 63, 57, 42, 28, 47, 55, 38,
30, 22, 32, 31, 30, 32, 33, 32, 26, 13, 33, 30),
N = rep(96, 25),
Nsubj = 25
)
sink("mymodel.txt")
cat("model {
m ~ dbern(.5)
omegaM1[1] <- 0.5 #true prior
omegaM1[2] <- 0.5 #psuedo prior
kappaM1[1] <- 3 #true prior for Model 1
kappaM1[2] <- 5 #puedo prior for Model 1
omegaM2[1] <- 0.5 #psuedo prior
omegaM2[2] <- 0.5 #true prior
kappaM2[1] <- 5 #puedo prior for Model 2
kappaM2[2] <- 10 #true prior for Model 2
for ( s in 1:Nsubj ) {
mE1[s] ~ dbeta(omegaM1[m+1]*(kappaM1[m+1]-2)+1 , (1-omegaM1[m+1])*(kappaM1[m+1]-2)+1 )
mE2[s] ~ dbeta(omegaM2[m+1]*(kappaM2[m+1]-2)+1 , (1-omegaM2[m+1])*(kappaM2[m+1]-2)+1 )
z[s] ~ dbin( (1-m)*mE1[s] + m*mE2[s] , N[s] )
}
}
", fill=TRUE)
sink()
inits <- function(){list(m=0)}
params <- c("m")
nc <- 1
n.adapt <-100
n.burn <- 200
n.iter <- 5000
thin <- 1
mymodel <- jags.model('mymodel.txt', data = dataList, inits=inits, n.chains=nc, n.adapt=n.adapt)
update(mymodel, n.burn)
mymodel_samples <- coda.samples(mymodel,params,n.iter=n.iter, thin=thin)
summary(mymodel_samples)
答案 1 :(得分:1)
技巧不是为模型分配固定概率,而是基于统一先验估计它(phi
以下)。然后,您需要phi
的后验分布,因为它告诉您选择模型2的概率(即,&#34;成功&#34;意味着m = 1; Pr(模型1)= 1-phi)。
sink("mymodel.txt")
cat("model {
m ~ dbern(phi)
phi ~ dunif(0,1)
omegaM1[1] <- 0.5 #true prior
omegaM1[2] <- 0.5 #psuedo prior
kappaM1[1] <- 3 #true prior for Model 1
kappaM1[2] <- 5 #puedo prior for Model 1
omegaM2[1] <- 0.5 #psuedo prior
omegaM2[2] <- 0.5 #true prior
kappaM2[1] <- 5 #puedo prior for Model 2
kappaM2[2] <- 10 #true prior for Model 2
for ( s in 1:Nsubj ) {
mE1[s] ~ dbeta(omegaM1[m+1]*(kappaM1[m+1]-2)+1 , (1-omegaM1[m+1])*(kappaM1[m+1]-2)+1 )
mE2[s] ~ dbeta(omegaM2[m+1]*(kappaM2[m+1]-2)+1 , (1-omegaM2[m+1])*(kappaM2[m+1]-2)+1 )
z[s] ~ dbin( (1-m)*mE1[s] + m*mE2[s] , N[s] )
}
}
", fill=TRUE)
sink()
inits <- function(){list(m=0)}
params <- c("phi")
答案 2 :(得分:0)
请参阅上面关于Mark S回答的评论。
这个答案是通过例子说明我们为什么要推理m而不是phi。
想象一下,我们有一个由
给出的模型data <- c(-1, 0, 1, .5, .1)
m~dbern(phi)
data[i] ~ m*dnorm(0, 1) + (1-m)*dnorm(100, 1)
现在,很明显m的真实值是1.但我们对phi的真正价值了解多少?显然,更高的phi值更有可能,但我们实际上并没有很好的证据来排除较低的phi值。例如,phi = 0.1仍然有10%的几率产生m = 1;并且phi = 0.5仍然有50%的几率产生m = 1。所以我们没有很好的证据来反对相当低的phi值,即使我们有铁证据证明m = 1。我们想要推断m。