この記事は「元となる分布がRに存在し、かつ1次元の場合」向けの内容です
「3以上5以下の値しか取らない正規分布の乱数がほしい」
「1以上の値しか取らないポアソン分布の乱数がほしい」
といったときに使えます。
#切断分布
確率変数$X$の密度関数を$f(x)$、累積密度関数を$F(x)$、逆関数を$F^{-1}(x)$とします。もし、$X$の範囲が$b<x\leq a$に制限されたなら、その密度関数は
$$
f(x|b<x<a)=\frac{f(x)}{F(a)-F(b)},\quad (b<x \leq a)
$$
で表記されます。$(X|b<X<a)$ の分布から得られる乱数は一様分布と$F(x)$、$F^{-1}(x)$から得ることができます。
$$
X|b<X\leq a\ \sim \ F(U(F^{-1}(b), F^{-1}(a)))
$$
この手法を用いることで効率よく切断分布の乱数を得ることができる。
###3以上5以下の値しか取らない正規分布の乱数
$X \sim N(2,1)$のとき$(X|3<X\leq 5)$の乱数を生成。
mu<-0;sigma2<-1
aa<-5;bb<-3
xx<-qnorm(runif(10000,pnorm(bb,mu,sigma2,1),pnorm(aa,mu,sigma2)),mu,sigma2)
hist(xx,xlim=c(-5,6),freq=F)
ヒストグラムを書くと
hist(xx,xlim=c(-5,6))
が得られます。
###1以上の値しか取らないポアソン分布の乱数
$X \sim Po(0.3)$のとき$(X|1\leq X)$の乱数を生成。
lambda<-0.3
bb<-0;aa<-Inf
xx<-qpois(runif(10000,ppois(bb,lambda),ppois(aa,lambda)),lambda)
hist(xx,xlim=c(-0.1,6))
離散分布なので$bb$は$0.1$や$0.99$を代入しても同じ結果が得られる。
##手法の利点
もし$X$から乱数を発生し$b<X\leq a$ が既定の回数得られるまで繰り返すと、計算時間がかかる場合がある。
本手法はその問題を回避することができる。