एक अंतराल के भीतर एक वितरण के बाद यादृच्छिक संख्या उत्पन्न करें


17

मुझे अंतराल भीतर सामान्य वितरण के बाद यादृच्छिक संख्या उत्पन्न करने की आवश्यकता है । (मैं आर। में काम कर रहा हूं)(a,b)

मुझे पता है कि फ़ंक्शन rnorm(n,mean,sd)सामान्य वितरण के बाद यादृच्छिक संख्या उत्पन्न करेगा, लेकिन उसके भीतर अंतराल की सीमा कैसे निर्धारित करें? क्या उसके लिए कोई विशेष आर फ़ंक्शन उपलब्ध हैं?


तुम ऐसा क्यों करना चाहते हो? यदि यह बाध्य है तो यह वास्तव में सामान्य नहीं हो सकता। आप क्या हासिल करने का प्रयास कर रहे हैं?
गंग -

x <- rnorm(n, mean, sd); x <- x[x > lower.limit & x < upper.limit]
ह्यूग

3
@ हेग महान है ... जब तक आप परवाह नहीं करते कि आपको कितने यादृच्छिक मूल्य मिलते हैं।
Glen_b -Reinstate मोनिका

जवाबों:


31

ऐसा लगता है कि आप एक काटे गए वितरण से अनुकरण करना चाहते हैं , और आपके विशिष्ट उदाहरण में, एक काट दिया गया सामान्य

ऐसा करने के लिए कई तरीके हैं, कुछ सरल, कुछ अपेक्षाकृत कुशल।

मैं आपके सामान्य उदाहरण पर कुछ दृष्टिकोण बताऊंगा।

  1. यहाँ एक समय में एक उत्पन्न करने के लिए एक बहुत ही सरल विधि है (किसी प्रकार के छद्म में):

    repeat उत्पन्नxi एन (मतलब, एसडी) सेuntil कमxi ऊपरी

    यहाँ छवि विवरण दर्ज करें

    यदि अधिकांश वितरण सीमा के भीतर है, तो यह बहुत ही उचित है, लेकिन यह काफी धीमा हो सकता है यदि आप हमेशा सीमा के बाहर उत्पन्न करते हैं।

    आर में, आप सीमा के भीतर क्षेत्र की गणना करके एक-पर-एक लूप से बच सकते हैं और पर्याप्त मान उत्पन्न कर सकते हैं कि आप लगभग निश्चित हो सकते हैं कि सीमा के बाहर के मूल्यों को फेंकने के बाद भी आपके पास उतने ही मूल्य थे जितने की जरूरत थी।

  2. आप अंतराल पर कुछ उपयुक्त प्रमुख कार्य के साथ स्वीकार-अस्वीकार का उपयोग कर सकते हैं (कुछ मामलों में वर्दी पर्याप्त अच्छी होगी)। यदि सीमाएँ sd के सापेक्ष यथोचित संकीर्ण थीं, लेकिन आप पूंछ में बहुत दूर नहीं थे, तो एक समान बड़ाकरण सामान्य के साथ ठीक काम करेगा, उदाहरण के लिए।

    यहाँ छवि विवरण दर्ज करें

  3. आप एक यथोचित कुशल CDF और उलटा CDF (जैसे है, तो pnormऔर qnormआर में सामान्य वितरण के लिए) आप उलटा-CDF विधि का अनुकरण खंड के पहले पैराग्राफ में वर्णित का उपयोग कर सकते छोटा कर दिया सामान्य पर विकिपीडिया पृष्ठ । [प्रभाव में यह एक काट-छाँट वाली वर्दी लेने के लिए समान है (आवश्यक मात्राओं में काट दिया गया है, जो वास्तव में बिल्कुल भी अस्वीकार करने की आवश्यकता नहीं है, क्योंकि यह सिर्फ एक और वर्दी है) और उस पर उलटा सामान्य सीएफडी लागू करें। ध्यान दें कि यदि आप पूंछ में दूर हैं तो यह विफल हो सकता है]

    यहाँ छवि विवरण दर्ज करें

  4. अन्य दृष्टिकोण हैं; समान विकिपीडिया पृष्ठ में ज़िगगुरैट विधि का पालन करने का उल्लेख है , जो विभिन्न प्रकार के वितरणों के लिए काम करना चाहिए।

एक ही विकिपीडिया लिंक छोटा कर दिया normals पैदा करने के लिए कार्यों के साथ दो विशिष्ट पैकेज (क्रैन पर दोनों) का उल्लेख है:

MSMआर में पैकेज एक समारोह है rtnormकि गणना एक छोटा कर दिया सामान्य से ड्रॉ। truncnormआर में पैकेज भी एक सामान्य कार्यों छोटा कर दिया से आकर्षित करने के लिए है।


इधर-उधर देखते हुए, इसमें से बहुत से अन्य सवालों के जवाब में कवर किया गया है (लेकिन बिल्कुल डुप्लिकेट नहीं है क्योंकि यह प्रश्न केवल छंटनी की तुलना में सामान्य है) ... अतिरिक्त चर्चा देखें

ए। यह उत्तर

ख। यहां शीआन का जवाब है , जो उसके अर्क्सिव पेपर (कुछ अन्य सार्थक प्रतिक्रियाओं के साथ) का लिंक है।


2

