2017-04-11 8 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()関数です。だから、行列A、B、Cをリストに入れてL = list(A=A,B=B,C=C)なら、このリストをunlist()のベクトルに変換してrelist()に変換することができます。私はmcmcオブジェクトのために同様の/ readymadeを探していますが、これまでのところ役に立たなかった - 私はこれを必要とする最初の人だとは思えません。明らかに、relist(colMeans(output[[1]]))は機能しません。

誰でも再構成を手伝うことができますか?

編集:relist()機能のみそうcolnames(output[[1]])からスケルトンを抽出することもトリックを行うだろう、スケルトンを必要としていることにも注意してください。それとも、私は複雑ですか?

答えて

0

私はrelist()は、トリックを行いますとは思わない...

私はRパッケージcodaで定義されている、あなたのオブジェクトoutputは、クラスmcmc.listの目的である、とoutput[[1]]がクラスmcmcの対象であると仮定最初のMCMC鎖のサンプルを表す。

私はかなり確信しています。codaは理解できません。 "A[1,1]"はJAGSマトリックスで、変数名として扱います。したがって、関連する変数を繰り返し処理し、構造を自分自身に課す必要があります。

理想的には、次のような機能でこれをラップしたい:output[[1]]に保存されたマトリックスBは3行4列を持っている場合

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] 
    ) 
    ) 
) 
} 

したがって、たとえば、あなたが書いたと思います:

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

Rで行列オブジェクトとして手段を得る。

関連する問題