যদি আমি আপনি সঠিকভাবে বুঝতে, আপনি নমুনা করতে চান সম্ভাব্যতা সঙ্গে MULTINOMIAL বন্টন থেকে মানগুলি যেমন যে , তবে আপনি বন্টন ছেঁটে ফেলা হতে চান তাই সবার জন্য ।এক্স1, … ,এক্সটp1,…,pk∑ixi=nai≤xi≤bixi
আমি তিনটি সমাধান দেখতে পাচ্ছি (না কেটে নেওয়া মামলার মতো মার্জিত নয়):
- প্রত্যাখ্যান গ্রহণ. কাটা না হওয়া বহু-জাতীয় থেকে নমুনা, যদি কাটা সীমানার সাথে মানানসই নমুনা গ্রহণ করুন, অন্যথায় প্রত্যাখ্যান করুন এবং প্রক্রিয়াটি পুনরাবৃত্তি করুন। এটি দ্রুত, তবে খুব অদক্ষ হতে পারে।
rtrmnomReject <- function(R, n, p, a, b) {
x <- t(rmultinom(R, n, p))
x[apply(a <= x & x <= b, 1, all) & rowSums(x) == n, ]
}
- সরাসরি অনুকরণ। ডেটা উত্পন্ন প্রক্রিয়া সদৃশ ফ্যাশনে নমুনা, যেমন একটি এলোমেলো কলস থেকে একক মার্বেলের নমুনা এবং আপনি মোট মার্বেল নমুনা না করা পর্যন্ত এই প্রক্রিয়াটি পুনরাবৃত্তি করুন , তবে আপনি প্রদত্ত থেকে মোট মার্বেলের মোট সংখ্যা স্থাপন করার পরে ( ইতিমধ্যে সমান ) এরপরে এ জাতীয় কলঙ্ক থেকে অঙ্কন বন্ধ করুন। আমি এটি নীচের স্ক্রিপ্টে প্রয়োগ করেছি।nxibi
# 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)
}
- মহানগর অ্যালগরিদম। শেষ অবধি, তৃতীয় এবং সর্বাধিক দক্ষ পদ্ধতিটি হ'ল মেট্রোপলিস অ্যালগরিদম ব্যবহার করা । অ্যালগরিদম প্রথম নমুনা আঁকার জন্য সরাসরি সিমুলেশন (তবে আলাদাভাবে আরম্ভ করা যেতে পারে) ব্যবহার করে সূচনা করা হয় । নিম্নলিখিত পদক্ষেপগুলিতে পুনরাবৃত্তভাবে: প্রস্তাবিত মান সম্ভাব্যতা সহ
হিসাবে গৃহীত হবে , অন্যথায় মান গ্রহণ করা হবে এটি স্থান, যেখানে। একটি প্রস্তাব আমি ফাংশন ব্যবহৃত যে লাগে মান এবং এলোমেলোভাবে 0 থেকে ফ্লিপ ক্ষেত্রে এবং অন্য বিভাগের প্যাচসমূহ এটা সংখ্যা।X1y=q(Xi−1)Xif(y)/f(Xi−1)Xi−1f(x)∝∏ipxii/xi!qXi−1
step
# 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)
}
অ্যালগরিদম শুরু হয় এবং তারপরে বিতরণের বিভিন্ন অঞ্চল ঘুরে বেড়ায়। পূর্ববর্তীগুলির তুলনায় এটি স্পষ্টতই দ্রুত, তবে আপনার মনে রাখতে হবে যে আপনি যদি এটি সংখ্যার ছোট ছোট মামলার নমুনা ব্যবহার করতে চান তবে আপনি একে অপরের নিকটে থাকা ড্রগুলি দিয়ে শেষ করতে পারেন। আরেকটি সমস্যা হ'ল আপনাকে আকার সম্পর্কে সিদ্ধান্ত নিতে হবে , যেমন অ্যালগোরিদমকে কত বড় লাফ দেওয়া উচিত - খুব ছোট ধীরে ধীরে ধীরে ধীরে চলতে পারে, খুব বড় পরিমাণে অনেকগুলি অবৈধ প্রস্তাবনা তৈরি এবং তা প্রত্যাখ্যান করতে পারে। আপনি নীচে এর ব্যবহারের উদাহরণ দেখতে পারেন। প্লটগুলিতে আপনি দেখতে পাবেন: প্রথম সারিতে প্রান্তিক ঘনত্ব, দ্বিতীয় সারিতে ট্র্যাসপ্লট এবং পরের জোড়গুলির জন্য পরবর্তী জাম্প প্রদর্শনকারী প্লটগুলি।X1step
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)
এই বিতরণ থেকে স্যাম্পলিংয়ের সমস্যাটি হ'ল সাধারণভাবে একটি খুব অদক্ষ্য নমুনা কৌশল বর্ণনা করে । কল্পনা করুন যে এবং , এবং এর এর কাছাকাছি, আপনি বিভিন্ন সম্ভাবনার সাথে বিভাগগুলিতে নমুনা করতে চান তবে একই রকম প্রত্যাশা করুন শেষে ফ্রিকোয়েন্সি। চূড়ান্ত ক্ষেত্রে, দ্বি- বিতরণ কল্পনা করুন যেখানে এবং ,p1≠⋯≠pka1=⋯=akb1=…bkaibip1≫p2a1≪a2b1≪b2, সেক্ষেত্রে আপনি খুব বিরল ঘটনা ঘটে যাওয়ার প্রত্যাশা করেছেন (এ জাতীয় বিতরণের বাস্তব জীবনের উদাহরণ এমন গবেষক হবে যিনি নমুনাটি পুনরায় পুনরুদ্ধার করেন যতক্ষণ না তিনি তার অনুমানের সাথে সামঞ্জস্যপূর্ণ নমুনা খুঁজে পান, তাই এটি এলোমেলো নমুনার চেয়ে প্রতারণার সাথে আরও কিছু করার আছে) ।
যদি আপনি যেখানে আপনি নমুনা Rukhin (2007, 2008) যেমন সংজ্ঞায়িত বন্টন অনেক কম সমস্যাযুক্ত নমুনা আনুপাতিকভাবে প্রতিটি বিভাগের ক্ষেত্রে, অর্থাত 'র।npipi
রুখিন, আ.লীগ (২০০ 2007) চিকিত্সা বরাদ্দের সমস্যাগুলিতে সাধারণ অর্ডার পরিসংখ্যান এবং জ্যামিতিক এলোমেলো ভেরিয়েবলের যোগফল। পরিসংখ্যান এবং সম্ভাবনার অক্ষর, 77 (12), 1312-1321।
রুখিন, আ.লীগ (২০০৮) ভারসাম্য বন্টন সমস্যার নিয়ম বন্ধ: সঠিক এবং অ্যাসিম্পটোটিক বিতরণ। সিকোয়েনাল বিশ্লেষণ, 27 (3), 277-292।