Seni doğru anlarsam, örneklemek istersin x1, … ,xk olasılıklı çok terimli dağılım değerleri p1, … ,pk öyle ki Σbenxben= n, ancak dağıtımın kesilmesini istersiniz birben≤xben≤bben hepsi için xben.
Üç çözüm görüyorum (kesilmemiş durumda olduğu kadar zarif değil):
- Accept-reddeder. Kesilmemiş multinomial numunesi, kesilme sınırlarına uyuyorsa numuneyi kabul edin, aksi takdirde işlemi reddedin ve tekrarlayın. Hızlıdır, ancak çok verimsiz olabilir.
rtrmnomReject <- function(R, n, p, a, b) {
x <- t(rmultinom(R, n, p))
x[apply(a <= x & x <= b, 1, all) & rowSums(x) == n, ]
}
- Doğrudan simülasyon. Veri oluşturma sürecine benzeyen bir şekilde örnek verin, örneğin tek bir mermeri rastgele bir urndan örnekleyin ve siz örnekleyene kadar bu işlemi tekrarlayın.n Toplamda mermerler, ancak belirli bir urndan toplam mermeri yerleştirdiğinizde (xben zaten eşit bben) daha sonra böyle bir urndan çizmeyi bırakın. Bunu aşağıdaki komut dosyasında uyguladım.
# 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)
}
- Metropolis algoritması. Son olarak, üçüncü ve en etkili yaklaşım Metropolis algoritmasını kullanmak olacaktır . Algoritma, ilk örneği çizmek için doğrudan simülasyon kullanılarak başlatılır (ancak farklı şekilde başlatılabilir)X1. Aşağıdaki adımları yinelemeli olarak: teklif değeriy= q(Xi - 1)
olarak kabul edildi Xben olasılıkla f( y) / f(Xi - 1), aksi takdirde Xi - 1 değer olduğu yerde alınır, burada f( x ) ∝Πbenpxbenben/xben!. Bir teklif olarak işlevi kullandımq bu alır Xi - 1değerini alır ve rasgele olarak 0'dan
step
vaka sayısına döner ve başka bir kategoriye taşır.
# 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)
}
Algoritma başlar X1ve daha sonra farklı dağıtım bölgelerinde dolaşır. Açıkçası öncekilerden daha hızlıdır, ancak az sayıda vakayı örneklemek için kullanırsanız, birbirine yakın çekilişlerle sonuçlanabileceğinizi hatırlamanız gerekir. Başka bir sorun, step
boyut hakkında karar vermeniz gerektiğidir , yani algoritmanın ne kadar büyük sıçramalar yapması gerektiği - çok küçük, yavaş hareket etmeye neden olabilir, çok büyük, çok fazla geçersiz teklif yapmaya ve reddetmeye neden olabilir. Kullanım örneği aşağıdadır. Grafiklerde şunları görebilirsiniz: ilk sıradaki marjinal yoğunluklar, ikinci sıradaki traceplots ve değişken çiftleri için sonraki sıçramaları gösteren grafikler.
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)
Bu dağılımdan örneklemeyle ilgili problem , genel olarak çok verimsiz bir örnekleme stratejisinin tanımlanmasıdır . Hayal etp1≠ ⋯ ≠pk ve bir1= ⋯ =birk, b1= …bk ve birbenyakın bbenBu durumda, farklı olasılıklara sahip kategorilere örnekleme yapmak istiyorsunuz, ancak sonunda benzer frekanslar bekliyoruz. Aşırı durumlarda, iki kategorik dağılımınp1»p2, ve bir1«bir2, b1«b2, bu durumda çok nadir bir olay olmasını beklersiniz (böyle bir dağıtımın gerçek hayat örneği, hipoteziyle tutarlı olan örneği bulana kadar örneklemeyi tekrarlayan araştırmacı olacaktır, bu yüzden rastgele örneklemeden daha fazla hile ile ilgilidir) .
Örnekleme yaptığınız yerde Rukhin (2007, 2008) olarak tanımlarsanız dağıtım çok daha az problemlidir. npben her kategorideki durumlar, yani pben'S.
Rukhin, AL (2007). Tedavi sıralaması problemlerinde normal sıra istatistikleri ve geometrik rastgele değişkenlerin toplamları. İstatistik ve olasılık mektupları, 77 (12), 1312-1321.
Rukhin, AL (2008). Dengeli Tahsis Problemlerinde Durdurma Kuralları: Kesin ve Asimptotik Dağılımlar. Sıralı Analiz, 27 (3), 277-292.