리샘플링 된 데이터 세트에 대한 가설 테스트가 널을 너무 자주 거부하는 이유는 무엇입니까?


10

tl; dr : null에서 생성 된 데이터 세트로 시작하여 대체 사례를 리샘플링하고 각 리 샘플링 된 데이터 세트에 대해 가설 테스트를 수행했습니다. 이 가설 검정은 시간의 5 %를 초과하여 널을 거부합니다.

아래의 매우 간단한 시뮬레이션에서는 데이터 세트를 생성 XN(0,1)⨿YN(0,1)하고 간단한 OLS 모델을 각각 적합시킵니다. 그런 다음 각 데이터 세트에 대해 원래 데이터 세트의 행을 대체로 리샘플링하여 1000 개의 새 데이터 세트를 생성합니다 (Davison & Hinkley의 고전 텍스트에 선형 회귀에 적합하다고 설명 된 알고리즘). 각각에 대해 동일한 OLS 모델에 적합합니다. 궁극적으로 부트 스트랩 샘플 내 가설 검정의 약 16 %가 null을 거부하는 반면, 원래 데이터 세트에서와 같이 5 %를 얻습니다.

나는 그것이 비정상적 인 연관을 일으키는 반복적 인 관측과 관련이 있다고 생각했기 때문에 비교를 위해 아래 코드에서 두 가지 다른 접근법을 시도했습니다 (주석 처리). 방법 2에서는 수정 X한 다음 원래 데이터 세트의 OLS 모델에서 재 샘플링 된 잔차로 를 대체 Y합니다. 방법 3에서는 대체없이 임의의 하위 샘플을 그립니다. 이러한 대안은 모두 작동합니다. 즉, 가설 검정은 시간의 null 5 %를 거부합니다.

내 질문 : 반복적 인 관찰이 범인이라는 것이 옳습니까? 그렇다면, 이것이 부트 스트랩에 대한 표준 접근법이라는 것을 감안할 때, 표준 부트 스트랩 이론을 정확히 위반하는 위치는 무엇입니까?

업데이트 # 1 : 더 많은 시뮬레이션

Y

# note: simulation takes 5-10 min on my laptop; can reduce boot.reps
#  and n.sims.run if wanted
# set the number of cores: can change this to match your machine
library(doParallel)
registerDoParallel(cores=8)
boot.reps = 1000
n.sims.run = 1000

for ( j in 1:n.sims.run ) {

  # make initial dataset from which to bootstrap
  # generate under null
  d = data.frame( X1 = rnorm( n = 1000 ), Y1 = rnorm( n = 1000 ) )

  # fit OLS to original data
  mod.orig = lm( Y1 ~ X1, data = d )
  bhat = coef( mod.orig )[["X1"]]
  se = coef(summary(mod.orig))["X1",2]
  rej = coef(summary(mod.orig))["X1",4] < 0.05

  # run all bootstrap iterates
  parallel.time = system.time( {
    r = foreach( icount( boot.reps ), .combine=rbind ) %dopar% {

      # Algorithm 6.2: Resample entire cases - FAILS
      # residuals of this model are repeated, so not normal?
      ids = sample( 1:nrow(d), replace=TRUE )
      b = d[ ids, ]

      # # Method 2: Resample just the residuals themselves - WORKS
      # b = data.frame( X1 = d$X1, Y1 = sample(mod.orig$residuals, replace = TRUE) )

      # # Method 3: Subsampling without replacement - WORKS
      # ids = sample( 1:nrow(d), size = 500, replace=FALSE )
      # b = d[ ids, ]

      # save stats from bootstrap sample
      mod = lm( Y1 ~ X1, data = b ) 
      data.frame( bhat = coef( mod )[["X1"]],
                  se = coef(summary(mod))["X1",2],
                  rej = coef(summary(mod))["X1",4] < 0.05 )

    }
  } )[3]


  ###### Results for This Simulation Rep #####
  r = data.frame(r)
  names(r) = c( "bhat.bt", "se.bt", "rej.bt" )

  # return results of each bootstrap iterate
  new.rows = data.frame( bt.iterate = 1:boot.reps,
                         bhat.bt = r$bhat.bt,
                         se.bt = r$se.bt,
                         rej.bt = r$rej.bt )
  # along with results from original sample
  new.rows$bhat = bhat
  new.rows$se = se
  new.rows$rej = rej

  # add row to output file
  if ( j == 1 ) res = new.rows
  else res = rbind( res, new.rows )
  # res should have boot.reps rows per "j" in the for-loop

  # simulation rep counter
  d$sim.rep = j

}  # end loop over j simulation reps



