我使用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]])
中提取骨架也可以解决问题。还是我很复杂?
答案 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中的矩阵对象。