为啥 jags 结果和 depmixS4 有时不同?

Posted

技术标签:

【中文标题】为啥 jags 结果和 depmixS4 有时不同?【英文标题】:Why the jags result and depmixS4 are sometimes different?为什么 jags 结果和 depmixS4 有时不同? 【发布时间】:2014-08-15 06:05:58 【问题描述】:

我有一个类似以下模拟数据的数据集:

Pi = matrix(c(0.9,0.1,0.3,0.7),2,2,byrow=TRUE)
delta = c(.5,.5)

z = sample(c(1,2),1,prob=delta)
T = 365
for( t in 2:T)
  z[t] = sample(x=c(1,2),1,prob=Pi[z[t-1],])


x <- sample(x=seq(-1, 1.5, length.out=T),T,replace=TRUE)

alpha = c(-1, -3.2)
Beta = c(-4,3)

y<-NA
for(i in 1:T)
  y[i] = rbinom(1,size=10,prob=1/(1+exp(-Beta[z[i]]*x[i]-alpha[z[i]])))


SimulatedBinomData <- data.frame('y' = y, 'x' = x , size=rep(10,T), 'z' = z)

yy<-NA
xx<-NA
for(i in 1:dim(SimulatedBinomData)[1])
  yy<-c(yy,c(rep(1,SimulatedBinomData$y[i]),rep(0,(SimulatedBinomData$size[i]-SimulatedBinomData$y[i]))))
  xx<-c(xx,rep(SimulatedBinomData$x[i],SimulatedBinomData$size[i]))

yy<-yy[-1]
xx<-xx[-1]

SimulatedBernolliData<-data.frame(y=yy,x=xx, tt=rep(c(1:T),rep(10,T)))

这是一个具有两个状态的 HMM 问题,这意味着隐马尔可夫链 z_t 属于 1,2。要估计两种不同状态下的 alpha 和 Beta,我可以使用包“depmixS4”并找到最大似然估计值,或者我可以使用“rjags”包中的 MCMC。

我希望这两个估计值几乎相同,而当我针对不同的模拟数据运行以下程序时,有好几次,答案都不相同而且非常不同!

library("rjags")
library("depmixS4")

mod <- depmix(cbind(y,(size-y))~x, data=SimulatedBinomData, nstates=2, family=binomial(logit))
fm <- fit(mod)
getpars(fm)

n<-length(SimulatedBernolliData$y)
T<-max(SimulatedBernolliData$tt)                 

cat("model 

    # Transition Probability
    Ptrans[1,1:2] ~ ddirch(a)
    Ptrans[2,1:2] ~ ddirch(a)    

    # States
    Pinit[1] <- 0.5 #failor
    Pinit[2] <- 0.5 #success
    state[1] ~ dbern(Pinit[2])

    for (t in 2:T) 
    state[t] ~ dbern(Ptrans[(state[t-1]+1),2])
    

    # Parameters
    alpha[1] ~ dunif(-1.e10, 1.e10)
    alpha[2] ~ dunif(-1.e10, 1.e10)

    Beta[1] ~ dunif(-1.e10, 1.e10)
    Beta[2] ~ dunif(-1.e10, 1.e10)

    # Observations
    for (i in 1:n)
    z[i] <- state[tt[i]] 
    y[i] ~ dbern(1/(1+exp(-(alpha[(z[i]+1)]+Beta[(z[i]+1)]*x[i]))))
    
    ",
file="LeftBehindHiddenMarkov.bug")

jags <- jags.model('LeftBehindHiddenMarkov.bug', data = list('x' =  SimulatedBernolliData$x, 'y' = SimulatedBernolliData$y, 'tt' = SimulatedBernolliData$tt, T=T, n = n, a = c(1,1) ))
res <- coda.samples(jags,c('alpha', 'Beta', 'Ptrans','state'),1000)
res.median = apply(res[[1]],2,median)
res.median[1:8]
res.mean = apply(res[[1]],2,mean)
res.mean[1:8]
res.sd = apply(res[[1]],2,sd)
res.sd[1:8]
res.mode = apply(res[[1]],2,function(x)as.numeric(names(table(x))
[which.max(table(x))]) )
res.mode[1:8]

【问题讨论】:

【参考方案1】:

您在 JAGS 代码中遇到了标签切换问题,即状态 z[i]=1 没有限制到 Betaz[i]=2 的较低后验值到较高的 Beta。因此,对于 MCMC 的每次迭代,它们都可以切换。有several ways to solve this problem。其中之一是部分重排序,即对于每次 MCMC 迭代,为 Beta 绘制两个独立的值并对其进行排序,使得 Beta[1] Beta[2]。

你可以通过替换来做到这一点

Beta[1] ~ dunif(-1.e10, 1.e10)
Beta[2] ~ dunif(-1.e10, 1.e10)

Beta[1:2] <- sort(Betaaux)
Betaaux[1] ~ dunif(-1.e10, 1.e10)
Betaaux[2] ~ dunif(-1.e10, 1.e10)

当然,也可以在alpha 参数上进行排序。选择用于部分重新排序的参数取决于问题。

【讨论】:

以上是关于为啥 jags 结果和 depmixS4 有时不同?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用来自 rjags / JAGS 的估计值来预测值

C#将Jagged Arrays保存到Drive

JFrame 中的 JPanel 有时不显示内容。为啥?

为啥 iTunes Store 评论 RSS 提要有时不返回任何结果?

C#中有哪些类型的数组

如何修复 R2jags::jags 中的“节点与父母不一致”