0

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()函数。因此,如果我在列表中有矩阵 A、B 和 C,L = list(A=A,B=B,C=C)那么我可以将此列表转换为带有 的向量unlist()并转换回relist(). 我正在为 mcmc 对象寻找类似/现成的东西,但到目前为止无济于事 - 我不敢相信我是第一个需要这个的人。显然,relist(colMeans(output[[1]]))行不通。

有人可以帮我重建吗?

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

4

1 回答 1

0

我不认为relist()会做的伎俩...

我假设您的对象outputmcmc.listR 包中定义的 class 对象coda,并且output[[1]]mcmc代表第一个 MCMC 链示例的 class 对象。

我很确定coda没有任何理解 eg"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 中的矩阵对象。

于 2017-04-11T18:55:02.400 回答