R의 부트 스트랩은 실제로 어떻게 작동합니까?


22

나는 R에서 부트 패키지를 살펴 보았고, 사용법에 대한 많은 입문서를 찾았지만, "장면"에서 무슨 일이 일어나고 있는지 정확히 설명하는 것을 아직 찾지 못했다. 예를 들어,이 에서 가이드는 표준 회귀 계수를 부트 스트랩 회귀의 시작점으로 사용하는 방법을 보여 주지만 부트 스트랩 프로 시저가 실제로 부트 스트랩 회귀 계수를 도출하기 위해 수행하는 작업은 설명하지 않습니다. 반복되는 프로세스가 발생하는 것처럼 보이지만 진행 상황을 정확히 파악할 수는 없습니다.


3
내가 마지막으로 연 이후 오랜 시간이 걸리므로 질문에 대답할지 모르겠지만 부트 패키지는 특히 Davison, AC, & Hinkley, DV (1997)에 자세히 설명 된 방법을 기반으로합니다. 부트 스트랩 방법 및 응용 프로그램. 케임브리지 : Cambridge University Press. (참조는 부트 패키지 의 도움말 파일에도 인용되어 있습니다.)
Gala

답변:


34

부트 스트랩에는 여러 가지 "맛"또는 형태가 있습니다 (예 : 비모수 적, 파라 메트릭, 잔차 리샘플링 등). 이 예에서 부트 스트랩을 비모수 부트 스트랩 또는 사례 리샘플링이라고합니다 ( 회귀 응용 프로그램 은 여기 , 여기 , 여기여기 참조 ). 기본 아이디어는 표본을 모집단으로 취급 하고 교체하여 새로운 표본을 반복해서 추출하는 것 입니다 . 모든 원래 관측치는 새로운 표본으로 추출 될 가능성이 같습니다. 그런 다음 관심 통계를 계산하고 저장합니다 . 새로 추출한 표본을 사용한 평균, 중간 또는 회귀 계수 일 수 있습니다.. 이것은 번 반복된다 . 각 반복에서 원본 샘플의 일부 관측치가 여러 번 그려 지지만 일부 관측치가 전혀 그려지지 않을 수 있습니다. 회 반복 후 , 관심 통계의 부트 스트랩 추정치 가 저장됩니다 (예 : 이고 관심 통계량이 평균 인 경우 평균 부트 스트랩 추정치가 1000 개임). 마지막으로, 부트 스트랩 추정치 의 평균, 중앙값 및 표준 편차와 같은 요약 통계 가 계산됩니다.=1000

부트 스트랩은 종종 다음에 사용됩니다.

  1. 신뢰 구간 계산 (및 표준 오차 추정)
  2. 점 추정치의 편향 추정

부트 스트랩 샘플을 기반으로 신뢰 구간을 계산하는 방법 에는 여러 가지 가 있습니다 ( 이 백서 에서는 설명과 지침을 제공합니다). 95 % 신뢰 구간을 계산하는 매우 간단한 방법 중 하나는 부트 스트랩 샘플의 경험적 2.5 및 97.5 백분위 수를 계산하는 것입니다 (이 간격을 부트 스트랩 백분위 간격 이라고합니다 . 아래 코드 참조). 바이어스 보정 및 가속 부트 스트랩 (BCa)과 같은 더 나은 방법이 있으므로 간단한 백분위 간격 방법은 실제로 거의 사용되지 않습니다. BCa 구간은 부트 스트랩 분포의 바이어스 및 왜도에 대해 조정됩니다.

바이어스는 단순히 평균 사이의 차이로서 추정되고 저장된 부트 스트랩 샘플과 원래 추정치 (들).

웹 사이트에서 예제를 복제하지만 위에서 설명한 아이디어를 통합하는 자체 루프를 사용합니다 (교체와 함께 반복해서 그리기).

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

그리고 우리의 요약표는 다음과 같습니다.

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

몇 가지 설명

  • 부트 스트랩 추정치의 평균과 원래 추정치의 차이는 다음의 결과에서 "바이어스"라고합니다. boot
  • boot"std. error"호출 의 결과 는 부트 스트랩 추정치의 표준 편차입니다.

다음의 출력과 비교하십시오 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

"bias"열과 "std. error"를 자체 요약 테이블의 "sd"열과 비교하십시오. 우리의 95 % 신뢰 구간은 boot.ci백분위 수 방법 을 사용하여 계산 된 신뢰 구간과 매우 유사합니다 .


자세한 답변에 감사드립니다. 기본적으로 계수가 생성 된 2000 개의 계수 세트의 평균이라고 말하고 있습니까?
zgall1

4

'기본 아이디어는 표본을 모집단으로 취급하고 대체물로 반복해서 새로운 표본을 추출하는 것입니다.'-새로운 표본의 크기를 결정하는 방법은 무엇입니까?
Sinusx

1
@Sinusx 일반적으로 원본 샘플과 동일한 크기의 샘플을 그립니다. 중요한 아이디어는 교체와 함께 샘플을 그리는 것입니다 . 따라서 원래 샘플의 일부 값은 여러 번 그려지고 일부 값은 전혀 표시되지 않습니다.
COOLSerdash

6

boot"통계"매개 변수로 전달 된 기능에 중점을두고 구성 방법을 확인해야합니다.

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

"data"인수는 전체 데이터 프레임을 수신하지만 "i"인수는 "boot"에 의해 생성되고 1 : NROW (data)에서 가져온 행 인덱스 샘플을 수신합니다. 이 코드에서 알 수 있듯이 "i"는 네오 샘플을 생성하는 데 사용되며이 샘플은 전달 된 zeroinl결과의 선택된 부분 만 반환됩니다.

"i"가 {1,2,3,3,3,6,7,7,10}이라고 가정 해 봅시다. "["함수는 3 행 3 행과 7 행 2 사본을 가진 행만 반환합니다. 이는 단일 zeroinl()계산 의 기초가 되고 계수는 boot프로세스의 복제 결과로 반환됩니다 . 이러한 반복 횟수는 "R"매개 변수에 의해 제어됩니다.

statistic이 경우 회귀 계수 만 반환되므로이 boot함수는 이러한 누적 계수를 "t"값으로 반환합니다. 다른 부팅 패키지 기능으로 추가 비교를 수행 할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.