Làm thế nào để bootstrapping trong R thực sự hoạt động?


22

Tôi đã xem xét gói khởi động trong R và trong khi tôi đã tìm thấy một số mồi tốt về cách sử dụng nó, tôi vẫn chưa tìm thấy bất cứ điều gì mô tả chính xác những gì đang xảy ra "đằng sau hậu trường". Ví dụ, trong ví dụ này , hướng dẫn cho thấy cách sử dụng các hệ số hồi quy tiêu chuẩn làm điểm khởi đầu cho hồi quy bootstrap nhưng không giải thích quy trình bootstrap thực sự đang làm gì để lấy hệ số hồi quy bootstrap. Có vẻ như có một số quá trình lặp đi lặp lại đang diễn ra nhưng tôi dường như không thể tìm ra chính xác những gì đang diễn ra.


3
Đã lâu rồi kể từ lần cuối tôi mở nó nên tôi không biết liệu nó có trả lời được câu hỏi của bạn không, nhưng gói khởi động đặc biệt dựa trên các phương pháp chi tiết trong Davison, AC, & Hinkley, DV (1997). Phương pháp Bootstrap và ứng dụng của họ. Cambridge: Nhà xuất bản Đại học Cambridge. (Tham chiếu cũng được trích dẫn trong tệp trợ giúp cho gói khởi động .)
Gala

Câu trả lời:


34

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ở đâ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:

  1. Tính toán khoảng tin cậy (và ước tính các lỗi tiêu chuẩn)
  2. Ước tính sai lệch của ước tính điểm

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 bootcuộ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.cicá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).


Cảm ơn bạn đã trả lời chi tiết. Về cơ bản, bạn có nói rằng các hệ số là trung bình của 2000 bộ hệ số đã được tạo không?
zgall1

4
t

Idea Ý tưởng cơ bản là bạn coi mẫu của mình là dân số và liên tục rút mẫu mới từ mẫu đó bằng cách thay thế '- làm thế nào để xác định kích thước của mẫu mới là bao nhiêu?
Sinusx

1
@Sinusx Thông thường, bạn vẽ các mẫu có cùng kích thước với mẫu ban đầu. Ý tưởng quan trọng là vẽ mẫu với sự thay thế. Vì vậy, một số giá trị từ mẫu ban đầu sẽ được rút ra nhiều lần và một số giá trị hoàn toàn không.
COOLSerdash

6

Bạn nên tập trung vào chức năng được truyền vào bootdưới dạng tham số "thống kê" và chú ý cách nó được xây dựng.

f <- function(data, i) {
  require(pscl)
  m <- zeroinfl(count ~ child + camper | persons,
    data = data[i, ], dist = "negbin",
    start = list(count = c(1.3711, -1.5152, 0.879), zero = c(1.6028, -1.6663)))
  as.vector(t(do.call(rbind, coef(summary(m)))[, 1:2]))
}

Đối số "dữ liệu" sẽ nhận được toàn bộ khung dữ liệu, nhưng đối số "i" sẽ nhận được một mẫu các chỉ mục hàng được tạo bởi "boot" và được lấy từ 1: NROW (dữ liệu). Như bạn có thể thấy từ mã đó, "i" sau đó được sử dụng để tạo một mẫu mới được truyền đến zeroinlvà sau đó chỉ các phần được chọn trong kết quả của nó được trả về.

Hãy tưởng tượng rằng "i" là {1,2,3,3,3,6,7,7,10}. Hàm "[" sẽ trả về chỉ các hàng có 3 bản sao của hàng 3 và 2 bản sao của hàng 7. Đó sẽ là cơ sở cho một zeroinl()phép tính duy nhất và sau đó các hệ số sẽ được trả về bootdo kết quả của quá trình sao chép đó. Số lượng bản sao như vậy được kiểm soát bởi tham số "R".

Vì chỉ có các hệ số hồi quy được trả về statistictrong trường hợp này, nên boothàm sẽ trả về các hệ số tích lũy này dưới dạng giá trị của "t". So sánh hơn nữa có thể được thực hiện bởi các chức năng gói khởi động khác.

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.