我正在尝试在R和OpenBUGS中实现FHMM,但现在我仍然坚持以下错误。
起初,OpenBUGS只是给了我讨厌的东西"出了问题"错误,将Traphandler.ocf重命名为Traphandler_simple.ocf后,我能够看到"索引超出范围" GraphCat.Parents中发生错误。尽管如此,我无法找到令人讨厌的代码(对Fortran一无所知,对MCMC一无所知)
我试图构建的FHMM的结构有M = 3个子链(s [m,n],其中m = 1,2,3,n = 1,...,100,在我的代码中),每个子链具有K = 2个状态,并且发射y是3个链的线性高斯分布。排放
这是我的模特,
# M=3, K=2, N=100
model <- function() {
for( m in 1:M ) {
s[m,1] ~ dcat(pi[m,1:K]) # initial states of each sub-chain
}
for( m in 1:M ) {
for( i in 2:N ) {
s[m,i] ~ dcat(trans[s[m,i-1],1:K,m]) # dim(trans) is c(2,2,3)
}
}
for( m in 1:M ) {
for( i in 1:N ) {
mu0[m,i] <- mu[m,s[m,i]]
sigma[m,i] <- 1/tau[m,s[m,i]]
}
}
for( i in 1:N ) {
mm[i] <- sum(mu0[1:M,i])
tt[i] <- 1/sum(sigma[1:M,i])
y[i] ~ dnorm(mm[i],tt[i])
}
}
这就是我在R中设置初始值和数据的方法,
# Initial values
s.B <- matrix(rep(M*N),nrow=M,ncol=N)
for(i in 1:M) {
s.B[i,] <- sample(1:K, N, replace=TRUE, rdirichlet(1,rep(1, K)))
}
inits <- function() {list(s=s.B)}
# data
P1 <- array(dim=c(2,2,3))
for( i in 1:M ) {
P1[,,i] <- rdirichlet(K,rep(1, K))
}
K <- 2,
M <- 3,
N <- 100,
pi <- rdirichlet(M,rep(1, K)),
trans <- P1,
mu <- mus + rnorm(M*K,0,1),
sigma <- sigmas + rnorm(M*K,0,0.3)
tau <- 1/sigma
# y is the observed sequence of data
data <- list("y","pi","trans","mu","tau","N","K","M")
# Parameters
params <- c("s")
当OpenBUGS尝试对s [1,2]进行采样时,似乎发生了错误, 但我对这意味着什么没有一点相关的线索。 (stackoverflow不允许我发布屏幕截图,直到我有10个声誉......)