Fisher 정확한 테스트 (순열 테스트)의 힘에 대한 놀라운 동작


9

나는 소위 "정확한 테스트"또는 "순열 테스트"의 역설적 행동을 만났는데, 그 프로토 타입은 Fisher 테스트입니다. 여기있어.

400 명의 개인으로 구성된 두 그룹 (예 : 400 대 대조 대 400 건)과 두 가지 양식 (예 : 노출 / 노출)이있는 공변량이 있다고 상상해보십시오. 두 번째 그룹에는 노출 된 개인이 5 명뿐입니다. 피셔 테스트는 다음과 같이 진행됩니다.

> x <- matrix( c(400, 395, 0, 5) , ncol = 2)
> x
     [,1] [,2]
[1,]  400    0
[2,]  395    5
> fisher.test(x)

    Fisher's Exact Test for Count Data

data:  x
p-value = 0.06172
(...)

그러나 이제 두 번째 그룹 (사례)에는 질병이나 채용 센터와 같은 이질성이 있습니다. 100 개인으로 4 그룹으로 나눌 수 있습니다. 이와 같은 일이 발생할 수 있습니다.

> x <- matrix( c(400, 99, 99 , 99, 98, 0, 1, 1, 1, 2) , ncol = 2)
> x
     [,1] [,2]
[1,]  400    0
[2,]   99    1
[3,]   99    1
[4,]   99    1
[5,]   98    2
> fisher.test(x)

    Fisher's Exact Test for Count Data

data:  x 
p-value = 0.03319
alternative hypothesis: two.sided
(...)

이제 ...p<0.05

이것은 단지 예일뿐입니다. 그러나 처음 400 명의 개인에서 노출 빈도가 0이고 나머지 400 명의 개인에서 0.0125라고 가정하면 두 가지 분석 전략의 힘을 시뮬레이션 할 수 있습니다.

400 명의 개인으로 구성된 두 그룹으로 분석의 힘을 추정 할 수 있습니다.

> p1 <- replicate(1000, { n <- rbinom(1, 400, 0.0125); 
                          x <- matrix( c(400, 400 - n, 0, n), ncol = 2); 
                          fisher.test(x)$p.value} )
> mean(p1 < 0.05)
[1] 0.372

400 명으로 구성된 한 그룹과 100 명으로 구성된 4 개의 그룹으로 :

> p2 <- replicate(1000, { n <- rbinom(4, 100, 0.0125); 
                          x <- matrix( c(400, 100 - n, 0, n), ncol = 2);
                          fisher.test(x)$p.value} )
> mean(p2 < 0.05)
[1] 0.629

힘에는 상당한 차이가 있습니다. 사례를 4 개의 하위 그룹으로 나누면 하위 그룹 간의 분포 차이가없는 경우에도 더욱 강력한 테스트를 수행 할 수 있습니다. 물론 이러한 전력 증가는 제 1 종 오류율 증가로 인한 것이 아닙니다.

이 현상은 잘 알려져 있습니까? 그것은 첫 번째 전략에 전력이 부족하다는 것을 의미합니까? 부트 스트랩 된 p- 값이 더 나은 솔루션일까요? 모든 의견을 환영합니다.

포스트 스크립트

@MartijnWeterings가 지적했듯이,이 행동의 이유 중 상당 부분 (정확히 내 질문은 아닙니다!)은 견인 분석 전략의 진정한 유형 I 오류가 동일하지 않다는 사실에 있습니다. 그러나 이것이 모든 것을 설명하지는 않습니다. 나는 대 대한 ROC 곡선을 비교하려고했습니다 .H0:p0=p1=0.005H1:p0=0.05p1=0.0125

여기 내 코드가 있습니다.

B <- 1e5
p0 <- 0.005
p1 <- 0.0125

# simulation under H0 with p = p0 = 0.005 in all groups
# a = 2 groups 400:400, b = 5 groupe 400:100:100:100:100

p.H0.a <- replicate(B, { n <- rbinom( 2, c(400,400), p0);
                           x <- matrix( c( c(400,400) -n, n ), ncol = 2);
                          fisher.test(x)$p.value} )

p.H0.b <- replicate(B, { n <- rbinom( 5, c(400,rep(100,4)), p0);
                           x <- matrix( c( c(400,rep(100,4)) -n, n ), ncol = 2);
                          fisher.test(x)$p.value} )

# simulation under H1 with p0 = 0.005 (controls) and p1 = 0.0125 (cases)

p.H1.a <- replicate(B, { n <- rbinom( 2, c(400,400), c(p0,p1) );
                           x <- matrix( c( c(400,400) -n, n ), ncol = 2);
                          fisher.test(x)$p.value} )

