2017-05-09 3 views
2

私はRstanのベイジアン階層モデルを推定しようとしており、モデルに多変量スキュー正規分布を含めたいと考えています。これはStanですでに定義されているディストリビューションではありませんが、ドキュメンテーションはCholeskyの要素を使ってドキュメントを実装できることを示唆しています。たとえば、Stan 2.15.0のドキュメントには、333-334ページに記載されています。 "この標準化された正規分布の再正規化は、他の多変量分布に拡張することができます。多変量スチューデントtおよびスキュー多変量正規分布などの多変量正規分布を使用します。スタンの多変量スキューノーマル

実際にこれを行う方法を知っている人はいますか?私はStanでスキル多変量を自分自身で実装することを検討しましたが、単純な実装に適した閉じた形の配布があるようには見えません。

+0

私はスタンコードを持っていませんが、これは役立つかもしれません:http://www.anstuocmath.ro/mathematics/pdf10/83_96_RVernic.pdf。 –

答えて

0

したがって、snパッケージはrmsn明確にコードの次のセクションを示しています

function (n = 1, xi = rep(0, length(alpha)), Omega, alpha, tau = 0, dp = NULL) { 
//.... 
    lot <- dp2cpMv(dp = dp0, family = "SN", aux = TRUE) 
    d <- length(dp0$alpha) 
    y <- matrix(rnorm(n * d), n, d) %*% chol(lot$aux$Psi) 
//.... 
} 

これはどのようにmvtnorm::rmvn作品に非常によく似ているだけでchol()法におけるマトリックスは、コアライブラリhereにdp2cpMv機能から来ています。それをあなたのfunctions{}ブロックに移植することができます。そして、あなたのスタンプログラムにあなたが行くdp2cvClone()への入力がある場合は、変換パラメータからのものをシフトすることもできます。また

functions { 
    // Contains code for your ported cholesky factor 
} 
transformed parameters { 
    matrix[K, J] z; 
    cholesky_factor_corr[K] L_tri = dp2cvClone(...); // Cholesky factor from your function{} block.. 
    beta = foo + (L_tri * z)'; // Assuming foo is baseline parameter representing the mean of dimensionality J*K. 
.... 
} 

parameters { 
    matrix[K, J] beta; //# J levels/groups and K dimensional parameters 
    to_vector(z) ~ normal_pdf(0, 1); 
    .... 
} 

データをブロックしたり、変換されたデータブロック(Iはchol()でCOV行列を想定していますと、パラメータがあります)データ。しかし、あなたはポイントを得る。 この最後のコードセクションはスタンマニュアルsection 8.15から抜粋し、簡潔にするために言い換えて、機能させるために必要な重要な部分をキャプチャしたいと考えています。

関連する問題