【问题标题】:JAGS: variable number of clustersJAGS:可变数量的集群
【发布时间】:2020-12-14 17:33:47
【问题描述】:

我正在尝试运行一个贝叶斯聚类模型,其中聚类的数量是随机的,具有二项分布。 这是我的 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 行!运行此脚本的实际问题是什么?

【问题讨论】:

    标签: r jags rjags


    【解决方案1】:

    所以 JAGS 不像 R 或其他编程过程语言,因为它实际上并不逐行运行,它是一种声明性语言,这意味着命令的顺序实际上并不重要,至少就错误如何弹出而言向上。因此,仅仅因为它没有在第 4 行抛出错误并不意味着那里也没有错误。我不是肯定的,但我相信错误正在发生,因为 JAGS 尝试在输入值之前先构建数组,所以在这个阶段实际上没有定义 M,但你对此无能为力。

    除此之外,应该有一个相当简单的解决方法,它只是效率较低。不是从1:M 循环,而是从1:MMax 循环迭代,这样尺寸实际上不会改变,它始终是 MMax x MMax。然后第 7 行只是将这些位置中的 1:M 分配给一个值。这样做的缺点是它需要您在模型拟合后进行一些处理。因此,在每次迭代中,您都需要提取采样的 M 并将矩阵 mu 过滤为 M x M,但这应该不会太难。如果您需要更多帮助,请告诉我。

    【讨论】:

      【解决方案2】:

      所以,我认为主要问题是您无法更改正在更新的随机节点的维度。这似乎是可逆跳跃 MCMC 的一个问题,尽管我认为你不能在 JAGS 中做到这一点。

      【讨论】:

      • 这表示没有办法解决?
      • 我认为不在 JAGS 中。可以编写一个更新的函数,但我不相信它会得到正确的答案。考虑该问题的一种方法是,例如,如果 M=2,则您正在更新与数据相关的 2 个组相关的参数,而不是与任何其他数量的组相关的参数。估计 10 种不同的解决方案并查看 DIC 或其他一些聚类统计数据(例如 C-H 或 Gap 统计数据)几乎是一个很好的替代方案。在 # 个集群上具有后验分布会在这些值上产生后验分布。
      猜你喜欢
      • 1970-01-01
      • 2019-11-26
      • 2014-03-14
      • 1970-01-01
      • 2018-06-09
      • 2019-05-02
      • 2021-07-07
      • 1970-01-01
      相关资源
      最近更新 更多