Có một số "hương vị" hoặc các hình thức của bootstrap (ví dụ: không tham số, tham số, lấy mẫu dư và nhiều hình thức khác). Bootstrap trong ví dụ này được gọi là bootstrap phi tham số , hoặc trường hợp lấy mẫu lại (xem ở đây , ở đây , ở đây và ở đây cho các ứng dụng trong hồi quy). Ý tưởng cơ bản là bạn coi mẫu của bạn là dân số và liên tục rút ra các mẫu mới từ nó với sự thay thế . Tất cả các quan sát ban đầu có xác suất tương đương được rút vào mẫu mới. Sau đó, bạn tính toán và lưu trữ (các) thống kê quan tâm, đây có thể là giá trị trung bình, hệ số trung bình hoặc hồi quy bằng cách sử dụng mẫu mới được vẽ. Điều này được lặp lại lần. Trong mỗi lần lặp lại, một số quan sát từ mẫu ban đầu của bạn được rút ra nhiều lần trong khi một số quan sát có thể không được rút ra. Sau lần lặp, bạn có ước tính bootstrap được lưu trữ (các) thống kê quan tâm (ví dụ: nếu và thống kê quan tâm là trung bình, bạn có 1000 ước tính khởi động trung bình). Cuối cùng, các số liệu thống kê tóm tắt như giá trị trung bình, trung bình và độ lệch chuẩn của ước tính bootstrap được tính toán.nnnn = 1000n
Bootstrapping thường được sử dụng cho:
- Tính toán khoảng tin cậy (và ước tính các lỗi tiêu chuẩn)
- Ước tính sai lệch của ước tính điểm
Có một số phương pháp để tính toán khoảng tin cậy dựa trên các mẫu bootstrap ( bài viết này cung cấp giải thích và hướng dẫn). Một phương pháp rất đơn giản để tính khoảng tin cậy 95% chỉ là tính phần trăm theo kinh nghiệm 2,5 và 97,5 của các mẫu bootstrap (khoảng này được gọi là khoảng phần trăm bootstrap; xem mã bên dưới). Phương pháp khoảng phần trăm đơn giản hiếm khi được sử dụng trong thực tế vì có các phương pháp tốt hơn, chẳng hạn như bootstrap được điều chỉnh và tăng tốc (BCa). Khoảng BCa điều chỉnh cho cả độ lệch và độ lệch trong phân phối bootstrap.
n
Hãy sao chép ví dụ từ trang web nhưng sử dụng vòng lặp của riêng chúng tôi kết hợp các ý tưởng tôi đã nêu ở trên (vẽ liên tục với thay thế):
#-----------------------------------------------------------------------------
# Load packages
#-----------------------------------------------------------------------------
require(ggplot2)
require(pscl)
require(MASS)
require(boot)
#-----------------------------------------------------------------------------
# Load data
#-----------------------------------------------------------------------------
zinb <- read.csv("http://www.ats.ucla.edu/stat/data/fish.csv")
zinb <- within(zinb, {
nofish <- factor(nofish)
livebait <- factor(livebait)
camper <- factor(camper)
})
#-----------------------------------------------------------------------------
# Calculate zero-inflated regression
#-----------------------------------------------------------------------------
m1 <- zeroinfl(count ~ child + camper | persons, data = zinb,
dist = "negbin", EM = TRUE)
#-----------------------------------------------------------------------------
# Store the original regression coefficients
#-----------------------------------------------------------------------------
original.estimates <- as.vector(t(do.call(rbind, coef(summary(m1)))[, 1:2]))
#-----------------------------------------------------------------------------
# Set the number of replications
#-----------------------------------------------------------------------------
n.sim <- 2000
#-----------------------------------------------------------------------------
# Set up a matrix to store the results
#-----------------------------------------------------------------------------
store.matrix <- matrix(NA, nrow=n.sim, ncol=12)
#-----------------------------------------------------------------------------
# The loop
#-----------------------------------------------------------------------------
set.seed(123)
for(i in 1:n.sim) {
#-----------------------------------------------------------------------------
# Draw the observations WITH replacement
#-----------------------------------------------------------------------------
data.new <- zinb[sample(1:dim(zinb)[1], dim(zinb)[1], replace=TRUE),]
#-----------------------------------------------------------------------------
# Calculate the model with this "new" data
#-----------------------------------------------------------------------------
m <- zeroinfl(count ~ child + camper | persons,
data = data.new, dist = "negbin",
start = list(count = c(1.3711, -1.5152, 0.879),
zero = c(1.6028, -1.6663)))
#-----------------------------------------------------------------------------
# Store the results
#-----------------------------------------------------------------------------
store.matrix[i, ] <- as.vector(t(do.call(rbind, coef(summary(m)))[, 1:2]))
}
#-----------------------------------------------------------------------------
# Save the means, medians and SDs of the bootstrapped statistics
#-----------------------------------------------------------------------------
boot.means <- colMeans(store.matrix, na.rm=T)
boot.medians <- apply(store.matrix,2,median, na.rm=T)
boot.sds <- apply(store.matrix,2,sd, na.rm=T)
#-----------------------------------------------------------------------------
# The bootstrap bias is the difference between the mean bootstrap estimates
# and the original estimates
#-----------------------------------------------------------------------------
boot.bias <- colMeans(store.matrix, na.rm=T) - original.estimates
#-----------------------------------------------------------------------------
# Basic bootstrap CIs based on the empirical quantiles
#-----------------------------------------------------------------------------
conf.mat <- matrix(apply(store.matrix, 2 ,quantile, c(0.025, 0.975), na.rm=T),
ncol=2, byrow=TRUE)
colnames(conf.mat) <- c("95%-CI Lower", "95%-CI Upper")
Và đây là bảng tóm tắt của chúng tôi:
#-----------------------------------------------------------------------------
# Set up summary data frame
#-----------------------------------------------------------------------------
summary.frame <- data.frame(mean=boot.means, median=boot.medians,
sd=boot.sds, bias=boot.bias, "CI_lower"=conf.mat[,1], "CI_upper"=conf.mat[,2])
summary.frame
mean median sd bias CI_lower CI_upper
1 1.2998 1.3013 0.39674 -0.0712912 0.51960 2.0605
2 0.2527 0.2486 0.03208 -0.0034461 0.19898 0.3229
3 -1.5662 -1.5572 0.26220 -0.0509239 -2.12900 -1.0920
4 0.2005 0.1986 0.01949 0.0049019 0.16744 0.2418
5 0.9544 0.9252 0.48915 0.0753405 0.03493 1.9025
6 0.2702 0.2688 0.02043 0.0009583 0.23272 0.3137
7 -0.8997 -0.9082 0.22174 0.0856793 -1.30664 -0.4380
8 0.1789 0.1781 0.01667 0.0029513 0.14494 0.2140
9 2.0683 1.7719 1.59102 0.4654898 0.44150 8.0471
10 4.0209 0.8270 13.23434 3.1845710 0.58114 57.6417
11 -2.0969 -1.6717 1.56311 -0.4306844 -8.43440 -1.1156
12 3.8660 0.6435 13.27525 3.1870642 0.33631 57.6062
Một số giải thích
- Sự khác biệt giữa giá trị trung bình của các ước tính bootstrap và ước tính ban đầu là cái được gọi là "bias" trong đầu ra của
boot
- Kết quả đầu ra của các
boot
cuộc gọi "lỗi std." Là độ lệch chuẩn của các ước tính bootstrapping
So sánh nó với đầu ra từ boot
:
#-----------------------------------------------------------------------------
# Compare with boot output and confidence intervals
#-----------------------------------------------------------------------------
set.seed(10)
res <- boot(zinb, f, R = 2000, parallel = "snow", ncpus = 4)
res
Bootstrap Statistics :
original bias std. error
t1* 1.3710504 -0.076735010 0.39842905
t2* 0.2561136 -0.003127401 0.03172301
t3* -1.5152609 -0.064110745 0.26554358
t4* 0.1955916 0.005819378 0.01933571
t5* 0.8790522 0.083866901 0.49476780
t6* 0.2692734 0.001475496 0.01957823
t7* -0.9853566 0.083186595 0.22384444
t8* 0.1759504 0.002507872 0.01648298
t9* 1.6031354 0.482973831 1.58603356
t10* 0.8365225 3.240981223 13.86307093
t11* -1.6665917 -0.453059768 1.55143344
t12* 0.6793077 3.247826469 13.90167954
perc.cis <- matrix(NA, nrow=dim(res$t)[2], ncol=2)
for( i in 1:dim(res$t)[2] ) {
perc.cis[i,] <- boot.ci(res, conf=0.95, type="perc", index=i)$percent[4:5]
}
colnames(perc.cis) <- c("95%-CI Lower", "95%-CI Upper")
perc.cis
95%-CI Lower 95%-CI Upper
[1,] 0.52240 2.1035
[2,] 0.19984 0.3220
[3,] -2.12820 -1.1012
[4,] 0.16754 0.2430
[5,] 0.04817 1.9084
[6,] 0.23401 0.3124
[7,] -1.29964 -0.4314
[8,] 0.14517 0.2149
[9,] 0.29993 8.0463
[10,] 0.57248 56.6710
[11,] -8.64798 -1.1088
[12,] 0.33048 56.6702
#-----------------------------------------------------------------------------
# Our summary table
#-----------------------------------------------------------------------------
summary.frame
mean median sd bias CI_lower CI_upper
1 1.2998 1.3013 0.39674 -0.0712912 0.51960 2.0605
2 0.2527 0.2486 0.03208 -0.0034461 0.19898 0.3229
3 -1.5662 -1.5572 0.26220 -0.0509239 -2.12900 -1.0920
4 0.2005 0.1986 0.01949 0.0049019 0.16744 0.2418
5 0.9544 0.9252 0.48915 0.0753405 0.03493 1.9025
6 0.2702 0.2688 0.02043 0.0009583 0.23272 0.3137
7 -0.8997 -0.9082 0.22174 0.0856793 -1.30664 -0.4380
8 0.1789 0.1781 0.01667 0.0029513 0.14494 0.2140
9 2.0683 1.7719 1.59102 0.4654898 0.44150 8.0471
10 4.0209 0.8270 13.23434 3.1845710 0.58114 57.6417
11 -2.0969 -1.6717 1.56311 -0.4306844 -8.43440 -1.1156
12 3.8660 0.6435 13.27525 3.1870642 0.33631 57.6062
So sánh các cột "thiên vị" và "lỗi lỗi" với cột "sd" của bảng tóm tắt của chúng ta. Khoảng tin cậy 95% của chúng tôi rất giống với khoảng tin cậy được tính bằng boot.ci
cách sử dụng phương pháp phân vị (không phải tất cả: nhìn vào giới hạn dưới của tham số với chỉ số 9).