จะหาช่วงเวลาที่น่าเชื่อถือ 95% ได้อย่างไร


14

ฉันพยายามคำนวณช่วงเวลาที่น่าเชื่อถือ 95% ของการแจกแจงหลัง ฉันไม่พบฟังก์ชันใน R สำหรับมัน แต่วิธีการด้านล่างถูกต้องหรือไม่

x <- seq(0.4,12,0.4)
px <-  c(0,0, 0, 0, 0, 0, 0.0002, 0.0037, 0.018, 0.06, 0.22 ,0.43, 0.64,0.7579, 0.7870, 0.72, 0.555, 0.37, 0.24, 0.11, 0.07, 0.02, 0.009, 0.005, 0.0001, 0,0.0002, 0, 0, 0)
plot(x,px, type="l")
mm <- sum(x*px)/sum(px)
var <- (sum((x)^2*px)/sum(px)) - (mm^2)
cat("95% credible interval: ", round(mm -1.96*sqrt(var),3), "-", round(mm + 1.96*sqrt(var),3),"\n")

1
ไม่ใช่จริง ๆ - คุณถือว่าการกระจายตัวแบบปกติและมีช่วงเวลาที่เท่ากันเกี่ยวกับค่าเฉลี่ยและไม่มีความสมเหตุสมผลในบริบทนี้ ในความเป็นจริงคุณมีบันทึกเกี่ยวกับของความน่าจะสมมติว่านี้คือการกระจายไม่ต่อเนื่องและความจำเป็นที่จะขยายออกไปเล็กน้อยช่วงเวลาของคุณจะได้รับ\% ดีกว่าอาจใช้พื้นที่ความหนาแน่นสูงสุดซึ่งก็คือหากนี่เป็นการกระจายแบบไม่ต่อเนื่อง หรือใช้ช่วงเวลาหนึ่งเพื่อให้ความน่าจะเป็นที่ต่ำกว่านั้นคือหรือน้อยกว่าและความน่าจะเป็นที่จะอยู่เหนือนั้นคือหรือน้อยกว่าเช่นกัน ที่นี่ 94%95%[4.4,8.0]2.5%2.5%[4.4,8.0]
เฮนรี่

คำตอบ:


26

ดังที่เฮนรี่กล่าวไว้คุณกำลังสมมติว่าการแจกแจงแบบปกติและมันก็โอเคอย่างสมบูรณ์ถ้าข้อมูลของคุณตามการแจกแจงแบบปกติ แต่จะไม่ถูกต้องถ้าคุณไม่สามารถรับการแจกแจงแบบปกติได้ ด้านล่างนี้ฉันอธิบายวิธีการสองวิธีที่แตกต่างกันซึ่งคุณสามารถใช้สำหรับการแจกแจงที่ไม่รู้จักซึ่งได้รับเพียงดาต้าพอยน์xและการประมาณความหนาแน่นที่มาพร้อมpxกัน

สิ่งแรกที่ต้องพิจารณาคือสิ่งที่คุณต้องการสรุปโดยใช้ช่วงเวลาของคุณ ตัวอย่างเช่นคุณอาจสนใจช่วงเวลาที่ได้รับจากการใช้ quantiles แต่คุณอาจสนใจในขอบเขตความหนาแน่นสูงสุด (ดูที่นี่หรือที่นี่ ) ของการกระจายของคุณ ในขณะที่สิ่งนี้ไม่ควรสร้างความแตกต่างอย่างมาก (ถ้ามี) ในกรณีง่าย ๆ เช่นการกระจายแบบสมมาตรและแบบ unimodal สิ่งนี้จะสร้างความแตกต่างสำหรับการแจกแจงแบบ "ซับซ้อน" มากขึ้น โดยทั่วไปควิกไทล์จะให้ช่วงเวลาที่คุณมีความน่าจะเป็นมวลที่กระจัดกระจายอยู่ตรงกลาง (กลางของการกระจายของคุณ) ในขณะที่ภูมิภาคที่มีความหนาแน่นสูงสุดคือพื้นที่รอบโหมด100α%ของการกระจาย สิ่งนี้จะมีความชัดเจนมากขึ้นถ้าคุณเปรียบเทียบทั้งสองแปลงในภาพด้านล่าง - ควอไทล์ "ตัด" การกระจายตัวในแนวตั้งในขณะที่ภูมิภาคที่มีความหนาแน่นสูงสุด "ตัด" แนวนอน

Quantiles vs HDR ช่วงเวลา

สิ่งต่อไปที่ต้องพิจารณาคือวิธีจัดการกับความจริงที่ว่าคุณมีข้อมูลที่ไม่สมบูรณ์เกี่ยวกับการกระจาย (สมมติว่าเรากำลังพูดถึงการกระจายอย่างต่อเนื่องคุณมีเพียงจุดจำนวนมากแทนที่จะเป็นฟังก์ชัน) สิ่งที่คุณสามารถทำได้คือใช้ค่า "ตามที่เป็น" หรือใช้การแก้ไขหรือการปรับให้เรียบเพื่อรับค่า "อยู่ระหว่าง"

วิธีการหนึ่งที่จะใช้การแก้ไขเชิงเส้น (ดู?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μ±ζ)αζ


ทำไมคุณถึงสุ่มตัวอย่างเมื่อคุณสามารถคำนวณปริมาณโดยตรงจากข้อมูลที่ได้รับ (โดยใช้วิธีใดวิธีหนึ่ง)
whuber

1
@whuber เพราะราคาถูกและใช้งานง่าย แต่ฉันจะแก้ไขเพื่ออธิบายการคำนวณแบบไม่จำลองในวันพรุ่งนี้
ทิม

สวัสดีทิมนี่มีประโยชน์มาก มันจะไม่ถูกต้องหรือไม่เพียงแค่นำควอไทล์จากการกระจาย (ล่าง <- x [ซึ่ง (as.logical (diff (cumsum (px) / sum (px)> 0.025)))))) (บน <- x [ซึ่ง (as.logical (diff (cumsum (px) / sum) (px) <0.975)))]
user19758

@ user19758 โปรดตรวจสอบการแก้ไขของฉัน
ทิม

+1 คำอธิบายภาพประกอบและรหัสเพิ่มเติมตั้งมาตรฐานสูงสำหรับคำตอบในเว็บไซต์นี้ ขอบคุณ!
whuber
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.