p.H1.b <- replicate(B, { n <- rbinom( 5, c(400,rep(100,4)), c(p0,rep(p1,4)) );
                           x <- matrix( c( c(400,rep(100,4)) -n, n ), ncol = 2);
                          fisher.test(x)$p.value} )

# roc curve 

ROC <- function(p.H0, p.H1) {
  p.threshold <- seq(0, 1.001, length=501)
  alpha <- sapply(p.threshold, function(th) mean(p.H0 <= th) )
  power <- sapply(p.threshold, function(th) mean(p.H1 <= th) )
  list(x = alpha, y = power)
}

par(mfrow=c(1,2))
plot( ROC(p.H0.a, p.H1.a) , type="b", xlab = "alpha", ylab = "1-beta" , xlim=c(0,1), ylim=c(0,1), asp = 1)
lines( ROC(p.H0.b, p.H1.b) , col="red", type="b" )
abline(0,1)

plot( ROC(p.H0.a, p.H1.a) , type="b", xlab = "alpha", ylab = "1-beta" , xlim=c(0,.1) )
lines( ROC(p.H0.b, p.H1.b) , col="red", type="b" )
abline(0,1)

결과는 다음과 같습니다.

roc 곡선

따라서 우리는 동일한 실제 유형 I 오류 에서의 비교 가 여전히 (더 작은) 차이를 가져온다는 것을 알 수 있습니다.


이해가 안 돼요 사례 그룹을 분리하면 내부에서 일부 이질성이 의심 될 때 의미가있을 수 있습니다. "노출 된"양식을 나누는 것은 나에게는 의미가없는 것 같습니다.
Elvis

1
첫 번째 전략과 두 번째 전략의 차이점을 그래픽으로 스케치하면 그런 다음 확률이 특정 수준 이하인 편차 거리를 나타내는 가설 값과 표면에 대한 점이있는 5 축 (400100100100 및 100 그룹)의 좌표 시스템을 상상합니다. 첫 번째 전략으로이 표면은 원통이며, 두 번째 전략으로이 표면은 구입니다. 실제 값과 그 주변의 오류도 마찬가지입니다. 우리가 원하는 것은 가능한 한 겹치는 부분이 겹치는 것입니다.
Sextus Empiricus

1
나는 두 방법 사이에 차이점이있는 이유에 대해 조금 더 통찰력을 제공하기 위해 내 질문의 끝을 채택했습니다.
Sextus Empiricus

1
두 마진 중 하나만 고정되면 Barnard의 정확한 테스트가 사용됩니다. 그러나 아마도 같은 효과를 얻을 것입니다.
Sextus Empiricus

1
내가 만들고 싶었던 또 다른 흥미로운 메모는 p0> p1로 테스트 할 때 실제로 전력이 감소한다는 것입니다. 따라서 동일한 알파 수준에서 p1> p0 일 때 검정력이 증가합니다. 그러나 p1 <p0 일 때 전력이 감소합니다 (대각선 아래에 곡선이 생깁니다).
Sextus Empiricus

답변:


4

p- 값이 다른 이유

두 가지 효과가 있습니다.

  • 값의 불연속성 때문에 '가장 일어날 가능성이 높은'0 2 1 1 1 벡터를 선택합니다. 그러나 이것은 (불가능) 0 1.25 1.25 1.25 1.25와 다를 수 있습니다.χ2 값.

    결과적으로 벡터 5 0 0 0은 더 이상 극단적 인 경우로 계산되지 않습니다 (5 0 0 0은 더 작음 χ20 2 1 1 1보다). 이것은 이전의 경우였습니다. 두 단면 2 × 표 수가 제 또는 동일 극한으로서 제 2 그룹에있는 5 개의 노출 두 경우에 피셔 시험.

    이것이 p- 값이 거의 요인 2만큼 다른 이유입니다 (정확히 다음 지점이 아니기 때문에)

  • 똑같이 극단적 인 경우 5 0 0 0을 잃는 동안 0 2 1 1 1보다 더 극단적 인 경우 1 4 0 0 0을 얻습니다.

차이점은 χ2값 (또는 정확한 Fisher 테스트의 R 구현에서 사용되는 직접 계산 된 p- 값). 400의 그룹을 100의 4 개의 그룹으로 나누면 다른 경우보다 다른 경우가 '극단적'으로 간주됩니다. 5 0 0 0 0은 이제 0 2 1 1 1보다 '극단적'입니다. 그러나 1 4 0 0 0은 '극단적'입니다.


