R과 함께 부트 스트랩을 사용하여 p- 값 계산


28

"boot"패키지를 사용하여 대략적인 양면 부트 스트랩 p- 값 을 계산 하지만 결과는 t.test를 사용하는 p- 값과 너무 멀리 떨어져 있습니다. R 코드에서 내가 뭘 잘못했는지 알 수 없습니다. 누군가 나에게 이것에 대한 힌트를 줄 수 있습니까?

time = c(14,18,11,13,18,17,21,9,16,17,14,15,
         12,12,14,13,6,18,14,16,10,7,15,10)
group=c(rep(1:2, each=12))
sleep = data.frame(time, group)

require(boot)
diff = function(d1,i){
    d = d1[i,]
    Mean= tapply(X=d$time, INDEX=d$group, mean)
    Diff = Mean[1]-Mean[2]
    Diff
}

set.seed(1234)
b3 = boot(data = sleep, statistic = diff, R = 5000, strata=sleep$group)

pvalue = mean(abs(b3$t) > abs(b3$t0))
pvalue 

양면 부트 스트랩 된 p- 값 (pvalue) = 0.4804이지만 t.test의 양면 p- 값은 0.04342입니다. 두 p- 값의 차이는 약 11 배입니다. 어떻게 이런 일이 일어날 수 있습니까?


b3 $ t0에는 어떻게 두 개의 항목이 있습니까?
시안

1
그것은 colname입니다!
Elvis

2
pt0mean(abs(b3$t0) < abs(b3$t-mean(b3$t)))

답변:


31

관찰 된 데이터의 경험적 분포 하에서 데이터를 생성하기 위해 부트 스트랩을 사용하고 있습니다. 이것은 두 평균의 차이에 대한 신뢰 구간을 제공하는 데 유용 할 수 있습니다.

> quantile(b3$t,c(0.025,0.975))
     2.5%     97.5% 
0.4166667 5.5833333 

p

diff2 = function(d1,i){
    d = d1; 
    d$group <- d$group[i];  # randomly re-assign groups
    Mean= tapply(X=d$time, INDEX=d$group, mean)
    Diff = Mean[1]-Mean[2]
    Diff
}

> set.seed(1234)
> b4 = boot(data = sleep, statistic = diff2, R = 5000)
> mean(abs(b4$t) > abs(b4$t0))
[1] 0.046

이 솔루션에서는 그룹 크기가 고정되어 있지 않으므로 초기 그룹 세트에서 부트 스트랩하여 그룹을 각 개인에게 임의로 재 할당합니다. 나에게는 합법적 인 것처럼 보이지만보다 고전적인 해결책은 각 그룹의 개인 수를 수정하는 것이므로 부트 스트랩 대신 그룹을 순화하십시오 (이는 일반적으로 그룹 크기가 미리 고정 된 실험 설계에 의해 동기 부여됩니다) ) :

> R <- 10000; d <- sleep
> b5 <- numeric(R); for(i in 1:R) { 
+    d$group <- sample(d$group, length(d$group)); 
+    b5[i] <- mean(d$time[d$group==1])-mean(d$time[d$group==2]); 
+ }
> mean(abs(b5) > 3)
[1] 0.0372

5
이것은 기술적으로 순열 테스트이며 부트 스트랩 p- 값이 아닙니다.
AdamO

@AdamO 나는이 답변에 제시된 것은 순열 테스트 (및 약간 수정 된 변형)라는 것에 동의합니다. 리샘플링 중에 그룹이 풀링되기 때문입니다. 반대로 부트 스트랩 기반 테스트에서는 동일한 그룹의 데이터 만 사용하여 각 그룹의 값을 샘플링해야합니다. stats.stackexchange.com/a/187630/28666 을 수행하는 방법을 설명하는 한 가지 답변이 있습니다 .
amoeba는

@amoeba 나는 당신이 연결하는 대답은 리샘플링과 관련된 한 부트 스트랩과 관련된 순열 테스트라고 생각합니다. 보고하는 것은 괜찮지 만보고하는 데 사용되는 두 가지 방법이 있습니다. 비모수 적 부트 스트랩은 기술적으로 귀무 가설 하에서 데이터를 생성 할 수 없습니다. 부트 스트랩 배포에서 p- 값이 생성되는 방법에 대한 내 대답참조하십시오 .
AdamO

@AdamO 나는 그것이 용어의 문제라고 생각하지만, 거기에 순열 된 것이 없기 때문에 링크 된 답변에 설명 된 절차를 "순열"테스트라고하는 방법을 모르겠습니다. 각 그룹의 재 샘플링 된 값은 그 데이터를 사용하여 생성됩니다 그룹 만.
amoeba는

