본문 바로가기

[R] 부트스트랩 신뢰 구간 (Bootstrap Confidence Intervals) 계산

R Programming/Analysis by Mandarim_ 2023. 11. 27.

전통적인 통계 검정은 주어진 데이터가 특정 분포를 독립적으로 따른다는 가정에서 시작된다.

하지만, 해당 가정이 어려운 경우는 항상 존재하며, Standard Error를 직접적으로 계산할 수 없는 상황이 존재한다.

(예를 들어, EM 알고리즘은 Standard Error를 제공하지 않는다.)

 

이러한 상황에서 우리는 주어진 데이터를 사용하여, 부트스트랩 (Bootstrap) 방법을 통해 Standard Error를 추론하고, 신뢰 구간을 계산할 수 있다.

 

일반적으로 주어진 데이터를 Population이라고 생각하고, 직접 1,000번 반복하여 주어진 데이터에서 해당 데이터 크기만큼의 무작위 복원 추출을 진행한다. 

1,000개의 데이터에서 얻어진 추정량의 분포를 사용하여, 경험적으로 Standard Error를 생성한다.

간단해보이나, 실제 데이터에서 매우 잘 작동한다.

 

부트스트랩은 어떠한 분포 가정 없이도 통계적 추론이 가능하다는 강점 (=비모수적 방법)이 있으나,

일반적으로 1,000번 이상의 반복 수행이 추천되기에, 계산이 오래 걸릴 수도 있다.

 

본 게시글은 유명한 boot 함수가 아닌, lapply를 통해 부트스트랩을 사용한다.

 

코드

1) 임의의 데이터 생성

# data generating
n <- 100
Y <- rnorm(n, mean=3, sd=4)

 

2) Bootstrap Sample인 Y를 이용하여, 1,000개의 평균 계산

# Bootstrap 코드
# lapply는 function(b){}의 코드를 B번 반복 수행하는 코드이고,
# 각 반복에 대한 결과를 list 형태로 반환한다.
B=1000
list_boot_est <- lapply(1:B, function(b){
  set.seed(b)
  b_sample <- sample(n, replace=TRUE)
  b_Y <- Y[b_sample]
  mean(b_Y)
})

 

3) Bootstrap 결과

# (주의) 추정치는 Bootstrap으로 계산하는게 아니다.
mean(Y)
[1] 3.236319

# Bootstrap Standard Error
sd(unlist(list_boot_est))
# [1] 0.3710082

# 95% 신로도 구간 계산
quantile(unlist(list_boot_est), c(0.025, 0.975))
#     2.5%    97.5% 
# 2.451384 3.902532

 

4) 결과비교

t-test의 주요 결과를 3)의 결과와 비교해 보면 거의 유사함을 알 수 있다.

> t.test(Y)

# 	 One Sample t-test
#
# data:  Y
# t = 8.6234, df = 99, p-value = 1.089e-13
# alternative hypothesis: true mean is not equal to 0
# 95 percent confidence interval:
#  2.491652 3.980986
# sample estimates:
# mean of x 
# 3.236319

 

반응형