Sử dụng bootstrap dưới H0 để thực hiện kiểm tra sự khác biệt của hai phương tiện: thay thế trong các nhóm hoặc trong mẫu gộp


18

Giả sử rằng tôi có dữ liệu với hai nhóm độc lập:

g1.lengths <- c (112.64, 97.10, 84.18, 106.96, 98.42, 101.66)

g2.lengths <- c (84.44, 82.10, 83.26, 81.02, 81.86, 86.80, 
                     85.84, 97.08, 79.64, 83.32, 91.04, 85.92,
                     73.52, 85.58, 97.70, 89.72, 88.92, 103.72,
                     105.02, 99.48, 89.50, 81.74)

group = rep (c ("g1", "g2"), c (length (g1.lengths), length (g2.lengths)))

lengths = data.frame( lengths = c(g1.lengths, g2.lengths), group)

Rõ ràng là kích thước mẫu trên mỗi nhóm bị sai lệch trong đó g1 có 6 quan sát và g2 có 22 . ANOVA truyền thống gợi ý rằng các nhóm có các phương tiện khác nhau khi giá trị tới hạn được đặt thành 0,05 (giá trị p là 0,0044 ).

summary (aov (lengths~group, data = lengths))  

Cho rằng mục đích của tôi là so sánh sự khác biệt trung bình, dữ liệu được lấy mẫu nhỏ và không cân bằng như vậy có thể cho kết quả không phù hợp với phương pháp truyền thống. Do đó, tôi muốn thực hiện kiểm tra hoán vị và bootstrap.

KIỂM TRA XÁC NHẬN

Giả thuyết Null (H0) nói rằng phương tiện của nhóm là như nhau. Giả định này trong thử nghiệm hoán vị được chứng minh bằng cách gộp các nhóm thành một mẫu. Điều này đảm bảo rằng các mẫu cho hai nhóm được rút ra từ phân phối giống hệt nhau. Bằng cách lấy mẫu lặp lại (hoặc chính xác hơn - chia sẻ lại) từ dữ liệu được gộp, các quan sát được phân bổ lại (xáo trộn) cho các mẫu theo cách mới và tính toán thống kê thử nghiệm. Thực hiện lần này n lần, sẽ đưa ra phân phối lấy mẫu các thống kê kiểm tra theo giả định trong đó H0 là TRUE. Cuối cùng, dưới giá trị H0, p là xác suất mà thống kê kiểm tra bằng hoặc vượt quá giá trị quan sát được.

s.size.g1 <- length (g1.lengths)
s.size.g2 <- length (g2.lengths)

pool <- lengths$lengths
obs.diff.p <- mean (g1.lengths) - mean (g2.lengths)
iterations <- 10000
sampl.dist.p <- NULL

set.seed (5)
for (i in 1 : iterations) {
        resample <- sample (c(1:length (pool)), length(pool))

        g1.perm = pool[resample][1 : s.size.g1]
        g2.perm = pool[resample][(s.size.g1+1) : length(pool)]
        sampl.dist.p[i] = mean (g1.perm) - mean (g2.perm) 
}
p.permute <- (sum (abs (sampl.dist.p) >= abs(obs.diff.p)) + 1)/ (iterations+1)

Báo cáo giá trị p của kiểm tra hoán vị là 0,0053 . OK, nếu tôi làm đúng, hoán vị và ANOVA tham số cho kết quả gần như giống hệt nhau.

BOOTSTRAP

Trước hết, tôi biết rằng bootstrap không thể giúp khi kích thước mẫu quá nhỏ. Bài đăng này cho thấy nó có thể còn tồi tệ hơn và gây hiểu lầm . Ngoài ra, điều thứ hai nhấn mạnh rằng kiểm tra hoán vị thường tốt hơn bootstrap khi kiểm tra giả thuyết là mục đích chính. Tuy nhiên, bài đăng tuyệt vời này giải quyết sự khác biệt quan trọng giữa các phương pháp sử dụng nhiều máy tính. Tuy nhiên, ở đây tôi muốn đưa ra (tôi tin) một câu hỏi khác.

Trước tiên, hãy để tôi giới thiệu cách tiếp cận bootstrap phổ biến nhất (Bootstrap1: lấy mẫu lại trong mẫu gộp ):

s.size.g1 <- length (g1.lengths)
s.size.g2 <- length (g2.lengths)

pool <- lengths$lengths
obs.diff.b1 <- mean (g1.lengths) - mean (g2.lengths)
iterations <- 10000
sampl.dist.b1 <- NULL

set.seed (5)
for (i in 1 : iterations) {
        resample <- sample (c(1:length (pool)), length(pool), replace = TRUE) 
        # "replace = TRUE" is the only difference between bootstrap and permutations

        g1.perm = pool[resample][1 : s.size.g1]
        g2.perm = pool[resample][(s.size.g1+1) : length(pool)]
        sampl.dist.b1[i] = mean (g1.perm) - mean (g2.perm) 
}
p.boot1 <- (sum (abs (sampl.dist.b1) >= obs.diff.b1) + 1)/ (iterations+1)

