正規逆カイ2乗分布の乱数生成方法の一例

正規線形モデルにおけるパラメータ( \mathbb{\beta}, \sigma^2)に対する共役事前分布は,正規逆カイ2乗分布(normal inverse chi-square distribution)であることが知られています(Hagan and Forster 2004: pp.305-307, 繁桝 1985: pp.176-177).

 

正規逆カイ2乗分布の乱数を生成する方法はいくつかあるようですが(ギブスサンプリングで生成するのが王道かもしれません?)(←削除:McAlinn先生からTwitterにて教えていただいた(202113日)のですが,この記事で述べる方法も「ギブスサンプリング」と呼べるとのことです. \mathbb{\beta}| \sigma^2\sigma^2| \mathbb{\beta} の条件付き分布を交互に生成するものだけを「ギブスサンプリング」と呼ぶと私は勘違いしていました.)

 f(\mathbb{\beta}, \sigma^2)  = f(\sigma^2) f(\mathbb{\beta}| \sigma^2)

と分解して,前者の周辺分布が逆カイ2乗分布,後者の条件付き分布が多変量正規分布に従うことを利用するのが,素直な方法のようにも思えます.

 

以下のRコードは,その素直な方法で正規逆カイ2乗分布の乱数を生成しています.また, \mathbb{\beta}の1変量周辺分布のヒストグラムを描いて,それが解析的な答え(位置-尺度型のt分布)になっていることを見た目で確認しています.

 \mathbb{\beta}の分散共分散行列が \sigma^2 \times S0となるようにパラメタライゼーションしています.また, tau = 1/\sigma^2です.)

 

set.seed(20220103)
b0 <- c(2, 9, 1)
S0 <- matrix(c(3,1,1,1,5,1,1,1,7), nrow=3, ncol=3)
l0 <- 7.5;
nu0 <- 10;
nsim <- 100000;

Ch0 = chol(S0);
p <- length(b0)

result <- matrix(nrow = nsim, ncol = 4);
for(i in 1:nsim){
    tau <- rchisq(1,nu0) /(nu0 * l0);
    b <- b0 + (Ch0/sqrt(tau)) %*% rnorm(p);
    result[i, 1] <- tau;
    result[i, 2:(p+1)] <- t(b);
};

scale <- matrix(nrow = p, ncol = 1)
par(mfrow = c(2,2))   
for(i in 1:p){
  scale[i] <- sqrt(S0[i, i])*sqrt(l0);
  hist(result[,i + 1], prob = TRUE)
  curve((1/scale[i])*dt((x -b0[i])/scale[i], nu0), add = TRUE)
}

 

f:id:Tarotan:20220103171539p:plain

βの周辺分布がt分布になることの確認

上記のコードは事前分布の乱数を生成するものです.事後分布は,ハイパーパラメータがちょっと複雑なものになると思います(試していません).

(...そもそも論として,乱数を生成するのであれば,共役事前分布を仮定する実用上の意義がないように思います....)

 

参考文献

O'Hagan, A. and Forster, J. (1994:1st ed., 2004:2nd ed.) Kendall's Advanced Theory of Statistics. Vol.2B. Bayesian Inference. 

繁桝算男(1985)『ベイズ統計入門』東京大学出版会