Các bản phân phối rất sai lệch như log-normal không dẫn đến khoảng tin cậy bootstrap chính xác. Dưới đây là một ví dụ cho thấy vùng đuôi bên trái và bên phải cách xa 0,025 lý tưởng cho dù bạn thử phương pháp bootstrap nào trong R:
require(boot)
n <- 25
B <- 1000
nsim <- 1000
set.seed(1)
which <- c('basic', 'perc', 'norm', 'bca', 'stud')
mul <- 0; sdl <- 1.65 # on log scale
dist <- c('normal', 'lognormal')[2]
switch(dist, normal = {g <- function(x) x; mu <- mul},
lognormal = {g <- exp; mu <- exp(mul + sdl * sdl / 2)})
count <- matrix(0, nrow=length(which), ncol=2,
dimnames=list(which, c('lower', 'upper')))
stat <- function(x, j) {
## See http://www.psychology.mcmaster.ca/bennett/boot09/percentileT.pdf
x <- x[j]
m <- mean(x)
s <- sd(x)
n <- length(x)
sem <- s / sqrt(n)
m.var <- sem ^ 2
c(m, m.var)
}
for(i in 1 : nsim) {
if(i %% 100 == 0) cat(i, '')
x <- g(rnorm(n, mul, sdl))
b <- boot(x, stat, R=B)
ci <- boot.ci(b, type=which)
for(w in which) {
nam <- switch(w, perc='percent', norm='normal', basic='basic',
stud='student', bca='bca')
z <- rev(rev(ci[[nam]])[1:2])
count[w, 'lower'] <- count[w, 'lower'] + (z[1] > mu)
count[w, 'upper'] <- count[w, 'upper'] + (z[2] < mu)
}
}
cat('\n')
count / nsim
Kết quả như sau:
lower upper
basic 0.000 0.329
perc 0.003 0.257
norm 0.000 0.287
bca 0.015 0.185
stud 0.005 0.129
Với bootstraps đơn vẫn không cung cấp phạm vi bảo hiểm chính xác đầy đủ:
lower upper
basic 0.001 0.114
perc 0.005 0.093
norm 0.002 0.102
bca 0.017 0.067
stud 0.011 0.058
Khả năng thực nghiệm cũng không cung cấp khoảng tin cậy chính xác khi lấy mẫu từ phân phối logic.
Để khôi phục các mục tiêu, tôi đang tìm kiếm một cách tiếp cận thường áp dụng để có được khoảng tin cậy cho dân số có nghĩa là
- khoảng không đối xứng nếu phân phối dữ liệu thô không đối xứng
- khoảng có phạm vi bảo hiểm chính xác ở cả hai đuôi (ví dụ: xác suất lỗi 0,025 ở cả hai)
- thủ tục không yêu cầu nhà phân tích chỉ định bất cứ điều gì về phân phối cơ bản hoặc chuyển đổi cần thiết để làm cho phân phối đối xứng
Tiếp tục suy nghĩ về điều này, có hai cách khái niệm rộng rãi về vấn đề mà tôi muốn thảo luận.
- Mặc dù không có bootstrap đơn lẻ nào sẽ đưa ra giới hạn độ tin cậy chính xác đầy đủ cho các mẫu từ các bản phân phối cực kỳ sai lệch, bootstrap đôi có thể cải thiện đáng kể độ tin cậy ở cả hai đuôi. Nankervis có một số kết quả tốt và cung cấp một thuật toán tính toán tuyệt vời. Nhưng không có phần mềm nào tôi có thể tìm thấy thực hiện điều này.
Mã R minh họa 1. ở trên:
## Exact CI for median from DescTools package SignTest.default
## See also ttp://www.stat.umn.edu/geyer/old03/5102/notes/rank.pdf,
## http://de.scribd.com/doc/75941305/Confidence-Interval-for-Median-Based-on-Sign-Test
cimed <- function(x, alpha=0.05, na.rm=FALSE) {
if(na.rm) x <- x[! is.na(x)]
n <- length(x)
k <- qbinom(p=alpha / 2, size=n, prob=0.5, lower.tail=TRUE)
## Actual CL: 1 - 2 * pbinom(k - 1, size=n, prob=0.5) >= 1 - alpha
sort(x)[c(k, n - k + 1)]
}
n <- 20
m <- 20000
cil <- cilt <- 0
z <- qt(0.975, n - 1)
for(i in 1 : m) {
x <- rnorm(n)
cil <- cil + diff(cimed(x))
cilt <- cilt + 2 * z * sqrt(var(x) / n)
}
cil <- cil / m
cilt <- cilt / m
c(cil, cilt, cilt / cil, cil / cilt)