Giá trị P của bootstrap được thực hiện theo cách này là 0,005 . Mặc dù điều này nghe có vẻ hợp lý và gần như giống hệt với ANOVA tham số và phép thử hoán vị, liệu có phù hợp để biện minh cho H0 trong bootstrap này trên cơ sở chúng ta chỉ gộp các mẫu mà chúng ta đã rút ra các mẫu tiếp theo không?

Cách tiếp cận khác nhau tôi tìm thấy trong một số bài báo khoa học. Cụ thể, tôi thấy rằng các nhà nghiên cứu sửa đổi dữ liệu để đáp ứng H0 trước khi bootstrap. Tìm kiếm xung quanh, tôi đã tìm thấy bài đăng rất thú vị trong CV , nơi @ jan.s đã giải thích kết quả bất thường của bootstrap trong câu hỏi bài viết nhằm mục đích so sánh hai phương tiện. Tuy nhiên, trong bài đăng đó không đề cập đến cách thực hiện bootstrap khi dữ liệu được sửa đổi trước khi bootstrap. Cách tiếp cận nơi dữ liệu được sửa đổi trước khi bootstrap trông như thế này:

  1. H0 nói rằng phương tiện của hai nhóm là như nhau
  2. H0 đúng nếu chúng ta trừ các quan sát riêng lẻ khỏi giá trị trung bình của mẫu gộp

Trong trường hợp này, việc sửa đổi dữ liệu sẽ ảnh hưởng đến các nhóm có nghĩa là, và do đó, sự khác biệt của nó, nhưng không thay đổi trong các nhóm (và giữa).

  1. Dữ liệu được sửa đổi sẽ là cơ sở cho bootstrap tiếp theo, với sự cẩn thận rằng việc lấy mẫu được thực hiện trong từng nhóm riêng biệt .
  2. Sự khác biệt giữa trung bình bootstrapping của g1 và g2 được tính toán và so sánh với sự khác biệt quan sát (không sửa đổi) giữa các nhóm.
  3. Tỷ lệ các giá trị cực trị bằng hoặc nhiều hơn so với quan sát được chia cho số lần lặp sẽ cho giá trị p.

Đây là mã (Bootstrap2: lấy mẫu lại trong các nhóm sau khi sửa đổi rằng H0 là TRUE ):

s.size.g1 <- length (g1.lengths)
s.size.g2 <- length (g2.lengths)

pool <- lengths$lengths
obs.diff.b2 <- mean (g1.lengths) - mean (g2.lengths)

# make H0 to be true (no difference between means of two groups)
H0 <- pool - mean (pool)

# g1 from H0 
g1.H0 <- H0[1:s.size.g1] 

# g2 from H0
g2.H0 <- H0[(s.size.g1+1):length(pool)]

iterations <- 10000
sampl.dist.b2 <- NULL

set.seed (5)
for (i in 1 : iterations) {
        # Sample with replacement in g1
        g1.boot = sample (g1.H0, replace = T)

        # Sample with replacement in g2
        g2.boot = sample (g2.H0, replace = T)

        # bootstrapped difference
        sampl.dist.b2[i] <- mean (g1.boot) - mean (g2.boot)  
}
p.boot2 <- (sum (abs (sampl.dist.b2) >= obs.diff.b2) + 1)/ (iterations+1)

Bootstrap được thực hiện như vậy sẽ cho giá trị p là 0,514 , rất khác so với các thử nghiệm trước đó. Tôi tin rằng điều này phải giải quyết với lời giải thích của @ jan.s ' , nhưng tôi không thể tìm ra đâu là chìa khóa ...


1
Vấn đề thú vị và trình bày độc đáo. Bootstrap có vấn đề khi kích thước mẫu rất nhỏ chỉ vì mẫu ban đầu có nhiều khả năng không đại diện cho dân số rất tốt. Kích thước mẫu không phải là rất lớn để bootstrap hoạt động. Cỡ mẫu của bạn là 6 và 22 có thể không tệ. Trong một bài báo của Efron (1983), bootstrap được so sánh với một dạng CV để ước tính tỷ lệ lỗi cho các hàm phân biệt tuyến tính trong các vấn đề phân loại với 2 lớp trong đó mỗi cỡ mẫu đào tạo nhỏ hơn 10. Tôi trình bày điều này trong cuốn sách Phương pháp Bootstrap của tôi ( 2007).
Michael R. Chernick

2
Cuốn sách của tôi cũng có một chương về khi bootstrap thất bại và nó bao gồm một cuộc thảo luận về vấn đề kích thước mẫu nhỏ.
Michael R. Chernick