코드 예 :

# probability of distribution a and b exposures among 2 groups of 400
draw2 <- function(a,b) {
  choose(400,a)*choose(400,b)/choose(800,5)
}

# probability of distribution a, b, c, d and e exposures among 5 groups of resp 400, 100, 100, 100, 100
draw5 <- function(a,b,c,d,e) {
choose(400,a)*choose(100,b)*choose(100,c)*choose(100,d)*choose(100,e)/choose(800,5)
}

# looping all possible distributions of 5 exposers among 5 groups
# summing the probability when it's p-value is smaller or equal to the observed value 0 2 1 1 1
sumx <- 0
for (f in c(0:5)) {
  for(g in c(0:(5-f))) {
    for(h in c(0:(5-f-g))) {
      for(i in c(0:(5-f-g-h))) {
        j = 5-f-g-h-i
        if (draw5(f, g, h, i, j) <= draw5(0, 2, 1, 1, 1)) {
          sumx <- sumx + draw5(f, g, h, i, j)
        }
      }
    }
  } 
}
sumx  #output is 0.3318617

# the split up case (5 groups, 400 100 100 100 100) can be calculated manually
# as a sum of probabilities for cases 0 5 and 1 4 0 0 0 (0 5 includes all cases 1 a b c d with the sum of the latter four equal to 5)
fisher.test(matrix( c(400, 98, 99 , 99, 99, 0, 2, 1, 1, 1) , ncol = 2))[1]
draw2(0,5) + 4*draw(1,4,0,0,0)

# the original case of 2 groups (400 400) can be calculated manually
# as a sum of probabilities for the cases 0 5 and 5 0 
fisher.test(matrix( c(400, 395, 0, 5) , ncol = 2))[1]
draw2(0,5) + draw2(5,0)

마지막 비트의 출력

> fisher.test(matrix( c(400, 98, 99 , 99, 99, 0, 2, 1, 1, 1) , ncol = 2))[1]
$p.value
[1] 0.03318617

> draw2(0,5) + 4*draw(1,4,0,0,0)
[1] 0.03318617

> fisher.test(matrix( c(400, 395, 0, 5) , ncol = 2))[1]
$p.value
[1] 0.06171924

> draw2(0,5) + draw2(5,0)
[1] 0.06171924

그룹을 나눌 때 힘에 미치는 영향

  • p- 값의 '사용 가능한'수준에서 불연속적인 단계와 Fishers의 정확한 테스트의 보수성으로 인해 약간의 차이가 있습니다 (이 차이는 상당히 커질 수 있습니다).

  • 또한 Fisher 검정은 데이터를 기반으로 (알 수없는) 모형을 적합시킨 다음이 모형을 사용하여 p- 값을 계산합니다. 이 예의 모델은 정확히 5 명의 노출 된 개인이 있다는 것입니다. 다른 그룹에 대해 이항으로 데이터를 모델링하면 때때로 5 명보다 많거나 적은 개인을 얻게됩니다. 피셔 테스트를 여기에 적용하면 일부 오차가 고정되고 잔차가 고정 마진 테스트와 비교하여 더 작아집니다. 결과는 테스트가 너무 보수적이고 정확하지는 않다는 것입니다.

그룹을 무작위로 나누면 실험 유형 I 오류 확률에 미치는 영향이 그리 크지 않을 것으로 예상했습니다. 귀무 가설이 참이면 대략적으로α사례의 백분율이 유의 한 p- 값입니다. 이 예에서는 이미지가 보여 주듯이 차이가 큽니다. 주된 이유는 총 5 회의 노출에서 3 가지 수준의 절대 차이 (5-0, 4-1, 3-2, 2-3, 1-4, 0-5)와 3 개의 개별 p- 값 (400의 두 그룹의 경우).

가장 흥미로운 것은 거부 할 확률의 도표입니다 H0 만약 H0 사실이라면 Ha사실이다. 이 경우 알파 수준과 불연속성은 그다지 중요하지 않으며 (실제 거부율을 표시 함) 여전히 큰 차이가 있습니다.

이것이 가능한 모든 상황에 적용되는지 여부는 여전히 남아 있습니다.

전력 분석 (및 3 개 이미지)의 3 배 코드 조정 :

이항 법을 사용하여 5 명의 노출 된 개인의 경우로 제한

거부 할 유효 확률의 도표 H0선택된 알파의 기능으로. Fisher의 정확한 테스트는 p- 값이 정확하게 계산되지만 소수의 단계 (단계) 만 발생하므로 테스트는 선택한 알파 수준과 관련하여 너무 보수적 일 수 있습니다.