त्वरित और गंदा दृष्टिकोण 68-95-99.7 नियम का उपयोग करना है ।

एक सामान्य वितरण में, 99.7% मूल्य मीन के 3 मानक विचलन के भीतर आते हैं। इसलिए, यदि आप अपने मतलब को अपने वांछित न्यूनतम मूल्य और अधिकतम मूल्य के मध्य में सेट करते हैं, और अपने मानक विचलन को अपने मतलब के 1/3 पर सेट करते हैं, तो आपको (अधिकतर) मान प्राप्त होते हैं जो वांछित अंतराल के भीतर आते हैं। फिर आप बस बाकी को साफ कर सकते हैं।

minVal <- 0
maxVal <- 100
mn <- (maxVal - minVal)/2
# Generate numbers (mostly) from min to max
x <- rnorm(count, mean = mn, sd = mn/3)
# Do something about the out-of-bounds generated values
x <- pmax(minVal, x)
x <- pmin(maxVal, x)

मैंने हाल ही में इस समस्या का सामना किया, परीक्षण डेटा के लिए यादृच्छिक छात्र ग्रेड उत्पन्न करने की कोशिश कर रहा है । ऊपर दिए गए कोड में, मैंने उपयोग किया है pmaxऔर pminमिनट या अधिकतम सीमा सीमा मूल्य के साथ आउट-ऑफ-बाउंड मानों को बदलने के लिए। यह मेरे उद्देश्य के लिए काम करता है, क्योंकि मैं काफी कम मात्रा में डेटा पैदा कर रहा हूं, लेकिन बड़ी मात्रा में यह आपको न्यूनतम और अधिकतम मूल्यों पर ध्यान देने योग्य धक्कों देगा। इसलिए आपके उद्देश्यों के आधार पर उन मूल्यों को त्यागना बेहतर हो सकता है, उन्हें NAs के साथ बदलें , या जब तक वे सीमा में न हों, तब तक उन्हें "पुनः रोल" करें।


ऐसा करने से परेशान क्यों? यह सामान्य यादृच्छिक संख्याओं को उत्पन्न करने और ट्रंकेशन की आवश्यकता वाले लोगों को छोड़ने के लिए इतना सरल है कि इसके बारे में जटिल होना आवश्यक नहीं है जब तक कि ट्रंकेशन वांछित घनत्व के क्षेत्र के करीब 100% नहीं है।
कार्ल

2
शायद मैं मूल प्रश्न की गलत व्याख्या कर रहा हूं। आर-में एक सीधे-सीधे-आँकड़े-संबंधित प्रोग्रामिंग कार्य को कैसे प्राप्त किया जाए, यह जानने की कोशिश करते हुए मुझे यह सवाल आया और मैंने अब केवल इस पृष्ठ पर ध्यान दिया है कि यह एक स्टैकएक्सचेंज है, न कि प्रोग्रामिंग स्टैटेक्सचेंज। :) मेरे मामले में, मैं 0 से 100 तक के मानों के साथ एक विशिष्ट मात्रा में यादृच्छिक पूर्णांक उत्पन्न करना चाहता था, और मैं चाहता था कि उत्पन्न मान उस सीमा पर एक अच्छी घंटी वक्र पर गिरें। यह लिखने के बाद से मैंने महसूस किया है कि sample(x=min:max, prob=dnorm(...))शायद ऐसा करने का एक आसान तरीका है।
एरोन वेल्स

@Glen_b हारून वेल्स का उल्लेख है sample(x=min:max, prob=dnorm(...))जो आपके उत्तर से थोड़ा छोटा लगता है।
कार्ल

लेकिन ध्यान दें कि sample()यदि आप यादृच्छिक पूर्णांक, या असतत, पूर्वनिर्धारित मानों के कुछ अन्य सेट को लेने का प्रयास कर रहे हैं तो यह ट्रिक केवल उपयोगी है।
एरोन वेल्स

1

a<b

ΦX1,...,XNμσ2a<b

Xi=μ+σΦ1(Ui)U1,...,UNIID U[Φ(aμσ),Φ(bμσ)].

काटे गए वितरण से उत्पन्न मूल्यों के लिए कोई इनबिल्ट फ़ंक्शन नहीं है, लेकिन यादृच्छिक चर उत्पन्न करने के लिए सामान्य कार्यों का उपयोग करके इस पद्धति को प्रोग्राम करना तुच्छ है। यहां एक सरल Rफ़ंक्शन है rtruncnormजो कोड की कुछ पंक्तियों में इस पद्धति को लागू करता है।

rtruncnorm <- function(N, mean = 0, sd = 1, a = -Inf, b = Inf) {
  if (a > b) stop('Error: Truncation range is empty');
  U <- runif(N, pnorm(a, mean, sd), pnorm(b, mean, sd));
  qnorm(U, mean, sd); }

यह एक वेक्टराइज़्ड फंक्शन है जो Nआईआईडी रैंडम वैरिएबल्स को अलग-थलग सामान्य वितरण से उत्पन्न करेगा । एक ही विधि के माध्यम से अन्य छंटनी किए गए वितरणों के लिए कार्य करना आसान होगा। काटे गए वितरण के लिए संबद्ध घनत्व और मात्रात्मक कार्यों को प्रोग्राम करना भी मुश्किल नहीं होगा।


μσ2

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.