从 mcmc 对象重建变量

Reconstructing variables from mcmc objects

我正在使用 rjags 作为采样器。该模型定义了 3 个矩阵。 coda.samples 函数 returns 样本列表。如果我采用第一个样本列表,列名如下所示:

> colnames(output[[1]])
"A[1,1]"  "A[2,1]"  "A[1,2]"  "A[2,2]" ... 
"B[1,1]"  "B[2,1]"  "B[3,1]"  "B[4,1]" ... 
"C[1,1]"  "C[2,1]"

显然,A、B 和 C 在我的模型中是矩阵。我想根据这些样本的平均值重建它们。我可以使用 colMeans(output[[1]]) 轻松获得方法,但我不知道如何轻松地从该向量重建矩阵。

重建的一个好方法是 relist() 函数。因此,如果我在列表 L = list(A=A,B=B,C=C) 中有矩阵 A、B 和 C,那么我可以使用 unlist() 将此列表转换为向量,然后使用 relist() 转换回来。我正在为 mcmc 对象寻找 similar/readymade 的东西,但到目前为止无济于事 - 我不敢相信我是第一个需要这个的人。显然,relist(colMeans(output[[1]])) 不起作用。

谁能帮我重建一下?

编辑:另请注意,relist() 函数只需要一个骨架,因此从 colnames(output[[1]]) 中提取骨架也可以解决问题。还是我复杂化了?

我认为 relist() 不会成功...

我假设你的对象 output 是 class mcmc.list 的对象,如 R 包 coda 中所定义,并且 output[[1]] 是一个对象class mcmc 表示第一个 MCMC 链的样本。

我很确定 coda 没有任何理解,例如"A[1,1]" 是一个 JAGS 矩阵,它只是把它当作一个变量名来处理。所以你必须迭代相关变量并自己强加结构。

理想情况下,您将其包装在如下函数中:

getMatrix <- function(output, varname, rows, cols) {
  unname(
    sapply(1:cols, function(j)
      sapply(1:rows, function(i)
        summary(output[,sprintf("%s[%s,%s]", varname, i, j)])[[1]][1]
      )
    )
  )
}

因此,例如,如果存储在 output[[1]] 中的矩阵 B 有 3 行和 4 列,您可以写成:

getMatrix(output[[1]], "B", 3, 4)

在 R 中获取作为矩阵对象的均值。