Dòng duy nhất mà bạn cần sửa trong cách tiếp cận bootstrap # 2 của bạn để làm cho nó hoạt động là cái này : H0 <- pool - mean (pool). Nó cần phải được thay thế bằng H0 <- c(g1.lengths - mean(g1.lengths), g2.lengths - mean(g2.lengths)). Sau đó, bạn sẽ nhận được giá trị p là 0,0023. (Đây là điều tương tự mà Zenit đã giải thích trong câu trả lời của anh ấy.) Đây là tất cả những gì có, chỉ là một lỗi đơn giản trong mã. CC gửi tới @MichaelCécick
amoeba nói Phục hồi Monica

những phương pháp này có thể bị áp đảo? Ý tôi là liệu họ có thể phát hiện BẤT K differ sự khác biệt nào không, khi các nhóm rất lớn: pool> 43k.
Alex Alvarez Pérez

Câu trả lời:


17

Dưới đây là ý kiến ​​của tôi, dựa trên chương 16 của Giới thiệu về bootstrap của Efron và Tibshirani (trang 220-224). Tóm lại là thuật toán bootstrap thứ hai của bạn đã được triển khai sai, nhưng ý tưởng chung là chính xác.

Khi tiến hành kiểm tra bootstrap, người ta phải đảm bảo rằng phương pháp lấy mẫu lại tạo ra dữ liệu tương ứng với giả thuyết null. Tôi sẽ sử dụng dữ liệu ngủ trong R để minh họa cho bài đăng này. Lưu ý rằng tôi đang sử dụng thống kê kiểm tra học sinh thay vì chỉ là sự khác biệt của phương tiện, được sách giáo khoa khuyến nghị.

Thử nghiệm t cổ điển, sử dụng kết quả phân tích để thu được thông tin về phân phối lấy mẫu của thống kê t, cho kết quả như sau:

x <- sleep$extra[sleep$group==1] y <- sleep$extra[sleep$group==2]
t.test(x,y)
t = -1.8608, df = 17.776, p-value = 0.07939

n1n2

# pooled sample, assumes equal variance
pooled <- c(x,y)
for (i in 1:10000){
  sample.index <- sample(c(1:length(pooled)),replace=TRUE)
  sample.x <- pooled[sample.index][1:length(x)]
  sample.y <- pooled[sample.index][-c(1:length(y))]
  boot.t[i] <- t.test(sample.x,sample.y)$statistic
}
p.pooled <-  (1 + sum(abs(boot.t) > abs(t.test(x,y)$statistic))) / (10000+1) 
p.pooled
[1] 0.07929207

H0H0H0z¯

x~Tôi= =xTôi-x¯+z¯
y~Tôi= =yTôi-y¯+z¯

x~/y~z¯H0

# sample from H0 separately, no assumption about equal variance
xt <- x - mean(x) + mean(sleep$extra) #
yt <- y - mean(y) + mean(sleep$extra)

boot.t <- c(1:10000)
for (i in 1:10000){
  sample.x <- sample(xt,replace=TRUE)
  sample.y <- sample(yt,replace=TRUE)
  boot.t[i] <- t.test(sample.x,sample.y)$statistic
}
p.h0 <-  (1 + sum(abs(boot.t) > abs(t.test(x,y)$statistic))) / (10000+1)  # 
p.h0
[1] 0.08049195

Lần này, chúng tôi đã kết thúc với các giá trị p tương tự cho ba phương pháp. Hi vọng điêu nay co ich!


1
bạn sẽ tử tế và giải thích lý do tại sao '1' được thêm vào như sau: (1 + sum(abs(boot.t) > abs(t.test(x,y)$statistic))) / (10000+1)thay vì một cái gì đó như thế này: mean(abs(boot.t) > abs(t.test(x,y)$statistic))Cảm ơn bạn đã dành thời gian.
TG_Montana

+1. Liệu phương pháp bootstrap-on-mod-data-to-sample-from-H0 này có một tên cụ thể không?
amip nói rằng Phục hồi lại

3
H0p-vmộttôibạne= =số lần {t*>tobS}BB

@amoeba: Tôi không chắc liệu quy trình này có tên chính thức hay được thỏa thuận hay không, nhưng tôi đoán nó có thể được mô tả như là một thử nghiệm bootstrap cho sự bình đẳng của phương tiện , thay vì phân phối . Trang hiển thị quy trình đầy đủ bị thiếu trên sách google , nhưng động lực của nó xuất hiện ở trang 223. Một mô tả khác về nó có thể được tìm thấy trong các ghi chú này, trên trang 13 ( galton.uchicago.edu/~eichler/stat24600/Handouts/bootstrap. pdf ).
Zenit

(+1) Câu trả lời tuyệt vời. Bạn có thể giải thích lý do tại sao "thuật toán này [tự lấy lại dữ liệu mà không cần định tâm] thực sự đang kiểm tra xem phân phối của x và y có giống nhau không"? Tôi hiểu rằng chiến lược lấy mẫu lại này đảm bảo rằng các bản phân phối là như nhau, nhưng tại sao nó kiểm tra rằng chúng giống nhau?
một nửa vượt qua
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.