##### Analyze results #####

# dataset with only one row per simulation
s = res[ res$bt.iterate == 1, ]

# prob of rejecting within each resample
# should be 0.05
mean(res$rej.bt); mean(s$rej)

업데이트 # 2 : 답변

H0


1
표준 부트 스트랩에서는 관련 p 값이 아닌 X1 계수의 부트 스트랩 분포 만 고려합니다. 따라서 부트 스트랩의 문제는 아닙니다. 그럼에도 불구하고 당신의 관찰은 흥미롭고 직관적이지 않습니다.
Michael M

1
@MichaelM, 맞습니다. 그러나 리 샘플에있는 데이터의 공동 CDF는 n으로 수렴해야하고 부트 스트랩 수는 원래 데이터를 생성 한 실제 CDF로 반복되므로 p- 값도 다를 것으로 기대하지는 않습니다.
하프 패스

권리. 나는 당신이 말한 것처럼 비 독립적 인 관측이 너무 낙관적 인 표준 오차를 산출함으로써 효과가 있다고 확신합니다. 시뮬레이션에서, 이것은 정상적인 선형 모델의 유일하게 위반 된 것으로 보입니다. 어쩌면 해당 분산 수축 인자를 도출 할 수도 있습니다.
Michael M

2
xidsids <- unique(ids)

2
@whuber. 내가 참조. 그리고 그것은 반복 된 관측에도 불구하고 대체 작업으로 리샘플링 잔차를 재 샘플링하는 이유를 설명 할 것입니다. 해당 모델의 잔차는 다시 X와 독립적입니다.
하프 패스

답변:


5

널을 재 샘플링하면 회귀 계수의 예상 값이 0입니다. 관측 된 데이터 집합을 리샘플링 할 때 예상 값은 해당 데이터의 관측 계수입니다. 관측 된 데이터를 리샘플링 할 때 P <= 0.05 인 경우 유형 I 오류가 아닙니다. 실제로 P> 0.05 인 경우 유형 II 오류입니다.

abs (b)와 mean (P) 사이의 상관 관계를 계산하면 약간의 직관을 얻을 수 있습니다. 다음은 시뮬레이션 세트에서 b와 "type I"오류 간의 상관 관계를 계산하고 수행 한 작업을 복제하는 간단한 코드입니다.

boot.reps = 1000
n.sims.run = 10
n <- 1000
b <- matrix(NA, nrow=boot.reps, ncol=n.sims.run)
p <- matrix(NA, nrow=boot.reps, ncol=n.sims.run)
for(sim_j in 1:n.sims.run){
  x <- rnorm(n)
  y <- rnorm(n)
  inc <- 1:n
  for(boot_i in 1:boot.reps){
    fit <- lm(y[inc] ~ x[inc])
    b[boot_i, sim_j] <- abs(coefficients(summary(fit))['x[inc]', 'Estimate'])
    p[boot_i, sim_j] <- coefficients(summary(fit))['x[inc]', 'Pr(>|t|)']
    inc <- sample(1:n, replace=TRUE)
  }
}
# note this is not really a type I error but whatever
type1 <- apply(p, 2, function(x) sum(x <= 0.05))/boot.reps
# correlation between b and "type I"
cor(b[1, ], type1)

