2017-04-11 42 views
0

我使用rjags作为采样器。该模型定义了3个矩阵。函数coda.samples返回样本列表。如果我拿第一个样本列表,列名看起来像这样:重建mcmc对象的变量

> 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]])提取骨架也可以做到这一点。还是我复杂?

回答

0

我不认为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中的矩阵对象的手段。