【问题标题】:Reconstructing variables from mcmc objects从 mcmc 对象重构变量
【发布时间】:2017-04-12 02:55:02
【问题描述】:

我使用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]]) 中提取骨架也可以解决问题。还是我复杂了?

【问题讨论】:

    标签: r mcmc jags rjags


    【解决方案1】:

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

    我假设您的对象 outputmcmc.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]
          )
        )
      )
    }
    

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

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

    将均值作为 R 中的矩阵对象。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-04-09
      • 2013-09-15
      • 1970-01-01
      • 1970-01-01
      • 2022-12-12
      • 1970-01-01
      • 1970-01-01
      • 2013-04-19
      相关资源
      最近更新 更多