Hành vi đáng ngạc nhiên về sức mạnh của thử nghiệm chính xác của Fisher (thử nghiệm hoán vị)


9

Tôi đã gặp một hành vi nghịch lý của cái gọi là "thử nghiệm chính xác" hoặc "thử nghiệm hoán vị", nguyên mẫu trong đó là thử nghiệm Fisher. Nó đây rồi

Hãy tưởng tượng bạn có hai nhóm 400 cá nhân (ví dụ 400 kiểm soát so với 400 trường hợp) và một hiệp phương sai với hai phương thức (ví dụ: tiếp xúc / không phơi sáng). Chỉ có 5 cá nhân tiếp xúc, tất cả trong nhóm thứ hai. Kiểm tra Fisher như thế này:

> 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
(...)

Nhưng bây giờ, có một số sự không đồng nhất trong nhóm thứ hai (các trường hợp), ví dụ như hình thức của bệnh hoặc trung tâm tuyển dụng. Nó có thể được chia thành 4 nhóm 100 cá nhân. Một cái gì đó như thế này có khả năng xảy ra:

> 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
(...)

Bây giờ, chúng tôi có ...p<0.05

Đây chỉ là một ví dụ. Nhưng chúng ta có thể mô phỏng sức mạnh của hai chiến lược phân tích, giả sử rằng trong 400 cá thể đầu tiên, tần suất tiếp xúc là 0 và đó là 0,0125 trong 400 cá thể còn lại.

Chúng tôi có thể ước tính sức mạnh của phân tích với hai nhóm 400 cá nhân:

> 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

Và với một nhóm 400 và 4 nhóm 100 cá nhân:

> 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

Có một sự khác biệt về sức mạnh. Việc phân chia các trường hợp trong 4 nhóm nhỏ cho phép thử mạnh mẽ hơn, ngay cả khi không có sự khác biệt về phân phối giữa các nhóm phụ này. Tất nhiên mức tăng sức mạnh này không được quy cho tỷ lệ lỗi loại I tăng.

Hiện tượng này có nổi tiếng không? Điều đó có nghĩa là chiến lược đầu tiên được cung cấp năng lượng? Giá trị p bootstrapping sẽ là một giải pháp tốt hơn? Tất cả các ý kiến ​​của bạn đều được chào đón.

Đoạn tái bút

Như @MartijnWeterings đã chỉ ra, một phần lớn lý do của hành vi này (không chính xác là câu hỏi của tôi!) Nằm trong thực tế các lỗi loại I thực sự của các chiến lược phân tích kéo không giống nhau. Tuy nhiên điều này dường như không giải thích mọi thứ. Tôi đã thử so sánh các đường cong ROC cho so với .H 1 : p 0 = 0,05 p 1 = 0,0125H0:p0=p1=0.005H1:p0=0.05p1=0.0125

Đây là mã của tôi.

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)

Đây là kết quả:

đường cong roc

Vì vậy, chúng ta thấy rằng một sự so sánh ở cùng đúng loại I lỗi vẫn dẫn đến sự khác biệt (thực sự nhỏ hơn nhiều).


Tôi không hiểu Việc tách nhóm các trường hợp có thể có ý nghĩa khi một số sự không đồng nhất bị nghi ngờ bên trong nó - giả sử, chúng đến từ 5 trung tâm khác nhau. Chia tách phương thức "phơi bày" dường như không có ý nghĩa với tôi.
Elvis

1
Nếu chúng ta phác họa sự khác biệt giữa chiến lược thứ nhất và thứ hai bằng đồ họa. Sau đó, tôi tưởng tượng một hệ tọa độ có 5 trục (đối với các nhóm 400 100 100 100 và 100) với một điểm cho các giá trị giả thuyết và bề mặt mô tả khoảng cách sai lệch mà xác suất nằm dưới một mức nhất định. Với chiến lược đầu tiên, bề mặt này là một hình trụ, với chiến lược thứ hai, bề mặt này là một hình cầu. Điều tương tự cũng đúng với các giá trị thực và một bề mặt xung quanh nó cho lỗi. Những gì chúng ta muốn là sự chồng chéo càng nhỏ càng tốt.
Sextus Empiricus

