Normal dağılımdan örnek alın, ancak simülasyonlardan önce belirtilen aralığın dışında kalan tüm rastgele değerleri yok sayın.
Bu yöntem doğrudur, ancak @ Xi'an'ın cevabında belirtildiği gibi, aralığın küçük olduğu zaman (daha doğrusu, normal dağılım altında ölçüsü küçük olduğunda) uzun zaman alacaktır.
Diğer herhangi bir dağıtım olarak, ( ters dönüşüm örneklemesi olarak da adlandırılır) ters çevirme yöntemi kullanılabilir; burada , ilgili dağıtımın (kümülatif işlevi) ve . , bir miktar dağılım aralıkta kesilmesiyle elde edilen dağılım olduğunda , bu, ile örneğine eşdeğerdir. .F−1(U)FU∼Unif(0,1)FG(a,b)G−1(U)U∼Unif(G(a),G(b))
Ancak, bu zaten bir yorumda @ Xi'an tarafından belirtilmiştir, bazı durumlar için tersine çevirme yöntemi kuantil fonksiyonunun çok hassas bir değerlendirmesini gerektirir ve ayrıca hızlı bir hesaplanmasını gerektirdiğini de ekleyeceğim . Zaman bir normal dağılım, değerlendirilmesidir oldukça yavaştır ve bu değerleri için son derece hassas olmayan ve arasında "dizi" dış .G−1G−1GG−1abG
Önemli örneklemeyi kullanarak kesik bir dağılımı simüle edin
Bir olasılık önem örneklemesini kullanmaktır . Standart Gauss dağılımı örneğini düşünün . Önceki gösterimleri unutun, şimdi Cauchy dağılımı olsun. Yukarıda belirtilen iki gereksinim için yerine getirilmiştir : biri sadece ve . Bu nedenle, kesik Cauchy dağılımının ters çevirme yöntemi ile örneklenmesi kolaydır ve kesik normal dağılımın önemini örneklemek için enstrümantal değişkenin iyi bir seçimidir.N(0,1)GGG(q)=arctan(q)π+12G−1(q)=tan(π(q−12))
Biraz basitleştirmeden sonra ve almak ile :U∼Unif(G(a),G(b))G−1(U)tan(U′)U′∼Unif(arctan(a),arctan(b))
a <- 1
b <- 5
nsims <- 10^5
sims <- tan(runif(nsims, atan(a), atan(b)))
Şimdi , normalleştirilene kadar iki yoğunluğun oranı olarak tanımlanan her örneklenmiş değeri için ağırlık hesaplanmalıdır , bu nedenle
ancak kütük ağırlıklarını almak daha güvenli olabilir: φ ( x ) / g ( x ) a ( x ) = exp ( - x 2 / 2 ) ( 1 + x 2 ) ,xiϕ(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)
Ağırlıklı örnek , aralığın içine düşen her örneklenmiş değerin ağırlıklarını toplayarak, hedef dağılım altındaki her bir aralığın ölçümünü tahmin sağlar :[ u , v ](xi,w(xi))[u,v]
u <- 2; v<- 4
sum(w[sims>u & sims<v])
## [1] 0.1418
Bu, hedef kümülatif fonksiyonun bir tahminini sağlar. spatsat
Paketle hızlı bir şekilde alıp çizebiliriz :
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
Tabii ki, örnek kesinlikle hedef dağılımının bir örneği değil, enstrümantal Cauchy dağılımının bir örneğidir ve biri , örneğin çok uluslu örnekleme kullanılarak ağırlıklı yeniden örnekleme yaparak hedef dağılımın bir örneğini alır :(xi)
msample <- rmultinom(1, nsims, w)[,1]
resims <- rep(sims, times=msample)
hist(resims)
mean(resims>u & resims<v)
## [1] 0.1446
Başka bir yöntem: hızlı ters dönüşüm örneklemesi
Olver ve Townsend , geniş bir sürekli dağıtım sınıfı için bir örnekleme yöntemi geliştirdi. Bu uygulanan Matlab chebfun2 kütüphanede hem de Julia için ApproxFun kütüphanesine . Son zamanlarda bu kütüphaneyi keşfettim ve çok umut verici geliyor (sadece rastgele örnekleme için değil). Temel olarak bu tersine çevirme yöntemidir, ancak cdf ve ters cdf'nin güçlü yaklaşımlarını kullanır. Giriş, normalleştirmeye kadar hedef yoğunluk fonksiyonudur.
Örnek basitçe aşağıdaki kodla oluşturulur:
using ApproxFun
f = Fun(x -> exp(-x.^2./2), [1,5]);
nsims = 10^5;
x = sample(f,nsims);
Aşağıda kontrol edildiği gibi, önemli örneklemeyle daha önce elde edilene yakın bir aralığın tahmini bir ölçümünü verir :[2,4]
sum((x.>2) & (x.<4))/nsims
## 0.14191