grand_chat으로 답을 업데이트 하는 것은 P <= 0.05의 빈도가> 0.05 인 이유가 아닙니다. 대답은 매우 간단하고 위에서 말한 것입니다. 각 재 샘플의 평균 예상 값은 원래 관찰 된 평균입니다. 이것은 부트 스트랩의 전체 기반으로, 가설 검정이 아닌 관측 된 평균에 대한 표준 오류 / 신뢰 한계를 생성하도록 개발되었습니다. 기대 값이 0이 아니기 때문에 물론 "유형 I 오류"는 알파보다 큽니다. 그리고 이것이 계수의 크기 (0에서 얼마나 멀어짐)와 알파에서 "유형 I 오류"의 편차의 크기 사이에 상관 관계가있는 이유입니다.


H0:β=β^H0:β=0

H 0 : β = 0 H 0 : β = 0H0:β=βˆ 는 동등성을 테스트하고 다른 연구 설계 접근법이 필요합니다. 은 중요한 차이점이 관측 된 차이가 확실하지 않은지, 예측이 올바른지 확인하려는 경우의 동등성을 확인하는 데 사용됩니다. 불행히도 종종 하나의 크기가 모두에게 맞는 것으로 보이지만 상황의 위험에 달려 있습니다. 사용하기 전형적인 더는 지식의 정확성을 테스트까지 변경하는 의미를 수있는 알려진 때 당신이 다음 대안 가설을 정의하기에 충분 모를 때 가자미 필터링하는 초기 단계의 연구. H0:β=0H0:β=0
ReneBt

2

원래 정규 표본에서 교체하여 표본을 추출하면 결과 부트 스트랩 표본 이 정상이 아닙니다 . 부트 스트랩 샘플의 공동 분포는 중복 레코드를 포함 할 가능성이 매우 심하게 혼합 된 분포를 따르지만 정규 분포에서 iid 샘플을 가져올 때 중복 값은 확률이 0입니다.

간단한 예로, 원래 표본이 일 변량 정규 분포의 관측치 두 개인 경우 교체가 포함 된 부트 스트랩 표본의 절반은 원본 표본으로 구성되며 절반은 복제 된 원래 값 중 하나로 구성됩니다. 부트 스트랩 샘플의 샘플 분산은 평균보다 원본의 평균보다 작을 것입니다. 실제로는 원본의 절반이됩니다.

주된 결과는 일반적인 이론을 기반으로하는 추론이 부트 스트랩 샘플에 적용될 때 잘못된 반환한다는 것 입니다. 부트 스트랩 샘플은 중복이 존재하기 때문에 정규 이론에서 예상되는 것보다 분모가 더 작은 통계량 을 생성하기 때문에 특히 정상 이론은 반 보수적 결정 규칙을 산출합니다 . 결과적으로 일반 이론 가설 검정은 귀무 가설을 예상보다 많이 거부합니다.tpt


그러나 이것이 사실이라면 교체로 잔차를 리샘플링 할 때 정확히 같은 문제가 아닐까요? 그러나 실제로이 방법은 공칭 확률로 거부됩니다.
하프 패스

또한 n = 1000 인 t- 검정은 비정규 데이터에 문제가 없어야합니다.
하프 패스

0

@JWalker의 답변에 전적으로 동의합니다.

이 문제의 또 다른 측면이 있습니다. 그것은 당신의 리샘플링 과정에 있습니다. 회귀 계수는 0으로 가정 X하고 Y독립적 이기 때문에 중심에있을 것으로 예상합니다 . 그러나 리샘플링에서는

ids = sample( 1:nrow(d), replace=TRUE )
  b = d[ ids, ]

샘플링 X하고 Y함께 있기 때문에 상관 관계를 만듭니다 . 예를 들어, 데이터 세트의 첫 번째 행 말하는 d것이다 (x1, y1)리샘플링 세트에서, P(Y = y1|X = x1) = 1만약 동안 XY무관 한, P(Y|X = x1)정규 분포를 따른다.

이 문제를 해결하는 또 다른 방법은

b = data.frame( X1 = rnorm( n = 1000 ), Y1 = rnorm( n = 1000 ) )