1
Tôi đã thông qua phần cuối của câu hỏi của tôi cung cấp một chút cái nhìn sâu sắc hơn về lý do tại sao có sự khác biệt giữa hai phương pháp.
Sextus Empiricus

1
Tôi tin rằng thử nghiệm chính xác của Barnard được sử dụng khi chỉ một trong hai lề được cố định. Nhưng có lẽ bạn sẽ nhận được các hiệu ứng tương tự.
Sextus Empiricus

1
một lưu ý thú vị khác mà tôi muốn thực hiện là công suất thực sự giảm khi bạn kiểm tra với p0> p1. Vì vậy, công suất tăng khi p1> p0, ở cùng mức alpha. Nhưng sức mạnh giảm khi p1 <p0 (tôi thậm chí có được một đường cong nằm dưới đường chéo).
Sextus Empiricus

Câu trả lời:


4

Tại sao giá trị p khác nhau

Có hai hiệu ứng đang diễn ra:

  • Do tính riêng biệt của các giá trị bạn chọn, vectơ 'rất có thể xảy ra' 0 2 1 1 1. Nhưng điều này sẽ khác với (không thể) 0 1.25 1.25 1.25 1.25, sẽ có giá trị nhỏ hơn .χ2

    Kết quả là vectơ 5 0 0 0 0 không còn được tính nữa vì ít nhất là trường hợp cực đoan (5 0 0 0 0 có nhỏ hơn hơn 0 2 1 1 1). Đây là trường hợp trước đây. Các hai đứng về phía test Fisher trên đếm bảng 2x2 cả hai trường hợp của 5 tiếp xúc là trong lần đầu tiên hoặc nhóm thứ hai là không kém khắc nghiệt.χ2

    Đây là lý do tại sao giá trị p khác nhau gần như là một yếu tố 2. (không chính xác vì điểm tiếp theo)

  • Trong khi bạn mất 5 0 0 0 0 như một trường hợp cực đoan như nhau, bạn có được 1 4 0 0 0 như một trường hợp cực đoan hơn 0 2 1 1 1.

Vì vậy, sự khác biệt nằm trong ranh giới của giá trị (hoặc giá trị p được tính trực tiếp như được sử dụng khi triển khai R của thử nghiệm Fisher chính xác). Nếu bạn chia nhóm 400 thành 4 nhóm 100 thì các trường hợp khác nhau sẽ được coi là "cực đoan" hơn hoặc ít hơn so với nhóm khác. 5 0 0 0 0 bây giờ ít 'cực đoan' hơn 0 2 1 1 1. Nhưng 1 4 0 0 0 là 'cực đoan' hơn.χ2


mã ví dụ:

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

đầu ra của bit cuối cùng đó

> 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

Làm thế nào nó ảnh hưởng sức mạnh khi chia nhóm

  • Có một số khác biệt do các bước riêng biệt trong các mức 'có sẵn' của giá trị p và tính bảo thủ của thử nghiệm chính xác của Fishers (và những khác biệt này có thể trở nên khá lớn).

  • ngoài ra, phép thử Fisher phù hợp với mô hình (chưa biết) dựa trên dữ liệu và sau đó sử dụng mô hình này để tính giá trị p. Mô hình trong ví dụ là có chính xác 5 cá nhân tiếp xúc. Nếu bạn lập mô hình dữ liệu với nhị thức cho các nhóm khác nhau thì đôi khi bạn sẽ nhận được nhiều hơn hoặc ít hơn 5 cá nhân. Khi bạn áp dụng thử nghiệm đánh cá cho điều này, thì một số lỗi sẽ được trang bị và phần dư sẽ nhỏ hơn so với các thử nghiệm có biên cố định. Kết quả là bài kiểm tra quá bảo thủ, không chính xác.

