ความน่าจะเป็นที่ครอบคลุมของช่วงความมั่นใจบูตพื้นฐาน


11

ฉันมีคำถามต่อไปนี้สำหรับหลักสูตรที่ฉันกำลังทำอยู่:

ดำเนินการศึกษา Monte Carlo เพื่อประเมินความน่าจะเป็นที่ครอบคลุมของช่วงความมั่นใจบูตมาตรฐานและช่วงความเชื่อมั่นเริ่มต้นพื้นฐาน ตัวอย่างจากประชากรปกติและตรวจสอบอัตราความครอบคลุมเชิงประจักษ์สำหรับค่าเฉลี่ยตัวอย่าง

ความน่าจะเป็นของการครอบคลุมสำหรับ bootstrap CI มาตรฐานทั่วไปนั้นง่าย:

n = 1000;
alpha = c(0.025, 0.975);
x = rnorm(n, 0, 1);
mu = mean(x);
sqrt.n = sqrt(n);

LNorm = numeric(B);
UNorm = numeric(B);

for(j in 1:B)
{
    smpl = x[sample(1:n, size = n, replace = TRUE)];
    xbar = mean(smpl);
    s = sd(smpl);

    LNorm[j] = xbar + qnorm(alpha[1]) * (s / sqrt.n);
    UNorm[j] = xbar + qnorm(alpha[2]) * (s / sqrt.n);
}

mean(LNorm < 0 & UNorm > 0); # Approximates to 0.95
# NOTE: it is not good enough to look at overall coverage
# Must compute separately for each tail

จากสิ่งที่ฉันได้รับการสอนสำหรับหลักสูตรนี้ช่วงเวลาความมั่นใจในการบูตขั้นพื้นฐานสามารถคำนวณได้ดังนี้:

# Using x from previous...
R = boot(data = x, R=1000, statistic = function(x, i){ mean(x[i]); });
result = 2 * mu - quantile(R$t, alpha, type=1);

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

ฉันจะเข้าถึงคำถามนี้ต่างกันอย่างไร


คุณsize=100พิมพ์ผิดหรือเปล่า? ฉันไม่เชื่อว่าคุณได้รับขอบเขตด้านบนและล่างที่ถูกต้องเนื่องจากขนาดตัวอย่างโดยนัยดูเหมือนจะเป็น 1,000 เมื่อคุณคำนวณ CIs ของคุณในลูป (เนื่องจากคุณใช้sqrt.nในการคำนวณ) นอกจากนี้ทำไมคุณถึงเปรียบเทียบmuและไม่ใช่ 0 โดยตรง (อันหลังเป็นค่าเฉลี่ยจริง)
พระคาร์ดินัล

นอกจากนี้ยังsmpl = x[sample(1:n, size = 100, replace = TRUE)]; สามารถทำให้ง่ายsmpl = sample(x, size=100, replace=TRUE)ขึ้น
พระคาร์ดินัล

@ cardinal - ใช่มันเป็นตัวพิมพ์ผิดและเหมือนกันกับmuการเป็น 0 CI ปกติทำงานได้ดีมันเป็น bootstrap พื้นฐาน CI ที่ฉันมีปัญหา
TheCloudlessSky

คำตอบ:


16

คำศัพท์อาจไม่ได้ใช้อย่างสม่ำเสมอดังนั้นต่อไปนี้เป็นเพียงวิธีที่ฉันเข้าใจคำถามเดิม จากความเข้าใจของฉัน CIs ปกติที่คุณคำนวณไม่ใช่สิ่งที่ขอ ชุดบู๊ตสแตรปแต่ละชุดจะให้ความมั่นใจหนึ่งช่วงเวลาไม่มาก วิธีการคำนวณประเภท CI ที่แตกต่างจากผลลัพธ์ของชุดของการทำสำเนา bootstrap มีดังนี้:

B    <- 999                  # number of replicates
muH0 <- 100                  # for generating data: true mean
sdH0 <- 40                   # for generating data: true sd
N    <- 200                  # sample size
DV   <- rnorm(N, muH0, sdH0) # simulated data: original sample

เนื่องจากฉันต้องการเปรียบเทียบการคำนวณกับผลลัพธ์จากแพคเกจbootฉันจะกำหนดฟังก์ชันที่จะถูกเรียกสำหรับการทำซ้ำแต่ละครั้ง อาร์กิวเมนต์เป็นตัวอย่างดั้งเดิมและเวกเตอร์ดัชนีที่ระบุเคสสำหรับการเรพลิเคทเดียว มันส่งคืน , การประมาณปลั๊กอินสำหรับเช่นเดียวกับ , การประมาณปลั๊กอินสำหรับความแปรปรวนของค่าเฉลี่ย2} หลังจำเป็นสำหรับ bootstrap -CI เท่านั้น μ S 2 M σ 2 Mเสื้อMμSM2σM2t

> getM <- function(orgDV, idx) {
+     bsM   <- mean(orgDV[idx])                       # M*
+     bsS2M <- (((N-1) / N) * var(orgDV[idx])) / N    # S^2*(M)
+     c(bsM, bsS2M)
+ }

> library(boot)                                       # for boot(), boot.ci()
> bOut <- boot(DV, statistic=getM, R=B)
> boot.ci(bOut, conf=0.95, type=c("basic", "perc", "norm", "stud"))
BOOTSTRAP CONFIDENCE INTERVAL CALCULATIONS
Based on 999 bootstrap replicates
CALL : 
boot.ci(boot.out = bOut, conf = 0.95, type = c("basic", "perc", "norm", "stud"))