400-100-100-100-100 경우 (파란색)에 비해 400-400 경우 (빨간색)의 효과가 훨씬 더 강하다는 것을 알면 흥미 롭습니다. 따라서 우리는 실제로이 분할을 사용하여 전력을 증가시키고 H_0을 거부 할 가능성이 높아집니다. (우리는 제 1 종 오류 가능성을 높이는 데 크게 신경 쓰지 않지만 전력을 높이기 위해이 분할 지점이 항상 그렇게 강한 것은 아닙니다)

H0를 기각하는 다른 확률

노출 된 개인 5 명으로 제한하지 않는 이항 법 사용

이항을 사용하는 것처럼 400-400 (빨간색) 또는 400-100-100-100-100 (파란색) 두 경우 모두 정확한 p- 값을 제공하지 않습니다. Fisher 정확한 테스트에서는 고정 된 행과 열의 총계를 가정하지만 이항 모형을 사용하면 자유로울 수 있기 때문입니다. Fisher 검정은 잔차 항을 실제 오차 항보다 작게 만드는 행 및 열 합계에 '적합'합니다.

지나치게 보수적 인 Fisher의 정확한 테스트

증가 된 전력은 비용이 듭니까?

우리가 거부 할 확률을 비교하면 H0 사실 일 때 Ha (첫 번째 값이 낮고 두 번째 값이 높기를 바랍니다) 실제로는 Ha 유형 1 오류가 증가하는 비용없이 증가 할 수 있습니다.

H_0과 H_a 비교

# using binomial distribution for 400, 100, 100, 100, 100
# x uses separate cases
# y uses the sum of the 100 groups
p <- replicate(4000, { n <- rbinom(4, 100, 0.006125); m <- rbinom(1, 400, 0.006125); 
x <- matrix( c(400 - m, 100 - n, m, n), ncol = 2);
y <- matrix( c(400 - m, 400 - sum(n), m, sum(n)), ncol = 2);
c(sum(n,m),fisher.test(x)$p.value,fisher.test(y)$p.value)} )

# calculate hypothesis test using only tables with sum of 5 for the 1st row
ps <- c(1:1000)/1000
m1 <- sapply(ps,FUN = function(x) mean(p[2,p[1,]==5] < x))
m2 <- sapply(ps,FUN = function(x) mean(p[3,p[1,]==5] < x))

plot(ps,ps,type="l",
     xlab = "chosen alpha level",
     ylab = "p rejection")
lines(ps,m1,col=4)
lines(ps,m2,col=2)

title("due to concervative test p-value will be smaller\n leading to differences")

# using all samples also when the sum exposed individuals is not 5
ps <- c(1:1000)/1000
m1 <- sapply(ps,FUN = function(x) mean(p[2,] < x))
m2 <- sapply(ps,FUN = function(x) mean(p[3,] < x))

plot(ps,ps,type="l", 
     xlab = "chosen alpha level",
     ylab = "p rejection")
lines(ps,m1,col=4)
lines(ps,m2,col=2)

title("overly conservative, low effective p-values \n fitting marginals makes residuals smaller than real error")


#   
# Third graph comparing H_0 and H_a
#
# using binomial distribution for 400, 100, 100, 100, 100
# x uses separate cases
# y uses the sum of the 100 groups
offset <- 0.5
p <- replicate(10000, { n <- rbinom(4, 100, offset*0.0125); m <- rbinom(1, 400, (1-offset)*0.0125); 
x <- matrix( c(400 - m, 100 - n, m, n), ncol = 2);
y <- matrix( c(400 - m, 400 - sum(n), m, sum(n)), ncol = 2);
c(sum(n,m),fisher.test(x)$p.value,fisher.test(y)$p.value)} )

# calculate hypothesis test using only tables with sum of 5 for the 1st row
ps <- c(1:10000)/10000
m1 <- sapply(ps,FUN = function(x) mean(p[2,p[1,]==5] < x))
m2 <- sapply(ps,FUN = function(x) mean(p[3,p[1,]==5] < x))

offset <- 0.6
p <- replicate(10000, { n <- rbinom(4, 100, offset*0.0125); m <- rbinom(1, 400, (1-offset)*0.0125); 
x <- matrix( c(400 - m, 100 - n, m, n), ncol = 2);
y <- matrix( c(400 - m, 400 - sum(n), m, sum(n)), ncol = 2);
c(sum(n,m),fisher.test(x)$p.value,fisher.test(y)$p.value)} )