Tôi đã dự đoán rằng hiệu ứng trên xác suất lỗi loại thử nghiệm I sẽ không lớn nếu bạn chia ngẫu nhiên các nhóm. Nếu giả thuyết null là đúng thì bạn sẽ gặp trong khoảng phần trăm các trường hợp có giá trị p đáng kể. Trong ví dụ này, sự khác biệt là lớn như hình ảnh hiển thị. Lý do chính là, với tổng số 5 lần phơi sáng, chỉ có ba mức chênh lệch tuyệt đối (5-0, 4-1, 3-2, 2-3, 1-4, 0-5) và chỉ có ba mức p- rời rạc các giá trị (trong trường hợp hai nhóm 400).α

vị nhất là âm mưu xác suất từ ​​chối nếu là đúng và nếu là đúng. Trong trường hợp này, mức độ alpha và sự không thống nhất không quan trọng lắm (chúng tôi biểu thị tỷ lệ loại bỏ hiệu quả) và chúng tôi vẫn thấy một sự khác biệt lớn.H 0 H aH0H0Ha

Câu hỏi vẫn còn cho dù điều này giữ cho tất cả các tình huống có thể.

3 lần điều chỉnh mã phân tích sức mạnh của bạn (và 3 hình ảnh):

sử dụng nhị thức hạn chế cho trường hợp 5 cá nhân bị phơi nhiễm

xác suất hiệu quả để từ chối là chức năng của alpha được chọn. Thử nghiệm chính xác của Fisher được biết là giá trị p được tính toán chính xác nhưng chỉ có một vài cấp độ (các bước) xảy ra nên thường thử nghiệm có thể quá bảo thủ so với mức độ alpha đã chọn.H0

Thật thú vị khi thấy rằng hiệu ứng mạnh hơn nhiều đối với trường hợp 400-400 (màu đỏ) so với trường hợp 400-100-100-100-100 (màu xanh). Do đó, chúng tôi thực sự có thể sử dụng sự phân tách này để tăng sức mạnh, khiến nó có khả năng từ chối H_0 hơn. (mặc dù chúng tôi không quan tâm lắm đến việc làm cho lỗi loại I có nhiều khả năng xảy ra, do đó, điểm thực hiện việc phân tách này để tăng sức mạnh có thể không phải lúc nào cũng mạnh mẽ như vậy)

xác suất khác nhau để từ chối H0

sử dụng nhị thức không giới hạn ở 5 cá nhân bị phơi nhiễm

Nếu chúng tôi sử dụng nhị thức như bạn đã làm thì cả hai trường hợp 400-400 (đỏ) hoặc 400-100-100-100 (xanh dương) đều cho giá trị p chính xác. Điều này là do thử nghiệm chính xác của Fisher giả định tổng số hàng và cột cố định, nhưng mô hình nhị thức cho phép các giá trị này là miễn phí. Thử nghiệm Fisher sẽ 'khớp' tổng số hàng và cột làm cho số hạng còn lại nhỏ hơn thuật ngữ lỗi thực sự.

kiểm tra chính xác quá mức bảo thủ của Fisher

Liệu sức mạnh gia tăng có phải trả giá?

Nếu chúng ta so sánh xác suất từ ​​chối khi là đúng và khi là đúng (chúng ta muốn giá trị đầu tiên thấp và giá trị thứ hai cao) thì chúng ta thấy rằng sức mạnh (từ chối khi là đúng) có thể tăng lên mà không cần chi phí mà lỗi loại I tăng.H a H aH0HaHa

so sánh H_0 và 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")

Tại sao nó ảnh hưởng đến sức mạnh

Tôi tin rằng mấu chốt của vấn đề nằm ở sự khác biệt của các giá trị kết quả được chọn là "đáng kể". Tình hình là năm cá nhân bị phơi bày được rút ra từ 5 nhóm kích thước 400, 100, 100, 100 và 100. Các lựa chọn khác nhau có thể được thực hiện được coi là "cực đoan". rõ ràng sức mạnh tăng lên (ngay cả khi lỗi loại I hiệu quả là như nhau) khi chúng ta đi đến chiến lược thứ hai.

