从mcmc对象重建变量

时间:2017-04-11 15:54:59

标签: r mcmc jags rjags

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

> 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对象寻找类似/现成的东西,但到目前为止无济于事 - 我无法相信我是第一个需要它的人。显然,relist(colMeans(output[[1]]))无效。

任何人都可以帮我重建?

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

1 个答案:

答案 0 :(得分:0)

我不认为relist()会做到这一点......

我假设您的对象output是类mcmc.list的对象,如R包coda中所定义,output[[1]]是类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]
      )
    )
  )
}

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

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

将手段作为R中的矩阵对象。