# calculate hypothesis test using only tables with sum of 5 for the 1st row
ps <- c(1:10000)/10000
m1a <- sapply(ps,FUN = function(x) mean(p[2,p[1,]==5] < x))
m2a <- sapply(ps,FUN = function(x) mean(p[3,p[1,]==5] < x))

plot(ps,ps,type="l",
     xlab = "p rejecting if H_0 true",
     ylab = "p rejecting if H_a true",log="xy")
points(m1,m1a,col=4)
points(m2,m2a,col=2)

legend(0.01,0.001,c("400-400","400-100-100-100-100"),pch=c(1,1),col=c(2,4))

title("comparing H_0:p=0.5 \n with H_a:p=0.6")

왜 힘에 영향을 미치는가

문제의 핵심은 "유의 한"것으로 선택된 결과 값의 차이에 있다고 생각합니다. 상황은 400, 100, 100, 100 및 100 크기의 5 개 그룹에서 5 명의 노출 된 개인이 그려지고 있습니다. '익스트림'으로 간주되는 다양한 선택이 가능합니다. 두 번째 전략을 진행할 때 (유효한 유형 I 오류가 동일하더라도) 전력이 증가합니다.

첫 번째 전략과 두 번째 전략의 차이점을 그래픽으로 스케치하면 그런 다음 확률이 특정 수준 이하인 편차 거리를 나타내는 가설 값과 표면에 대한 점이있는 5 축 (400100100100 및 100 그룹)의 좌표 시스템을 상상합니다. 첫 번째 전략으로이 표면은 원통이며, 두 번째 전략으로이 표면은 구입니다. 실제 값과 그 주변의 오류도 마찬가지입니다. 우리가 원하는 것은 가능한 한 겹치는 부분이 겹치는 것입니다.

차원이 다른 약간 다른 문제를 고려할 때 실제 그래픽을 만들 수 있습니다.

Bernoulli 프로세스를 테스트하려고한다고 상상해보십시오 H0:p=0.51000 번의 실험을함으로써 그런 다음 1000을 그룹으로 나누고 크기가 500 인 두 그룹으로 나눠서 동일한 전략을 수행 할 수 있습니다. X와 Y는 두 그룹의 카운트가 어떻게됩니까?

메커니즘의 예

이 도표는 단일 그룹 1000 대신 500 및 500 그룹이 어떻게 분포되어 있는지 보여줍니다.

표준 가설 검정은 X와 Y의 합이 531보다 크거나 469보다 작은 지 여부를 평가합니다 (95 % 알파 수준).

그러나 이것은 X와 Y의 불균등 한 분포를 포함합니다.

분포의 변화를 상상해보십시오 H0Ha. 그런 다음 가장자리의 영역은 그다지 중요하지 않으며 더 많은 원형 경계가 더 의미가 있습니다.

그러나 그룹의 분할을 무작위로 선택하지 않고 그룹에 의미가있을 때 이것은 (necesarilly) 사실이 아닙니다.


전력 추정을 위해 내 코드를 실행하여 0.0125를 0.02로 바꿉니다 (평균 8 건의 노출에 대한 제안과 일치) .400 대 400 분석은 80 %의 검정력을 가지며 5 그룹 분석은 검정력이 있습니다 90 %
Elvis

그러나 통계가 첫 번째 상황에서 덜 다른 값을 취할 수 있으며 도움이되지 않는다는 데 동의합니다. 그러나 이것은 문제를 설명하기에 충분하지 않습니다.이 전력 우월성은 0.05뿐만 아니라 모든 유형의 I 유형 오류에 대해 관찰 될 수 있습니다. 두 번째 전략으로 얻은 p- 값의 Quantile은 항상 첫 번째 전략으로 얻은 p- 값보다 낮습니다.
Elvis

나는 당신의 말에 동의한다고 생각합니다. 그러나 결론은 무엇입니까? 일부 권한을 얻기 위해 사례 그룹을 4 개의 하위 그룹으로 무작위로 분할하는 것이 좋습니다? 아니면 이것이 정당화 될 수 없다는 것에 동의하십니까?
Elvis

문제는 4 개의 하위 그룹으로 분할 된 사례를 사용한 테스트가 나쁜 속성을 가질 수 있다는 것이 아니라고 생각합니다. 우리는 모두 제 1 종 오류율이 제대로 작동해야한다는 사실에 동의했습니다. 문제는 400 건의 컨트롤 대 400 건의 테스트가 부족하다는 것입니다. 이것에 대한 "깨끗한"해결책이 있습니까? 부트 스트랩 p- 값이 도움이 될 수 있습니까?
Elvis

(내 질문이 명확하지 않은 것이 유감입니다!)
Elvis
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.