R JAGS:集群的可变数量
我试图运行一个贝叶斯聚类模型,其中聚类的数量是随机的二项分布。 这是我的Jags型号:R JAGS:集群的可变数量,r,jags,rjags,R,Jags,Rjags,我试图运行一个贝叶斯聚类模型,其中聚类的数量是随机的二项分布。 这是我的Jags型号: model{ for(i in 1:n){ y[ i ,1:M] ~ dmnorm( mu[z[i] , 1:M] , I[1:M, 1:M]) z[i] ~ dcat(omega[1:M]) } for(j in 1:M){ mu[j,1:M] ~ dmnorm( mu_input[j,1:M] , I[1:M, 1:M]
model{
for(i in 1:n){
y[ i ,1:M] ~ dmnorm( mu[z[i] , 1:M] , I[1:M, 1:M])
z[i] ~ dcat(omega[1:M])
}
for(j in 1:M){
mu[j,1:M] ~ dmnorm( mu_input[j,1:M] , I[1:M, 1:M] )
}
M ~ dbin(p, Mmax)
omega ~ ddirich(rep(1,Mmax))
}
要运行它,我们需要定义参数和变量的初始值,这在R脚本中完成
Mmax=10
y = matrix(0,100,Mmax)
I = diag(Mmax)
y[1:50,] = mvrnorm(50, rep(0,Mmax), I)
y[51:100,] = mvrnorm(50, rep(5,Mmax), I)
plot(y[,1:2])
z = 1*((1:100)>50) + 1
n = dim(y)[1]
M=2
mu=matrix(rnorm(Mmax^2),nrow=Mmax)
mu_input=matrix(2.5,Mmax,Mmax) ### prior mean
p=0.5
omega=rep(1,Mmax)/Mmax
data = list(y = y, I = I, n = n, mu_input=mu_input, Mmax = Mmax, p = p)
inits = function() {list(mu=mu,
M=M,
omega = omega) }
require(rjags)
modelRegress=jags.model("cluster_variabile.txt",data=data,inits=inits,n.adapt=1000,n.chains=1)
但是,运行最后一个命令时
Error in jags.model("cluster_variabile.txt", data = data, inits = inits,
: RUNTIME ERROR: Compilation error on line 6.
Unknown variable M Either supply values
for this variable with the data or define it on the left hand side of a relation.
这对我来说毫无意义,因为即使M已经出现在模型的第4行,错误也在第6行!运行此脚本的实际问题是什么?因此,我认为主要问题是无法更改正在更新的随机节点的维度。这似乎是可逆跳跃MCMC的一个问题,尽管我认为在JAGS中无法做到这一点。因此,我认为主要的问题是,您无法更改正在更新的随机节点的维度。这似乎是可逆跳转MCMC的一个问题,尽管我认为在JAGS中无法做到这一点。因此JAGS与R或其他编程过程语言不同,因为它实际上不是逐行运行的,它是一种声明性语言,意味着命令的顺序实际上并不重要,至少在错误如何弹出方面是如此。所以,仅仅因为它没有在第4行抛出错误并不意味着那里也没有什么问题。我不是肯定的,但我相信错误正在发生,因为JAGS试图在输入值之前先构建数组,所以M在这个阶段实际上没有定义,但您对此无能为力
除此之外,应该有一个相当简单的解决方法,它只是效率较低。不要从
1:M
循环,而是让循环从1:MMax
循环,这样维度实际上不会改变,它始终是一个MMax MMax。然后第7行只将这些位置中的1:M分配给一个值。这样做的缺点是,在模型适合之后,需要您进行一些处理。因此,在每次迭代中,您需要提取采样的M,并将矩阵mu过滤为mxm,但这应该不会太难。如果您需要更多帮助,请告诉我。因此,JAGS与R或其他编程过程语言不同,它实际上不是逐行运行的,它是一种声明性语言,意味着命令的顺序实际上并不重要,至少在错误如何弹出方面是如此。所以,仅仅因为它没有在第4行抛出错误并不意味着那里也没有什么问题。我不是肯定的,但我相信错误正在发生,因为JAGS试图在输入值之前先构建数组,所以M在这个阶段实际上没有定义,但您对此无能为力
除此之外,应该有一个相当简单的解决方法,它只是效率较低。不要从
1:M
循环,而是让循环从1:MMax
循环,这样维度实际上不会改变,它始终是一个MMax MMax。然后第7行只将这些位置中的1:M分配给一个值。这样做的缺点是,在模型适合之后,需要您进行一些处理。因此,在每次迭代中,您需要提取采样的M,并将矩阵mu过滤为mxm,但这应该不会太难。如果您需要更多帮助,请告诉我。这意味着没有解决方案?我认为在JAGS中没有。可以编写一个更新的函数,但我不相信它会得到正确的答案。考虑这个问题的一种方法是,例如,如果M=2,则相对于数据更新与2个组相关的参数,而不是与任何其他数量的组相关的参数。一个几乎同样好的替代方法是估计10个不同的解决方案,并查看DIC或其他一些聚类统计数据,例如C-H或Gap统计数据。在#簇上具有后验分布将导致这些值的后验分布。这意味着没有解决方案?我认为在JAGS中没有。可以编写一个更新的函数,但我不相信它会得到正确的答案。考虑这个问题的一种方法是,例如,如果M=2,则相对于数据更新与2个组相关的参数,而不是与任何其他数量的组相关的参数。一个几乎同样好的替代方法是估计10个不同的解决方案,并查看DIC或其他一些聚类统计数据,例如C-H或Gap统计数据。在#簇上具有后验分布将导致这些值的后验分布。