Sự nhầm lẫn này giữa các thủ tục bootstrap và thủ tục Monte Carlo cứ lặp đi lặp lại, vì vậy có lẽ đây là nơi tốt nhất để giải quyết nó. (Các ví dụ về R
mã cũng có thể giúp với bài tập về nhà.)
Hãy xem xét việc thực hiện bootstrap này trong R
:
boot <- function(x, t) { # Exact bootstrap of procedure t on data x
n <- length(x) # Must lie between 2 and 7 inclusive.
if (n > 7) {
stop("Sample size exceeds 7; use an approximate method instead.")
}
p <- c(n, 1:(n-1))
a <- rep(x, n^(n-1))
dim(a) <- rep(n, n)
y <- as.vector(a)
while (n > 1) {
n <- n-1
a <- aperm(a, p)
y <- cbind(as.vector(a), y)
}
apply(y, 1, t)
}
Một cái nhìn nhanh sẽ xác nhận rằng đây là một phép tính xác định : không có giá trị ngẫu nhiên nào được tạo hoặc sử dụng. (Tôi sẽ để lại chi tiết về hoạt động bên trong của nó để người đọc quan tâm tự tìm ra.)
Các đối số boot
là một lô dữ liệu số trong mảng x
và tham chiếu t
đến một hàm (có thể được áp dụng cho các mảng chính xác như x
) để trả về một giá trị số duy nhất; nói cách khác, t
là một thống kê . Nó tạo ra tất cả các mẫu có thể có sự thay thế từ x
và áp dụng t
cho từng mẫu, do đó tạo ra một số cho mỗi mẫu như vậy: đó là bootstrap một cách ngắn gọn. Giá trị trả về là một mảng biểu thị phân phối bootstrap chính xác củat
cho mẫu x
.
Ví dụ nhỏ , hãy bootstrap nghĩa của mẫu x
= c(1,3)
:
> boot(c(1,3), mean)
> [1] 1 2 2 3
2( 1 , 3 )( 1 , 1 )( 1 , 3 )( 3 , 1 )( 3 , 3 )boot
t
t
1223, tương ứng, như thể hiện trong đầu ra.
( 1 , 3 , 3 , 4 , 7 )
hist(boot(c(1,3,3,4,7), sd))
5
> set.seed(17)
> quantile(boot(runif(5, min=0, max=10), sd), .95)[1]
95%
3.835870
Kết quả cho mẫu ngẫu nhiên đặc biệt này là 3,83587. Điều này là chắc chắn: bạn đã gọi boot
lại với cùng một bộ dữ liệu, câu trả lời sẽ hoàn toàn giống nhau. Nhưng làm thế nào câu trả lời có thể thay đổi với các mẫu ngẫu nhiên khác nhau? Tìm hiểu bằng cách lặp lại quá trình này một vài lần và vẽ biểu đồ kết quả:
> boot.sd <- replicate(100, quantile(boot(runif(5, min=0, max=10), sd), .95)[1])
> hist(boot.sd)
01010 / 12--√≈ 2,887
> length(boot.sd[boot.sd >= 10/sqrt(12)]) / length(boot.sd)
[1] 0.75
Nhưng đó không phải là gần 95% danh nghĩa mà chúng tôi đã chỉ định (và đang hy vọng)! Đây là một giá trị của mô phỏng: nó so sánh hy vọng của chúng ta với những gì đang thực sự xảy ra. (Tại sao lại có sự khác biệt? Tôi tin rằng đó là do bootstrapping SD không hoạt động tốt với các mẫu thực sự nhỏ.)
Ôn tập
Thống kê Bootstrap về mặt khái niệm cũng giống như bất kỳ thống kê nào khác như độ lệch trung bình hoặc độ lệch chuẩn; họ chỉ có xu hướng mất nhiều thời gian để tính toán. (Xem thông báo cảnh báo trong boot
mã!)
Mô phỏng Monte-Carlo có thể hữu ích cho việc nghiên cứu cách thống kê bootstrap thay đổi do tính ngẫu nhiên trong việc lấy mẫu. Các biến thể quan sát được trong mô phỏng như vậy là do sự thay đổi trong các mẫu, không phải là biến thể trong bootstrap.
nnn