正規分布からサンプリングしますが、シミュレーションの前に指定範囲外のすべてのランダム値を無視します。
この方法は正しいですが、@ Xi'anの答えで述べたように、範囲が狭い場合(より正確には、正規分布の下で測定値が小さい場合)に時間がかかります。
F− 1(U)Fうん〜UNIF (0 、1 )FG(a 、b )G− 1(U)うん〜ユニフ( G (a )、G (B ))
G− 1G− 1GG− 1abG
重要度サンプリングを使用して切り捨てられた分布をシミュレートする
N(0 、1 )GGG ( q)= arctan( q)π+ 12G− 1( q)= tan( π( q− 12))
うん〜UNIF ( G ()、G (B ))G− 1(U)日焼け(U′)うん′〜UNIF (逆正接(a )、 arctan(b ))
a <- 1
b <- 5
nsims <- 10^5
sims <- tan(runif(nsims, atan(a), atan(b)))
バツ私ϕ (x )/ g(x )
w (x )= exp(− x2/ 2)(1+ x2)、
log_w <- -sims^2/2 + log1p(sims^2)
w <- exp(log_w) # unnormalized weights
w <- w/sum(w)
(x私、w (x私))[ u 、v ]
u <- 2; v<- 4
sum(w[sims>u & sims<v])
## [1] 0.1418
これにより、ターゲット累積関数の推定値が提供されます。spatsat
パッケージですばやく取得してプロットできます。
F <- spatstat::ewcdf(sims,w)
# estimated F:
curve(F(x), from=a-0.1, to=b+0.1)
# true F:
curve((pnorm(x)-pnorm(a))/(pnorm(b)-pnorm(a)), add=TRUE, col="red")
# approximate probability of u<x<v:
F(v)-F(u)
## [1] 0.1418
(x私)
msample <- rmultinom(1, nsims, w)[,1]
resims <- rep(sims, times=msample)
hist(resims)
mean(resims>u & resims<v)
## [1] 0.1446
別の方法:高速逆変換サンプリング
オルバーとタウンゼントは、幅広いクラスの連続分布のサンプリング方法を開発しました。Matlabのchebfun2ライブラリとJuliaのApproxFunライブラリに実装されています。私は最近このライブラリを発見しましたが、これは非常に有望です(ランダムサンプリングだけでなく)。基本的に、これは反転法ですが、累積分布関数と逆累積分布関数の強力な近似を使用します。入力は、正規化までのターゲット密度関数です。
サンプルは、次のコードで簡単に生成されます。
using ApproxFun
f = Fun(x -> exp(-x.^2./2), [1,5]);
nsims = 10^5;
x = sample(f,nsims);
[ 2 、4 ]
sum((x.>2) & (x.<4))/nsims
## 0.14191