Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R JAGS:集群的可变数量_R_Jags_Rjags - Fatal编程技术网

R 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]

我试图运行一个贝叶斯聚类模型,其中聚类的数量是随机的二项分布。 这是我的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] )
    }
    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统计数据。在#簇上具有后验分布将导致这些值的后验分布。