1
엘비스, 귀하의 답변에서 첫 번째 코드는 순열 테스트라고 생각합니다. 다시 샘플링하면 그룹을 함께 모으십시오! 이것이 순열 테스트를 정의하는 것입니다.
amoeba는 18:41에 Reinstate Monica가

25

Elvis의 대답은 순열에 의존하지만 제 생각에 원래의 부트 스트랩 접근법에 어떤 문제가 있는지 명확하지 않습니다. 부트 스트랩에만 기반한 솔루션에 대해 설명하겠습니다.

원래 시뮬레이션의 중요한 문제는 부트 스트랩이 항상 테스트 통계의 TRUE 분포를 제공한다는 것입니다. 그러나 p- 값을 계산할 때 획득 한 테스트 통계 값을 UNDER H0 분포와 비교해야합니다. 즉 실제 분포가 아닙니다!

[명확하게하자. 예를 들어, 고전 t- 검정의 검정 통계량 T는 H0 하에서 고전적인 "중심"t- 분포 및 일반적으로 비 중심 분포를 갖는 것으로 알려져있다. 그러나, 모든 사람은 T의 관측 된 값이 전형적인 "중앙"t- 분포와 비교된다는 사실에 익숙하다. 즉, T와 비교하기 위해 진정한 [비 중심적] t- 분포를 얻으려고 시도하지 않는다.]

테스트 통계 평균 [1]-평균 [2]의 관측 값 "t0"이 부트 스트랩 된 샘플 "t"의 중심에 매우 가깝기 때문에 p- 값 0.4804가 너무 큽니다. 부트 스트랩 된 샘플 "t"는 평균 [1]-평균 [2]의 실제 분포를 에뮬레이션하기 때문에 자연스럽고 일반적으로 항상 (즉, H0의 유효성에 관계없이) 항상 그러합니다. 그러나 위에서 언급 한 바와 같이 Elvis가 언급 한 바와 같이, 실제로 필요한 것은 평균 [1]-평균 [2] UNDER H0의 분포입니다. 명백하다

1) H0 하에서 평균 [1]-평균 [2]의 분포는 0을 중심으로하고,

2) 형태는 HO의 유효성에 의존하지 않는다.

이 두 점은 H0 하에서 Mean [1] -Mean [2]의 분포가 부트 스트랩 된 샘플 "t"에 의해 에뮬레이션되어 0을 중심으로 중앙에 위치 할 수 있음을 의미합니다. R :

b3.under.H0 <- b3$t - mean(b3$t)

해당 p- 값은 다음과 같습니다.

mean(abs(b3.under.H0) > abs(b3$t0))

0.0232의 "아주 좋은"값을 제공합니다. :-)

위에서 언급 한 "2)"지점을 검정 통계량의 "변환 등분 산"이라고하며 일반적으로 유지할 필요는 없습니다. 즉, 일부 테스트 통계의 경우 부트 스트랩 된 "t"를 이동해도 HO에서 테스트 통계의 분포를 추정 할 수 없습니다! 이 토론과 특히 P. Dalgaard의 답변을 살펴보십시오. http://tolstoy.newcastle.edu.au/R/e6/help/09/04/11096.html

테스트 문제는 테스트 통계의 완벽한 대칭 분포를 산출하지만 테스트 통계의 부트 스트랩 분포가 치우친 경우 2면 p- 값을 얻는 데 약간의 문제가 있음을 명심하십시오. 다시, 위의 링크를 읽으십시오.

[그리고 마지막으로, 나는 당신의 상황에서 "순수한"순열 테스트를 사용할 것입니다; 즉 엘비스의 후반부 답변입니다. :-)]


17

부트 스트랩 CI 및 p- 값을 계산하는 방법에는 여러 가지가 있습니다. 주요 문제는 부트 스트랩이 귀무 가설 하에서 데이터를 생성하는 것이 불가능하다는 것입니다. 순열 테스트는 이에 대한 대안으로 실행 가능한 리샘플링입니다. 적절한 부트 스트랩을 사용하려면 검정 통계량의 샘플링 분포에 대한 몇 가지 가정을해야합니다.

β0=β^β^β0=β^β^

일반 부트 스트랩

한 가지 방법은있다 정상 부트 스트랩 은 부트 스트랩 분포의 평균과 표준 편차를 가지고 원래의 부트 스트랩 샘플에서 추정 지점에서 널 분배에서 정상 백분위 분포를 이동 및 사용하여 널 (null)에서 샘플링 분포를 계산 . 이것은 부트 스트랩 배포가 정상일 때 합리적인 접근 방법이며, 육안 검사는 일반적으로 여기에 충분합니다. 이 접근법을 사용한 결과는 일반적으로 이분산성 및 / 또는 유한 샘플 분산 가정에 대해 강력한 강력한 또는 샌드위치 기반의 오차 추정에 매우 가깝습니다. 정상적인 검정 통계량의 가정은 다음에 논의 할 부트 스트랩 검정에서 가정의 더 강력한 조건입니다.

