5
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

切断分布(Truncated distribution)の乱数をRで生成する方法

Last updated at Posted at 2016-09-03

この記事は「元となる分布が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))

図2.png

が得られます。

###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))

図3.png

離散分布なので$bb$は$0.1$や$0.99$を代入しても同じ結果が得られる。

##手法の利点
もし$X$から乱数を発生し$b<X\leq a$ が既定の回数得られるまで繰り返すと、計算時間がかかる場合がある。
本手法はその問題を回避することができる。

5
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?