अगर मैं आपको सही तरीके से समझूं, तो आप नमूना लेना चाहते हैं एक्स1, … ,एक्सक संभावनाओं के साथ बहुराष्ट्रीय वितरण से मूल्य पी1, … ,पीक ऐसा है कि Σमैंएक्समैं= एन, हालांकि आप चाहते हैं कि वितरण कम हो एमैं≤एक्समैं≤खमैं सबके लिए एक्समैं।
मैं तीन समाधान देखता हूं (न ही गैर-काटे गए मामले में उतना ही सुंदर):
- स्वीकार अस्वीकार। गैर-छंटनी वाली बहुराष्ट्रीय से नमूना, नमूना को स्वीकार करें यदि यह छंटनी सीमाओं को फिट बैठता है, अन्यथा प्रक्रिया को अस्वीकार और दोहराएं। यह तेज़ है, लेकिन बहुत अक्षम हो सकता है।
rtrmnomReject <- function(R, n, p, a, b) {
x <- t(rmultinom(R, n, p))
x[apply(a <= x & x <= b, 1, all) & rowSums(x) == n, ]
}
- प्रत्यक्ष अनुकरण। फैशन में नमूना जो डेटा-जनरेट करने की प्रक्रिया से मिलता-जुलता है, यानी एक यादृच्छिक कलश से एकल संगमरमर का नमूना और इस प्रक्रिया को तब तक दोहराएं जब तक आप नमूना न लेंn कुल में पत्थर, लेकिन जब आप दिए गए कलश से कुल संख्या को तैनात करते हैं (एक्समैं पहले से ही के बराबर है खमैं) तो ऐसे कलश से ड्राइंग बंद करो। मैंने इसे एक स्क्रिप्ट में नीचे लागू किया है।
# single draw from truncated multinomial with a,b truncation points
rtrmnomDirect <- function(n, p, a, b) {
k <- length(p)
repeat {
pp <- p # reset pp
x <- numeric(k) # reset x
repeat {
if (sum(x<b) == 1) { # if only a single category is left
x[x<b] <- x[x<b] + n-sum(x) # fill this category with reminder
break
}
i <- sample.int(k, 1, prob = pp) # sample x[i]
x[i] <- x[i] + 1
if (x[i] == b[i]) pp[i] <- 0 # if x[i] is filled do
# not sample from it
if (sum(x) == n) break # if we picked n, stop
}
if (all(x >= a)) break # if all x>=a sample is valid
# otherwise reject
}
return(x)
}
- महानगर एल्गोरिथ्म। अंत में, तीसरा और सबसे कुशल दृष्टिकोण मेट्रोपोलिस एल्गोरिथ्म का उपयोग करना होगा । पहले नमूने को आकर्षित करने के लिए प्रत्यक्ष सिमुलेशन (लेकिन अलग-अलग तरह से आरंभीकृत किया जा सकता है) का उपयोग करके एल्गोरिथ्म को आरंभ किया जाता हैएक्स1। निम्नलिखित चरणों में पुनरावृत्ति: प्रस्ताव मूल्यy= क्यू(एक्समैं - १)
के रूप में स्वीकार किया जाता है एक्समैं संभावना के साथ च( y) / च(एक्समैं - १), अन्यथा एक्समैं - १ मान उस स्थान पर लिया जाता है, जहां च( x ) ∝Πमैंपीएक्समैंमैं/एक्समैं!। एक प्रस्ताव के रूप में मैंने फ़ंक्शन का उपयोग कियाक्ष वह प्राप्त करता है एक्समैं - १मान और बेतरतीब ढंग से
step
मामलों की संख्या से 0 से फ़्लिप करता है और इसे दूसरी श्रेणी में ले जाता है।
# draw R values
# 'step' parameter defines magnitude of jumps
# for Meteropolis algorithm
# 'init' is a vector of values to start with
rtrmnomMetrop <- function(R, n, p, a, b,
step = 1,
init = rtrmnomDirect(n, p, a, b)) {
k <- length(p)
if (length(a)==1) a <- rep(a, k)
if (length(b)==1) b <- rep(b, k)
# approximate target log-density
lp <- log(p)
lf <- function(x) {
if(any(x < a) || any(x > b) || sum(x) != n)
return(-Inf)
sum(lp*x - lfactorial(x))
}
step <- max(2, step+1)
# proposal function
q <- function(x) {
idx <- sample.int(k, 2)
u <- sample.int(step, 1)-1
x[idx] <- x[idx] + c(-u, u)
x
}
tmp <- init
x <- matrix(nrow = R, ncol = k)
ar <- 0
for (i in 1:R) {
proposal <- q(tmp)
prob <- exp(lf(proposal) - lf(tmp))
if (runif(1) < prob) {
tmp <- proposal
ar <- ar + 1
}
x[i,] <- tmp
}
structure(x, acceptance.rate = ar/R, step = step-1)
}
एल्गोरिथ्म शुरू होता है एक्स1और फिर वितरण के विभिन्न क्षेत्रों में घूमते हैं। यह स्पष्ट रूप से तेज है, फिर पिछले वाले, लेकिन आपको यह याद रखने की आवश्यकता है कि यदि आप इसका उपयोग छोटी संख्या के मामलों का नमूना करने के लिए करते हैं, तो आप ड्रॉ के साथ समाप्त हो सकते हैं जो एक दूसरे के करीब हैं। एक और समस्या यह है कि आपको step
आकार के बारे में निर्णय लेने की आवश्यकता है , अर्थात एल्गोरिथ्म को कितना बड़ा करना चाहिए - बहुत छोटा धीरे-धीरे आगे बढ़ सकता है, बहुत बड़ा हो सकता है बहुत सारे अमान्य प्रस्ताव बनाने और उन्हें अस्वीकार करने के लिए। आप इसका उपयोग नीचे देख सकते हैं। भूखंडों पर आप देख सकते हैं: पहली पंक्ति में सीमांत घनत्व, दूसरी पंक्ति में ट्रेसप्लाट और चर के जोड़े के लिए बाद में कूदता हुआ प्लॉट दिखाते हैं।
n <- 500
a <- 50
b <- 125
p <- c(1,5,2,4,3)/15
k <- length(p)
x <- rtrmnomMetrop(1e4, n, p, a, b, step = 15)
cmb <- combn(1:k, 2)
par.def <- par(mfrow=c(4,5), mar = c(2,2,2,2))
for (i in 1:k)
hist(x[,i], main = paste0("X",i))
for (i in 1:k)
plot(x[,i], main = paste0("X",i), type = "l", col = "lightblue")
for (i in 1:ncol(cmb))
plot(jitter(x[,cmb[1,i]]), jitter(x[,cmb[2,i]]),
type = "l", main = paste(paste0("X", cmb[,i]), collapse = ":"),
col = "gray")
par(par.def)
इस वितरण से नमूने के साथ समस्या यह है कि सामान्य रूप से एक बहुत ही अक्षम नमूनाकरण रणनीति का वर्णन है । कल्पना करो किपी1≠ ⋯ ≠पीक तथा ए1= ⋯ =एक, ख1= …खक तथा एमैंके करीब हैं खमैंऐसे मामले में, आप अलग-अलग संभावनाओं वाली श्रेणियों के लिए नमूना बनाना चाहते हैं, लेकिन अंत में समान आवृत्तियों की अपेक्षा करते हैं। चरम मामले में, दो-श्रेणीगत वितरण की कल्पना करें जहांपी1»पी2, तथा ए1«ए2, ख1«ख2इस तरह के मामले में आप कुछ बहुत ही दुर्लभ घटना होने की उम्मीद करते हैं (इस तरह के वितरण का वास्तविक जीवन उदाहरण शोधकर्ता होगा जो नमूना को दोहराता है जब तक कि वह उस नमूने को नहीं पाता है जो उसकी परिकल्पना के अनुरूप है, इसलिए इसका यादृच्छिक नमूने की तुलना में धोखा देने से अधिक है) ।
वितरण बहुत कम समस्याग्रस्त है यदि आप इसे रुखिन (2007, 2008) के रूप में परिभाषित करते हैं जहां आप नमूना लेते हैं nपीमैं प्रत्येक श्रेणी के लिए मामले, यानी आनुपातिक रूप से नमूना पीमैं'है।
रुखिन, एएल (2007)। उपचार के आवंटन की समस्याओं में सामान्य क्रम के आँकड़े और ज्यामितीय यादृच्छिक चर की रकम। सांख्यिकी और संभावना पत्र, 77 (12), 1312-1321।
रुखिन, एएल (2008)। संतुलित आवंटन समस्याओं में नियम रोकना: सटीक और विषम वितरण। अनुक्रमिक विश्लेषण, 27 (3), 277-292।