백분위 수 부트 스트랩

F0) 추정치에서 부트 스트랩 분포를 빼고 을 사용하여 추정치보다 "더 극단적 인"DSNH의 백분율을 계산합니다.2×min(F0(β^),1F0(β^))

학생 화 된 부트 스트랩

값을 계산하는 가장 쉬운 부트 스트랩 솔루션 은 학생 화 된 부트 스트랩을 사용하는 것입니다. 각 부트 스트랩 반복마다 통계 표준 오류를 계산 하고 학생 통계를 리턴하십시오. 이것은 시스와 p- 값을 매우 쉽게 계산하는데 사용될 수있는 가설에 대한 부트 스트랩 된 학생 분포를 제공합니다. 이것은 또한 바이어스 교정 가속 부트 스트랩의 직관에 기초합니다. t- 분포는 해당 결과의 높은 분산으로 인해 가중치가 낮아지기 때문에 null 아래에서 훨씬 쉽게 이동합니다.p

프로그래밍 예

예를 들어 city부트 스트랩 패키지 의 데이터를 사용하겠습니다 . 부트 스트랩 신뢰 구간은 다음 코드로 계산됩니다.

ratio <- function(d, w) sum(d$x * w)/sum(d$u * w)
city.boot <- boot(city, ratio, R = 999, stype = "w", sim = "ordinary")
boot.ci(city.boot, conf = c(0.90, 0.95),
        type = c("norm", "basic", "perc", "bca"))

이 출력을 생성하십시오.

BOOTSTRAP CONFIDENCE INTERVAL CALCULATIONS
Based on 999 bootstrap replicates

CALL : 
boot.ci(boot.out = city.boot, conf = c(0.9, 0.95), type = c("norm", 
    "basic", "perc", "bca"))

Intervals : 
Level      Normal              Basic         
90%   ( 1.111,  1.837 )   ( 1.030,  1.750 )   
95%   ( 1.042,  1.906 )   ( 0.895,  1.790 )  

Level     Percentile            BCa          
90%   ( 1.291,  2.011 )   ( 1.292,  2.023 )   
95%   ( 1.251,  2.146 )   ( 1.255,  2.155 )  
Calculations and Intervals on Original Scale

일반 부트 스트랩의 95 % CI는 다음을 계산하여 얻습니다.

with(city.boot, 2*t0 - mean(t) + qnorm(c(0.025, 0.975)) %o% sqrt(var(t)[1,1]))

따라서 p- 값이 얻어진다 :

> with(city.boot, pnorm(abs((2*t0 - mean(t) - 1) / sqrt(var(t)[1,1])), lower.tail=F)*2)
[1] 0.0315

이는 95 % 일반 CI에 null 비율 값 1이 포함되지 않음에 동의합니다.

백분위 수 CI를 구합니다 (동점 방법에 따라 약간의 차이가 있음).

quantile(city.boot$t, c(0.025, 0.975))

백분위 수 부트 스트랩의 p- 값은 다음과 같습니다.

cvs <- quantile(city.boot$t0 - city.boot$t + 1, c(0.025, 0.975))
mean(city.boot$t > cvs[1] & city.boot$t < cvs[2])

값에서 1을 제외한다는 점에서 신뢰 구간과 일치하는 ap 0.035를 제공합니다. 백분위 수 CI의 너비가 일반 CI만큼 넓고 백분위 수 CI가 더 낮은 p- 값을 제공해야한다는 점에서 백분위 수 CI가 더 멀다는 것을 일반적으로 관찰 할 수는 없습니다. 백분위 수 방법에 대한 CI의 기본이되는 샘플링 분포의 모양이 비정규이기 때문입니다.


@AdamO의 매우 흥미로운 답변이지만 몇 가지 예를 제공 할 수 있습니까? R에서는 함수 boot.ci를 사용하고 인수 "type"을 사용하여 학생 화 된 CI를 선택할 수 있습니다 (BCA CI를 선택할 수도 있음). 그러나 p- 값을 어떻게 계산할 수 있습니까? 추정치 또는 검정 통계량을 사용하고 있습니까? 나는 비슷한 질문 을 받았으며 대답은 크게 감사하겠습니다.
케빈 자르 카

1
학생 화 된 부트 스트랩의 이점에 대한 명확한 설명을 보려면 +1하십시오.
eric_kernfeld

@KevinOunet 부트 패키지의 CI에서 p- 값을 복제하는 두 가지 예를 제시했습니다. 도움이 되나요?
AdamO

1
감사합니다 @AdamO, 정말 도움이됩니다! 학생 화 된 부트 스트랩에 대한 마지막 예를 제공 할 수 있습니까?
Kevin Zarca
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.