Bagaimana cara bootstrap di R benar-benar berfungsi?

22

Saya telah melihat ke dalam paket boot di R dan sementara saya telah menemukan sejumlah primer yang bagus tentang cara menggunakannya, saya belum menemukan apa pun yang menjelaskan dengan tepat apa yang terjadi "di balik layar". Misalnya, dalam contoh ini , panduan ini menunjukkan cara menggunakan koefisien regresi standar sebagai titik awal untuk regresi bootstrap tetapi tidak menjelaskan apa yang sebenarnya dilakukan prosedur bootstrap untuk mendapatkan koefisien regresi bootstrap. Tampaknya ada semacam proses berulang yang terjadi, tetapi sepertinya saya tidak tahu persis apa yang sedang terjadi.

zgall1
sumber
3
Sudah lama sejak saya terakhir kali membukanya jadi saya tidak tahu apakah itu akan menjawab pertanyaan Anda tetapi paket boot didasarkan terutama pada metode yang dijelaskan dalam Davison, AC, & Hinkley, DV (1997). Metode bootstrap dan aplikasinya. Cambridge: Cambridge University Press. (Referensi juga dikutip dalam file bantuan untuk paket booting .)
Gala

Jawaban:

34

Ada beberapa "rasa" atau bentuk bootstrap (misalnya non-parametrik, parametrik, resampling residu, dan banyak lagi lainnya). Bootstrap pada contoh ini disebut bootstrap non-parametrik , atau case resampling (lihat di sini , di sini , di sini dan di sini untuk aplikasi dalam regresi). Ide dasarnya adalah Anda memperlakukan sampel Anda sebagai populasi dan berulang kali mengambil sampel baru dari sana dengan penggantian . Semua pengamatan asli memiliki probabilitas yang sama untuk ditarik ke dalam sampel baru. Kemudian Anda menghitung dan menyimpan statistik yang diminati, ini mungkin berarti, median atau koefisien regresi menggunakan sampel yang baru diambil.. Ini diulangi sebanyak kali. Dalam setiap iterasi, beberapa pengamatan dari sampel asli Anda diambil beberapa kali sementara beberapa pengamatan mungkin tidak diambil sama sekali. Setelah iterasi, Anda memiliki estimasi bootstrap yang tersimpan dari statistik yang diminati (mis. Jika dan statistik yang menarik adalah mean, Anda memiliki 1000 estimasi bootstrap rata-rata). Terakhir, ringkasan statistik seperti rata-rata, median dan standar deviasi dari -estimasi bootstrap dihitung.nnnn=1000n

Bootstrapping sering digunakan untuk:

  1. Perhitungan interval kepercayaan (dan estimasi kesalahan standar)
  2. Estimasi bias estimasi titik

Ada beberapa metode untuk menghitung interval kepercayaan berdasarkan sampel bootstrap ( makalah ini memberikan penjelasan dan panduan). Salah satu metode yang sangat sederhana untuk menghitung interval kepercayaan 95% hanya menghitung persentil 2.5 dan 97.5 empiris dari sampel bootstrap (interval ini disebut interval persentil bootstrap; lihat kode di bawah). Metode interval persentil sederhana jarang digunakan dalam praktik karena ada metode yang lebih baik, seperti bootstrap bias-dikoreksi dan dipercepat (BCa). Interval BCa menyesuaikan bias dan kemiringan dalam distribusi bootstrap.

The Bias hanya diperkirakan sebagai perbedaan antara mean dari disimpan sampel bootstrap dan estimasi asli (s).n

Mari kita meniru contoh dari situs web tetapi menggunakan loop kita sendiri menggabungkan ide-ide yang telah saya uraikan di atas (menggambar berulang kali dengan penggantian):

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

Dan inilah tabel ringkasan kami:

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

Beberapa penjelasan

  • Perbedaan antara rata-rata perkiraan bootstrap dan perkiraan aslinya adalah apa yang disebut "bias" pada output boot
  • Apa output bootpanggilan "std. Error" adalah standar deviasi dari estimasi bootstrap

Bandingkan dengan output dari 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

Bandingkan kolom "bias" dan "std. Error" dengan kolom "sd" dari tabel ringkasan kita sendiri. Interval kepercayaan-95% kami sangat mirip dengan interval kepercayaan yang dihitung dengan boot.cimenggunakan metode persentil (tidak semua: lihat batas bawah parameter dengan indeks 9).

COOLSerdash
sumber
Terima kasih atas jawaban rinci. Apakah Anda pada dasarnya mengatakan bahwa koefisien adalah rata-rata dari 2000 set koefisien yang dihasilkan?
zgall1
4
@ zgall1 Ya, pada dasarnya (atau median). Tetapi paling sering, estimasi titik kurang tertarik pada bootstrap. Seringkali, alasan untuk menggunakan bootstrap adalah untuk menemukan interval kepercayaan yang memperhitungkan distribusi sampel dan tidak menganggap distribusi apa pun (misalnya normal). Dengan cara itu, interval kepercayaan bootstrap sering asimetris, sedangkan interval kepercayaan berdasarkan distribusi normal atau adalah simetris. t
COOLSerdash
'Gagasan dasarnya adalah bahwa Anda memperlakukan sampel Anda sebagai populasi dan berulang kali mengambil sampel baru dengan penggantian' - bagaimana menentukan berapa ukuran sampel baru?
Sinusx
1
@ Sinusx Biasanya, Anda menggambar sampel dengan ukuran yang sama dengan sampel asli. Gagasan penting adalah untuk menarik sampel dengan penggantian. Jadi beberapa nilai dari sampel asli akan ditarik beberapa kali dan beberapa nilai tidak sama sekali.
COOLSerdash
6

Anda harus fokus pada fungsi yang dilewatkan bootsebagai parameter "statistik" dan perhatikan bagaimana itu dibangun.

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]))
}

Argumen "data" akan menerima seluruh kerangka data, tetapi argumen "i" akan menerima sampel indeks baris yang dihasilkan oleh "boot" dan diambil dari 1: NROW (data). Seperti yang dapat Anda lihat dari kode itu, "i" kemudian digunakan untuk membuat sampel-neo yang diteruskan ke zeroinldan kemudian hanya bagian yang dipilih dari hasilnya yang dikembalikan.

Mari kita bayangkan bahwa "i" adalah {1,2,3,3,3,6,7,7,10}. Fungsi "[" akan mengembalikan hanya baris-baris tersebut dengan 3 salinan baris 3 dan 2 salinan baris 7. Itu akan menjadi dasar untuk zeroinl()perhitungan tunggal dan kemudian koefisien akan dikembalikan bootsebagai hasil dari replikasi proses itu. Jumlah ulangan tersebut dikendalikan oleh parameter "R".

Karena hanya koefisien regresi yang dikembalikan dari statistickasus ini, bootfungsi akan mengembalikan koefisien yang terakumulasi ini sebagai nilai "t". Perbandingan lebih lanjut dapat dilakukan oleh fungsi-fungsi paket boot lain.

DWIN
sumber