Xác suất bảo hiểm của độ tin cậy bootstrap cơ bản Interval


11

Tôi có câu hỏi sau đây cho một khóa học tôi đang làm:

Thực hiện một nghiên cứu ở Monte Carlo để ước tính xác suất bao phủ của khoảng tin cậy bootstrap thông thường tiêu chuẩn và khoảng tin cậy bootstrap cơ bản. Mẫu từ một dân số bình thường và kiểm tra tỷ lệ bao phủ theo kinh nghiệm cho trung bình mẫu.

Xác suất bảo hiểm cho CI bootstrap tiêu chuẩn rất dễ dàng:

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

Từ những gì tôi đã được dạy cho khóa học này, khoảng tin cậy bootstrap cơ bản có thể được tính như sau:

# 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);

Điều đó có ý nghĩa. Điều tôi không hiểu là làm thế nào để tính xác suất bảo hiểm cho CI bootstrap cơ bản. Tôi hiểu rằng xác suất bảo hiểm sẽ đại diện cho số lần CI chứa giá trị thực (trong trường hợp này mu). Tôi chỉ đơn giản là chạy bootchức năng nhiều lần?

Làm thế nào tôi có thể tiếp cận câu hỏi này khác nhau?


size=100một lỗi đánh máy của bạn ? Tôi không tin rằng bạn đang nhận được giới hạn trên và dưới bên phải vì kích thước mẫu ẩn có vẻ là 1000 khi bạn tính toán các TCTD của mình trong vòng lặp (vì bạn sử dụng sqrt.ntrong tính toán). Ngoài ra, tại sao bạn so sánh với muvà không trực tiếp 0 (nghĩa sau là trung bình thực)?
Đức hồng y

Ngoài ra, smpl = x[sample(1:n, size = 100, replace = TRUE)]; có thể được đơn giản hóa để smpl = sample(x, size=100, replace=TRUE).
Đức hồng y

@cardinal - Vâng, đó là một lỗi đánh máy và tương tự với mu0. CI bình thường hoạt động tốt, đó là CI bootstrap cơ bản mà tôi gặp khó khăn.
TheCloudlessSky

Câu trả lời:


16

Thuật ngữ có thể không được sử dụng nhất quán, vì vậy sau đây chỉ là cách tôi hiểu câu hỏi ban đầu. Theo hiểu biết của tôi, các TCTD bình thường bạn tính toán không phải là những gì được yêu cầu. Mỗi bộ sao chép bootstrap cung cấp cho bạn một khoảng tin cậy, không nhiều. Cách tính các loại CI khác nhau từ kết quả của một bộ sao chép bootstrap như sau:

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

Vì tôi muốn so sánh các tính toán với kết quả từ gói boot, trước tiên tôi xác định một hàm sẽ được gọi cho mỗi lần lặp. Các đối số của nó là mẫu ban đầu và một vectơ chỉ mục chỉ định các trường hợp cho một lần lặp. Nó trả về , ước tính trình cắm cho , cũng như , ước tính trình cắm cho phương sai của trung bình . Cái sau sẽ chỉ được yêu cầu cho bootstrap -CI. L S 2 M σ 2 M tMμ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

Không cần sử dụng gói, bootbạn chỉ có thể sử dụng replicate()để có được một bộ sao chép bootstrap.

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

Nhưng hãy gắn bó với kết quả boot.ci()để có một tài liệu tham khảo.

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

Cơ bản, phân vị và -CI dựa vào phân phối theo kinh nghiệm của các ước tính bootstrap. Để có được các lượng tử và , chúng tôi tìm các chỉ số tương ứng với vectơ ước tính của bootstrap (lưu ý rằng sẽ thực hiện phép nội suy phức tạp hơn để tìm các lượng tử theo kinh nghiệm khi các chỉ số không phải là số tự nhiên) .α / 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

Đối với -CI, chúng tôi cần ước tính bootstrap để tính giá trị quan trọng . Đối với CI bình thường tiêu chuẩn, giá trị tới hạn sẽ chỉ là giá trị từ phân phối chuẩn thông thường.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

Để ước tính xác suất bảo hiểm của các loại CI này, bạn sẽ phải chạy mô phỏng này nhiều lần. Chỉ cần bọc mã vào một hàm, trả về một danh sách với kết quả CI và chạy nó với replicate()như thể hiện trong ý chính này .


Ồ - Giải thích tuyệt vời về những gì tôi đã làm sai. Ngoài ra - cảm ơn các mẹo mã! Điều này hoạt động hoàn hảo!
TheCloudlessSky

Ok một câu hỏi cuối cùng: khi tôi cố gắng sao chép thông tin này, tôi đã tạo một hàm computeCIsvà gọi results = replicate(500, computeCIs());. Khi kết thúc computeCIsnó trở lại c(ciBasic, ciPerc). Để kiểm tra xác suất bảo hiểm, sau đó tôi không nên kiểm tra mean(results[1, ] < 0 & results[2, ] > 0)để kiểm tra tất cả các CI cơ bản có chứa giá trị trung bình thực (xác suất bảo hiểm) không? Khi tôi chạy cái này, tôi nhận được 1khi tôi nghĩ tôi nên lấy 0.95.
TheCloudlessSky

@TheCloudlessSky Để biết chức năng hoàn chỉnh và mô phỏng đầy đủ với kết quả mong đợi về tần suất phủ sóng, hãy xem pastebin.com/qKpNKK0D
caracal

Yup, tôi là một thằng ngốc :) ... Tôi đã mắc lỗi đánh máy khi sao chép mã trong R ... cảm ơn vì tất cả sự giúp đỡ của bạn! :)
TheCloudlessSky

Cảm ơn @caracal đã trả lời tốt đẹp. Liên kết pastebin.com/qKpNKK0Dbị hỏng. Sẽ đánh giá cao nếu bạn cập nhật nó và cung cấp chức năng hoàn chỉnh và mô phỏng đầy đủ. Cảm ơn
MYaseen208
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.