首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从mcmc对象重构变量

从mcmc对象重构变量
EN

Stack Overflow用户
提问于 2017-04-11 15:54:59
回答 1查看 364关注 0票数 0

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

代码语言:javascript
复制
> 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]])中提取骨架也是很有用的。还是我变得复杂了?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-04-11 18:55:02

我不认为relist()会做这个.

我假设您的对象outputmcmc.list类的对象,如R包coda中定义的那样,而output[[1]]是类mcmc的对象,表示第一个MCMC链的示例。

我确信coda没有任何理解,例如,"A[1,1]"是一个JAGS矩阵,它只是将它作为一个变量来处理。因此,您必须迭代相关变量,并自己强制执行结构。

理想情况下,您应该将其包装在如下函数中:

代码语言:javascript
复制
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列,那么您应该编写:

代码语言:javascript
复制
getMatrix(output[[1]], "B", 3, 4)

在R中得到作为矩阵对象的方法。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43350830

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档