ดังที่เฮนรี่กล่าวไว้คุณกำลังสมมติว่าการแจกแจงแบบปกติและมันก็โอเคอย่างสมบูรณ์ถ้าข้อมูลของคุณตามการแจกแจงแบบปกติ แต่จะไม่ถูกต้องถ้าคุณไม่สามารถรับการแจกแจงแบบปกติได้ ด้านล่างนี้ฉันอธิบายวิธีการสองวิธีที่แตกต่างกันซึ่งคุณสามารถใช้สำหรับการแจกแจงที่ไม่รู้จักซึ่งได้รับเพียงดาต้าพอยน์x
และการประมาณความหนาแน่นที่มาพร้อมpx
กัน
สิ่งแรกที่ต้องพิจารณาคือสิ่งที่คุณต้องการสรุปโดยใช้ช่วงเวลาของคุณ ตัวอย่างเช่นคุณอาจสนใจช่วงเวลาที่ได้รับจากการใช้ quantiles แต่คุณอาจสนใจในขอบเขตความหนาแน่นสูงสุด (ดูที่นี่หรือที่นี่ ) ของการกระจายของคุณ ในขณะที่สิ่งนี้ไม่ควรสร้างความแตกต่างอย่างมาก (ถ้ามี) ในกรณีง่าย ๆ เช่นการกระจายแบบสมมาตรและแบบ unimodal สิ่งนี้จะสร้างความแตกต่างสำหรับการแจกแจงแบบ "ซับซ้อน" มากขึ้น โดยทั่วไปควิกไทล์จะให้ช่วงเวลาที่คุณมีความน่าจะเป็นมวลที่กระจัดกระจายอยู่ตรงกลาง (กลางของการกระจายของคุณ) ในขณะที่ภูมิภาคที่มีความหนาแน่นสูงสุดคือพื้นที่รอบโหมด100α%ของการกระจาย สิ่งนี้จะมีความชัดเจนมากขึ้นถ้าคุณเปรียบเทียบทั้งสองแปลงในภาพด้านล่าง - ควอไทล์ "ตัด" การกระจายตัวในแนวตั้งในขณะที่ภูมิภาคที่มีความหนาแน่นสูงสุด "ตัด" แนวนอน
สิ่งต่อไปที่ต้องพิจารณาคือวิธีจัดการกับความจริงที่ว่าคุณมีข้อมูลที่ไม่สมบูรณ์เกี่ยวกับการกระจาย (สมมติว่าเรากำลังพูดถึงการกระจายอย่างต่อเนื่องคุณมีเพียงจุดจำนวนมากแทนที่จะเป็นฟังก์ชัน) สิ่งที่คุณสามารถทำได้คือใช้ค่า "ตามที่เป็น" หรือใช้การแก้ไขหรือการปรับให้เรียบเพื่อรับค่า "อยู่ระหว่าง"
วิธีการหนึ่งที่จะใช้การแก้ไขเชิงเส้น (ดู?approxfun
ใน R) หรือบางสิ่งบางอย่างราบรื่นมากขึ้นเช่นเส้นโค้ง (ดู?splinefun
ใน R) หากคุณเลือกวิธีดังกล่าวคุณต้องจำไว้ว่าอัลกอริธึมการแก้ไขไม่มีความรู้เกี่ยวกับข้อมูลของโดเมนและสามารถส่งคืนผลลัพธ์ที่ไม่ถูกต้องเช่นค่าต่ำกว่าศูนย์เป็นต้น
# grid of points
xx <- seq(min(x), max(x), by = 0.001)
# interpolate function from the sample
fx <- splinefun(x, px) # interpolating function
pxx <- pmax(0, fx(xx)) # normalize so prob >0
วิธีที่สองที่คุณสามารถพิจารณาได้คือใช้การกระจายความหนาแน่นของเคอร์เนล / ผสมเพื่อประมาณการกระจายของคุณโดยใช้ข้อมูลที่คุณมี ส่วนที่ยุ่งยากในที่นี้คือการตัดสินใจเกี่ยวกับแบนด์วิดธ์ที่เหมาะสม
# density of kernel density/mixture distribution
dmix <- function(x, m, s, w) {
k <- length(m)
rowSums(vapply(1:k, function(j) w[j]*dnorm(x, m[j], s[j]), numeric(length(x))))
}
# approximate function using kernel density/mixture distribution
pxx <- dmix(xx, x, rep(0.4, length.out = length(x)), px) # bandwidth 0.4 chosen arbitrary
ถัดไปคุณจะพบช่วงเวลาที่น่าสนใจ คุณสามารถดำเนินการต่อตัวเลขหรือโดยการจำลอง
1a) การสุ่มตัวอย่างเพื่อให้ได้ช่วงเวลาที่เป็นควอไทล์
# sample from the "empirical" distribution
samp <- sample(xx, 1e5, replace = TRUE, prob = pxx)
# or sample from kernel density
idx <- sample.int(length(x), 1e5, replace = TRUE, prob = px)
samp <- rnorm(1e5, x[idx], 0.4) # this is arbitrary sd
# and take sample quantiles
quantile(samp, c(0.05, 0.975))
1b) การสุ่มตัวอย่างเพื่อให้ได้พื้นที่ที่มีความหนาแน่นสูงสุด
samp <- sample(pxx, 1e5, replace = TRUE, prob = pxx) # sample probabilities
crit <- quantile(samp, 0.05) # boundary for the lower 5% of probability mass
# values from the 95% highest density region
xx[pxx >= crit]
2a) ค้นหาควอนไทล์เป็นตัวเลข
cpxx <- cumsum(pxx) / sum(pxx)
xx[which(cpxx >= 0.025)[1]] # lower boundary
xx[which(cpxx >= 0.975)[1]-1] # upper boundary
2b) ค้นหาพื้นที่ที่มีความหนาแน่นสูงสุดเป็นตัวเลข
const <- sum(pxx)
spxx <- sort(pxx, decreasing = TRUE) / const
crit <- spxx[which(cumsum(spxx) >= 0.95)[1]] * const
อย่างที่คุณเห็นในแปลงด้านล่างในกรณีที่ระบบ unimodal การกระจายสมมาตรทั้งสองวิธีจะส่งกลับช่วงเวลาเดียวกัน
แน่นอนคุณยังสามารถลองหาช่วงรอบบางค่ากลางดังกล่าวว่าและใช้บางชนิดของการเพิ่มประสิทธิภาพเพื่อหาสิ่งที่เหมาะสม , แต่ทั้งสองวิธีที่อธิบายไว้ข้างต้นดูเหมือนจะใช้กันอย่างแพร่หลายมากกว่าและใช้งานง่ายกว่า100α%Pr(X∈μ±ζ)≥αζ