Intervals : 
Level      Normal            Basic         Studentized        Percentile    
95%   ( 95.6, 106.0 )   ( 95.7, 106.2 )  ( 95.4, 106.2 )   ( 95.4, 106.0 )  
Calculations and Intervals on Original Scale

โดยไม่ต้องใช้แพคเกจbootที่คุณก็สามารถใช้replicate()ที่จะได้รับชุดของซ้ำบูต

boots <- t(replicate(B, getM(DV, sample(seq(along=DV), replace=TRUE))))

แต่เรามาดูผลลัพธ์boot.ci()ที่มีการอ้างอิงกัน

boots   <- bOut$t                     # estimates from all replicates
M       <- mean(DV)                   # M from original sample
S2M     <- (((N-1)/N) * var(DV)) / N  # S^2(M) from original sample
Mstar   <- boots[ , 1]                # M* for each replicate
S2Mstar <- boots[ , 2]                # S^2*(M) for each replicate
biasM   <- mean(Mstar) - M            # bias of estimator M

พื้นฐานเปอร์เซ็นไทล์และ -CI นั้นขึ้นอยู่กับการกระจายเชิงประจักษ์ของการประมาณบูทสแตรป ในการรับและ quantiles เราจะหาดัชนีที่สอดคล้องกับเวกเตอร์ที่เรียงลำดับของ bootstrap โดยประมาณ (โปรดทราบว่าจะทำการแก้ไขที่ซับซ้อนมากขึ้นเพื่อค้นหา quantile เชิงประจักษ์เมื่อดัชนีไม่ใช่ตัวเลขธรรมชาติ) .α / 2 1 - α / 2tα/21α/2boot.ci()

(idx <- trunc((B + 1) * c(0.05/2, 1 - 0.05/2)) # indices for sorted vector of estimates
[1] 25 975

> (ciBasic <- 2*M - sort(Mstar)[idx])          # basic CI
[1] 106.21826  95.65911

> (ciPerc <- sort(Mstar)[idx])                 # percentile CI
[1] 95.42188 105.98103

สำหรับ -CI เราจำเป็นต้องใช้ bootstrapประมาณการเพื่อคำนวณค่า -val วิกฤติ สำหรับ CI ปกติมาตรฐานค่าวิกฤตจะเป็น value จากการแจกแจงปกติมาตรฐานt t ztttz

# standard normal CI with bias correction
> zCrit   <- qnorm(c(0.025, 0.975))   # z-quantiles from std-normal distribution
> (ciNorm <- M - biasM + zCrit * sqrt(var(Mstar)))
[1] 95.5566 106.0043

> tStar <- (Mstar-M) / sqrt(S2Mstar)  # t*
> tCrit <- sort(tStar)[idx]           # t-quantiles from empirical t* distribution
> (ciT  <- M - tCrit * sqrt(S2M))     # studentized t-CI
[1] 106.20690  95.44878

ในการประเมินความน่าจะเป็นที่ครอบคลุมของประเภท CI เหล่านี้คุณจะต้องดำเนินการจำลองนี้หลายครั้ง เพียงแค่ห่อโค๊ดลงในฟังก์ชั่นคืนรายการด้วย CI-results และรันด้วยreplicate()เหมือนที่แสดงในส่วนสำคัญนี้


ว้าว! - คำอธิบายที่ยอดเยี่ยมเกี่ยวกับสิ่งที่ฉันทำผิด นอกจากนี้ - ขอบคุณสำหรับเคล็ดลับรหัส! มันทำงานได้อย่างสมบูรณ์แบบ!
TheCloudlessSky

ตกลงคำถามสุดท้ายหนึ่งข้อ: เมื่อฉันพยายามทำซ้ำข้อมูลนี้ฉันสร้างฟังก์ชันcomputeCIsและเรียกresults = replicate(500, computeCIs());ใช้ ในตอนท้ายของcomputeCIsมันกลับc(ciBasic, ciPerc)มา เพื่อทดสอบความน่าจะเป็นของการรายงานข่าวฉันไม่ควรทดสอบmean(results[1, ] < 0 & results[2, ] > 0)เพื่อทดสอบสำหรับ CI พื้นฐานทั้งหมดที่มีค่าเฉลี่ยจริง (ความน่าจะเป็นความครอบคลุม) เมื่อฉันทำงานนี้ฉันได้รับเมื่อฉันคิดว่าฉันควรจะได้รับ1 0.95
TheCloudlessSky

@TheCloudlessSky สำหรับฟังก์ชั่นที่สมบูรณ์และการจำลองแบบเต็มรูปแบบด้วยผลลัพธ์ที่คาดหวังในแง่ของความถี่ครอบคลุมให้ดูที่pastebin.com/qKpNKK0D
caracal

ใช่ฉันเป็นคนงี่เง่า:) ... ฉันพิมพ์ผิดเมื่อคัดลอกรหัสใน R ... ขอบคุณสำหรับความช่วยเหลือของคุณ! :)
TheCloudlessSky

ขอบคุณ @caracal สำหรับคำตอบที่ดี ลิงก์pastebin.com/qKpNKK0Dเสีย จะขอบคุณถ้าคุณอัปเดตและให้ฟังก์ชั่นที่สมบูรณ์และการจำลองแบบเต็ม ขอบคุณ
MYaseen208
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.