एक सामान्य वितरण से नमूना लेकिन सिमुलेशन से पहले निर्दिष्ट सीमा के बाहर गिरने वाले सभी यादृच्छिक मूल्यों को अनदेखा करें।
यह विधि सही है, लेकिन, जैसा कि उनके जवाब में @ शीआन ने उल्लेख किया है, यह एक लंबा समय लगेगा जब सीमा छोटी होती है (अधिक सटीक रूप से, जब इसका माप सामान्य वितरण के तहत छोटा होता है)।
एफ- 1( यू)एफयू~ Unif ( 0 , 1 )एफजी( ए , बी )जी- 1( यू)यू~ Unif ( जी ( एक ) , जी ( ख ) )
जी- 1जी- 1जीजी- 1एखजी
महत्व के नमूने का उपयोग करते हुए एक काटे गए वितरण का अनुकरण करें
एन( 0 , 1 )जीजीजी ( क्यू) = अर्कतन( क्यू)π+ 12जी- 1( क्यू) = तन( π( क्यू- 12) )। इसलिए, काटे गए काउची वितरण को उलटा विधि द्वारा नमूना करना आसान है और यह काटे गए सामान्य वितरण के महत्व के नमूने के लिए वाद्य चर का एक अच्छा विकल्प है।
थोड़ा सरलीकरण, नमूना लेने के बाद यू~ Unif ( जी ( एक ) , जी ( ख ) ) और ले रहा है जी- 1( यू) लेने के बराबर है तन( यू') साथ में यू'~ Unif ( arctan( ए ) , आर्कटिक( बी ) ):
a <- 1
b <- 5
nsims <- 10^5
sims <- tan(runif(nsims, atan(a), atan(b)))
अब प्रत्येक सैंपल वैल्यू के लिए वजन की गणना करनी होगी एक्समैं, अनुपात के रूप में परिभाषित किया गया है φ ( एक्स ) / छ( x ) सामान्यीकरण तक दो घनत्व हैं, इसलिए हम ले सकते हैं
w ( x ) = exp- ( एक्स2/ 2)(1+ x)2) ,
लेकिन यह लॉग-वेट लेने के लिए सुरक्षित हो सकता है:
log_w <- -sims^2/2 + log1p(sims^2)
w <- exp(log_w) # unnormalized weights
w <- w/sum(w)
भारित नमूना ( x)मैं, w ( x)मैं) ) हर अंतराल के माप का अनुमान लगाने की अनुमति देता है [ यू , वी ] अंतराल के अंदर गिरने वाले प्रत्येक सैंपल वैल्यू के भार को जोड़कर लक्ष्य वितरण के तहत:
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
एक और विधि: तेजी से उलटा नमूना बदलना
ऑलवर और टाउनसेंड ने निरंतर वितरण के व्यापक वर्ग के लिए एक नमूना विधि विकसित की। यह मैटलैब के लिए chebfun2 लाइब्रेरी के साथ-साथ जूलिया के लिए ApproxFun लाइब्रेरी में लागू किया गया है । मैंने हाल ही में इस पुस्तकालय की खोज की है और यह बहुत ही आशाजनक लगता है (न केवल यादृच्छिक नमूने के लिए)। मूल रूप से यह उलटा तरीका है लेकिन cdf और व्युत्क्रम cdf के शक्तिशाली सन्निकटन का उपयोग करना। इनपुट सामान्यीकरण तक लक्ष्य घनत्व फ़ंक्शन है।
नमूना केवल निम्नलिखित कोड द्वारा उत्पन्न होता है:
using ApproxFun
f = Fun(x -> exp(-x.^2./2), [1,5]);
nsims = 10^5;
x = sample(f,nsims);
जैसा कि नीचे की जाँच की गई है, यह अंतराल की अनुमानित माप देता है [ २ , ४ ] महत्व नमूना द्वारा पहले प्राप्त एक के करीब:
sum((x.>2) & (x.<4))/nsims
## 0.14191