Nếu chúng ta phác họa sự khác biệt giữa chiến lược thứ nhất và thứ hai bằng đồ họa. Sau đó, tôi tưởng tượng một hệ tọa độ có 5 trục (cho các nhóm 400 100 100 100 và 100) với một điểm cho các giá trị giả thuyết và bề mặt mô tả khoảng cách sai lệch mà xác suất nằm dưới một mức nhất định. Với chiến lược đầu tiên, bề mặt này là một hình trụ, với chiến lược thứ hai, bề mặt này là một hình cầu. Điều tương tự cũng đúng với các giá trị thực và một bề mặt xung quanh nó cho lỗi. Những gì chúng ta muốn là sự chồng chéo càng nhỏ càng tốt.

Chúng ta có thể tạo ra một đồ họa thực tế khi chúng ta xem xét một vấn đề hơi khác (với chiều hướng thấp hơn).

Hãy tưởng tượng chúng tôi muốn kiểm tra quy trình Bernoulli bằng cách thực hiện 1000 thử nghiệm. Sau đó, chúng ta có thể thực hiện cùng một chiến lược bằng cách chia 1000 thành các nhóm thành hai nhóm có kích thước 500. Nó trông như thế nào (gọi X và Y là số đếm trong cả hai nhóm)?H0:p=0.5

ví dụ về cơ chế

Cốt truyện cho thấy cách các nhóm 500 và 500 (thay vì một nhóm 1000) được phân phối.

Thử nghiệm giả thuyết tiêu chuẩn sẽ đánh giá (đối với mức độ 95% alpha) cho dù tổng của X và Y lớn hơn 531 hay nhỏ hơn 469.

Nhưng điều này bao gồm phân phối X và Y.

Hãy tưởng tượng một sự thay đổi của phân phối từ sang . Sau đó, các khu vực trong các cạnh không quan trọng lắm, và một ranh giới tròn hơn sẽ có ý nghĩa hơn.H aH0Ha

Tuy nhiên, điều này không đúng (necesarilly) khi chúng ta không chọn cách chia nhóm ngẫu nhiên và khi có thể có ý nghĩa với các nhóm.


Hãy thử chạy mã của tôi để ước tính công suất, chỉ cần thay thế 0,0125 bằng 0,02 (để phù hợp với đề xuất của bạn có trung bình 8 trường hợp tiếp xúc): phân tích 400 so với 400 có sức mạnh 80% và phân tích với 5 nhóm có sức mạnh 90%.
Elvis

Tuy nhiên, tôi đồng ý rằng thống kê có thể lấy các giá trị khác nhau ít hơn trong tình huống đầu tiên và điều đó không giúp ích gì. Tuy nhiên, điều này không đủ để giải thích vấn đề: sự vượt trội về sức mạnh này có thể được quan sát đối với tất cả các mức độ lỗi loại I, không chỉ 0,05. Các lượng tử của các giá trị p thu được từ chiến lược thứ hai luôn thấp hơn các giá trị thu được từ chiến lược thứ nhất.
Elvis

Tôi nghĩ rằng tôi đồng ý với những gì bạn nói. Nhưng kết luận là gì? Bạn có đề nghị chia ngẫu nhiên nhóm các trường hợp thành 4 nhóm nhỏ, để đạt được sức mạnh không? Hay bạn đồng ý với tôi rằng điều này không thể được biện minh?
Elvis

Tôi nghĩ vấn đề không phải là thử nghiệm với các trường hợp được chia thành 4 nhóm nhỏ có thể có các thuộc tính xấu - cả hai chúng tôi đều đồng ý rằng thực tế là tỷ lệ lỗi loại I của nó sẽ hoạt động tốt. Tôi nghĩ rằng vấn đề là thử nghiệm với 400 điều khiển so với 400 trường hợp bị thiếu sức mạnh. Có giải pháp "sạch" nào cho việc này không? Bootstrap p-value có thể giúp gì không?
Elvis

(Tôi xin lỗi vì câu hỏi của tôi không hoàn toàn rõ ràng!)
Elvis
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.