dX와 Y를 서로 독립적으로 만들기 위해을 생성하는 데 사용하는 것과 동일한 코드 .

같은 이유가 왜 잔류 리샘플링으로 작동하는지 설명합니다 ( X새로운 것과 독립적 이기 때문 Y).


잠시 동안, 나는 또한 재 표본 관측치가 독립적이지 않을 수도 있다고 생각했지만, 그것에 대해 더 많이 생각하면 실제로는 그렇지 않다고 생각합니다. stats.stackexchange.com/questions/339237/…
half -pass

위에서 설명한 문제는 귀하의 게시물과 다릅니다. 당신이 언급 한 것은의 독립성입니다 x's. 내가 언급 한 것은 Xs와 Ys 의 상관 관계 입니다.
Tianxia Zhou

-1

여기서 가장 큰 문제는 모델이 잡음을 맞추기 때문에 모델 결과가 의심스럽고 매우 불안정하다는 것입니다. 문자 그대로의 의미에서. Y1은 샘플 데이터 생성 방법으로 인해 종속 변수가 아닙니다.


의견에 대한 응답으로 편집하고, 내 생각을 설명하기 위해 다시 시도해 보자.

OLS의 일반적인 목적은 데이터의 기본 관계를 발견하고 수량화하는 것입니다. 실제 데이터를 사용하면 일반적으로 정확히 알지 못합니다.

그러나 이것은 인공 테스트 상황입니다. 우리는 정확한 데이터 생성 메커니즘을 알고 있습니다. OP에 의해 게시 된 코드에 있습니다.

X1 = rnorm (n = 1000), Y1 = rnorm (n = 1000)

익숙한 형태의 OLS 회귀로 표현하면

Y1 = 차단 + Beta1 * X1 + Y1
이되는 오류
= 평균 (X1) + 0 (X1) + 오류

내 생각에 이것은 선형 FORM으로 표현 된 모델이지만 기울기가 없기 때문에 실제로 선형 관계 / 모델이 아닙니다. 베타 1 = 0.000000.

1000 개의 랜덤 데이터 포인트를 생성 할 때 산점도는 클래식 샷건 원형 스프레이처럼 보입니다. 생성 된 1000 개의 랜덤 포인트의 특정 샘플에서 X1과 Y1 사이에 약간의 상관 관계가있을 수 있지만, 그렇다면 랜덤 발생입니다. 만약 OLS가 상관 관계를 찾으면, 즉이 두 변수 사이에 아무런 관계가 없다는 것을 확실히 알고 있기 때문에 기울기가 없다는 귀무 가설을 기각한다면, OLS는 문자 그대로 오류 구성 요소에서 패턴을 찾았습니다. 나는 "잡음 맞추기"와 "스퓨리어스"로 특징 지었다.

또한 OLS의 기본 가정 / 요건 중 하나는 "+/-)"선형 회귀 모델이 "모수의 선형"이라는 것입니다. 데이터를 감안할 때, 우리는 그 가정을 만족시키지 못하기 때문에 중요성에 대한 기본 테스트 통계가 정확하지 않습니다 선형성 가정의 위반이 부트 스트랩의 비 직관적 결과의 직접적인 원인이라고 생각합니다.

이 문제를 처음 읽었을 때 OP가 null [가설]에서 테스트하려고한다는 점에서 문제가되지 않았습니다.

그러나 데이터 세트가 다음과 같이 생성되면 직관적이지 않은 동일한 결과가 발생합니다.

X1 = rnorm (n = 1000), Y1 = X1 * .4 + rnorm (n = 1000)?


4
Y1Y1

(-1) @whuber가 준 같은 이유로.
하프 패스

1
편집의 마지막 질문에 대한 답변 : 그렇습니다. 시뮬레이션으로 직접 시도하십시오. (그러나 널이 무엇인지 그리고 실제 상황이 무엇인지 고려해야하기 때문에 해석에주의해야합니다.)
whuber
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.