ถ้าฉันเข้าใจคุณอย่างถูกต้องคุณต้องการตัวอย่างค่าจากการแจกแจงพหุนามด้วยความน่าจะเป็นเช่นนั้นแต่คุณต้องการให้การแจกแจงถูกตัดทอนสำหรับทุกx_ix1, … ,xkพี1, … ,พีkΣผมxผม= naผม≤xผม≤ขผมxผม
ฉันเห็นวิธีแก้ปัญหาสามข้อ (ไม่หรูหราเหมือนในกรณีที่ไม่ถูกตัดทอน):
- ยอมรับปฏิเสธ ตัวอย่างจาก Multinomial ที่ไม่ถูกตัดทอนยอมรับตัวอย่างถ้ามันเหมาะกับขอบเขตของการตัดมิฉะนั้นปฏิเสธและทำซ้ำกระบวนการ มันรวดเร็ว แต่อาจไม่มีประสิทธิภาพมาก
rtrmnomReject <- function(R, n, p, a, b) {
x <- t(rmultinom(R, n, p))
x[apply(a <= x & x <= b, 1, all) & rowSums(x) == n, ]
}
- การจำลองโดยตรง ตัวอย่างแฟชั่นที่มีลักษณะคล้ายกับกระบวนการสร้างข้อมูลคือตัวอย่างหินอ่อนเดี่ยวจากโกศแบบสุ่มและทำซ้ำกระบวนการนี้จนกว่าคุณจะสุ่มตัวอย่างหินอ่อนทั้งหมด แต่เมื่อคุณปรับใช้จำนวนหินอ่อนทั้งหมดจากโกศที่กำหนด (เท่ากับ ) จากนั้นหยุดการวาดจากโกศ ฉันใช้สิ่งนี้ในสคริปต์ด้านล่างnxผมขผม
# 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)
}
- อัลกอริทึมมหานคร สุดท้ายวิธีที่สามและมีประสิทธิภาพมากที่สุดที่จะใช้ขั้นตอนวิธีการกรุงเทพมหานคร อัลกอริทึมจะเริ่มต้นโดยใช้การจำลองโดยตรง ( แต่สามารถเริ่มต้นที่แตกต่างกัน) การวาดตัวอย่างแรกX_1ในขั้นตอนต่อไปซ้ำ: ค่าข้อเสนอ
ได้รับการยอมรับเป็นกับความน่ามิฉะนั้นค่าดำเนินการในการ มันคือที่ที่. ตามข้อเสนอฉันใช้ฟังก์ชันที่ใช้ค่าและสุ่มพลิกจาก 0 เป็นจำนวนเคสและย้ายไปยังหมวดหมู่อื่นX1Y= q(Xฉัน- 1)Xผมฉ( y) / f(Xฉัน- 1)Xฉัน- 1ฉ( x ) ∝Πผมพีxผมผม/xผม!QXฉัน- 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)
}
อัลกอริทึมเริ่มต้นที่จากนั้นจึงเดินไปตามภูมิภาคต่างๆของการแจกแจง เห็นได้ชัดว่าเร็วกว่าในกรณีก่อน ๆ แต่คุณต้องจำไว้ว่าถ้าคุณใช้มันเพื่อสุ่มตัวอย่างจำนวนคดีเล็ก ๆ น้อย ๆ คุณก็สามารถจบลงด้วยการจับที่อยู่ใกล้กัน ปัญหาอีกประการหนึ่งคือคุณต้องตัดสินใจเกี่ยวกับขนาดเช่นการกระโดดครั้งใหญ่ควรอัลกอริทึมอย่างไร - เล็กเกินไปอาจทำให้เคลื่อนที่ช้าลงใหญ่เกินไปอาจนำไปสู่การทำข้อเสนอที่ไม่ถูกต้องมากเกินไปและปฏิเสธพวกเขา คุณสามารถดูตัวอย่างการใช้งานด้านล่าง ในพล็อตที่คุณสามารถดู: ความหนาแน่นเล็กน้อยในแถวแรก traceplots ในแถวที่สองและพล็อตแสดงการกระโดดที่ตามมาสำหรับคู่ของตัวแปร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)
ปัญหาเกี่ยวกับการสุ่มตัวอย่างจากการกระจายนี้คือการอธิบายกลยุทธ์การสุ่มตัวอย่างที่ไม่มีประสิทธิภาพมากโดยทั่วไป ลองจินตนาการว่าและ ,และอยู่ใกล้กับของในกรณีเช่นนี้คุณต้องการตัวอย่างไปยังหมวดหมู่ที่มีความน่าจะเป็นต่างกัน ความถี่ในที่สุด ในกรณีที่รุนแรงให้จินตนาการการกระจายสองหมวดหมู่โดยที่และ ,พี1≠ ⋯ ≠พีka1= ⋯ =akข1= ...ขkaผมขผมพี1»พี2a1«a2ข1«ข2ในกรณีเช่นนี้คุณคาดว่าจะมีเหตุการณ์ที่เกิดขึ้นได้ยากน้อยมาก (ตัวอย่างในชีวิตจริงของการแจกแจงดังกล่าวจะเป็นนักวิจัยที่สุ่มตัวอย่างซ้ำ ๆ จนกระทั่งเขาพบตัวอย่างที่สอดคล้องกับสมมติฐานของเขาดังนั้นมันจึงเป็นการโกงมากกว่าการสุ่มแบบสุ่ม) .
การกระจายมากน้อยที่มีปัญหาถ้าคุณกำหนดเป็น Rukhin (2007, 2008) ที่คุณลิ้มลองกรณีในแต่ละหมวดหมู่คือตัวอย่างตามสัดส่วน 'snพีผมพีผม
Rukhin, AL (2007) สถิติการสั่งซื้อปกติและผลรวมของตัวแปรสุ่มเรขาคณิตในปัญหาการจัดสรรการรักษา สถิติและตัวอักษรน่าจะเป็น 77 (12), 1312-1321
Rukhin, AL (2008) การหยุดกฎในปัญหาการจัดสรรแบบสมดุล: การกระจายที่แน่นอนและแบบ Asymptotic การวิเคราะห์ตามลำดับ, 27 (3), 277-292