Hai phương pháp sử dụng bootstraping để kiểm tra sự khác biệt giữa hai phương tiện mẫu


8

Tôi muốn bootstrap kiểm tra một giả thuyết (bài kiểm tra t sinh viên hai mẫu). Trong Efron và Tibshirani 1993 p.224 có mã rõ ràng cho điều đó: đối với mỗi quan sát, hãy trừ trung bình nhóm của nó và thêm trung bình tổng thể trong đó giá trị trung bình tổng thể là trung bình của các mẫu kết hợp. Họ cho rằng chúng ta nên phân phối bootstrap theo giả thuyết null và đó là lý do tại sao chúng ta nên làm điều này.

Tuy nhiên, tôi cũng học được rằng có thể tự khởi động từ các mẫu mà không cần sửa đổi chúng. Tôi đã thử cả hai phương pháp: Các bước của Efron (sử dụng chức năng boot_t_F) và cũng không chuyển đổi các quan sát (sử dụng chức năng boot_t_B).

Các giá trị p được khởi động kết quả (như tỷ lệ của các thống kê kiểm tra đã được khởi động vượt quá thống kê kiểm tra ban đầu) phải giống hệt nhau, nhưng chúng thì không.

Tại sao lại thế này?

Hai chức năng của tôi là dưới đây:

 boot_t_B<-function(x,y){
  print(t.test(x, y, var.equal=TRUE)) #original test statistics
  t.est<-abs(t.test(x, y, var.equal=TRUE)$statistic) #Student's t-test

  grand_mean<-mean(c(x,y), na.rm=T) #global mean
  x1<-x #-mean(x, na.rm=T)+grand_mean it's not subtracted/added here
  y1<-y #-mean(y, na.rm=T)+grand_mean

  B      <- 10000 #number of bootstrap samples
  t.vect <- vector(length=B) #vector for bootstrapped t-statistics
  for(i in 1:B){
    boot.c <- sample(x1, size=length(x), replace=T)
    boot.p <- sample(y1, size=length(y), replace=T)
    t.vect[i] <- t.test(boot.c, boot.p, var.equal=TRUE)$statistic
  }
   return(mean(t.vect>t.est)) #bootstrapped p-value
} 


boot_t_F<-function(x,y){
  print(t.test(x, y, var.equal=TRUE)) #original test statistics
  t.est<-abs(t.test(x, y, var.equal=TRUE)$statistic) #Student's t-test

  grand_mean<-mean(c(x,y), na.rm=T) #global mean
  x1<-x-mean(x, na.rm=T)+grand_mean
  y1<-y-mean(y, na.rm=T)+grand_mean

  B      <- 10000 #number of bootstrap samples
  t.vect <- vector(length=B) #vector for bootstrapped test-statistics
  for(i in 1:B){
    boot.c <- sample(x1, size=length(x), replace=T)
    boot.p <- sample(y1, size=length(y), replace=T)
    t.vect[i] <- t.test(boot.c, boot.p, var.equal=TRUE)$statistic
  }

  return(mean(t.vect>t.est)) #bootstrapped p-value
} 

set.seed(1678)
boot_t_B(rnorm(25,0,10), rnorm(25,5,10))
[1] 4e-04
set.seed(1678)
boot_t_F(rnorm(25,0,10), rnorm(25,5,10))
[1] 0.0507

Lưu ý: Tôi đã chọn 'ngẫu nhiên' phân phối (bình thường) của các mẫu.


Lưu ý rằng trong cuộc gọi của bạn đến boot_t_Bcác đối số của bạn là cả hai rnorm, nhưng trong cuộc gọi của bạn đến boot_t_Fhọ runifrexp.
jbowman

@jbowman :) lỗi đánh máy lớn khi xây dựng câu hỏi này tại đây ... những kết quả 0,0507 và 4e-04 này là khi tôi sử dụng boot_t_F và boot_t_B trên các mẫu 'bình thường' đó
Lil'Lobster

Điều chỉnh văn bản một chút, hy vọng tôi giữ được ý nghĩa.
liên hợp chiến binh

@conjugatep Warrior Nó vẫn giữ :) có lẽ tôi cũng nên thêm điều này: 'tại sao bootstrapping giả thuyết null và dữ liệu bootstrapping trực tiếp đưa ra kết quả mâu thuẫn trong bối cảnh giá trị p'.
Lil'Lobster

Câu trả lời:


4

Vấn đề là bootstrap của bạn boot_t_Bkhông được thực hiện chính xác. Nếu bạn không sửa các phương tiện giống nhau (nghĩa là buộc giả thuyết null thành đúng bằng cách định tâm lại từng mẫu), bạn buộc giả thuyết null thành đúng bằng cách lấy mẫu từ hai mẫu kết hợp:

boot.c <- sample(c(x1,y1), size=length(x), replace=T)
boot.p <- sample(c(x1,y1), size=length(y), replace=T)

Lý do cho điều này là nếu phương tiện là khác nhau, trong công thức ban đầu của bạn boot.cboot.pthực sự là các mẫu từ giả thuyết thay thế trong đó các phân phối thay thế được "tập trung" vào dữ liệu. Bạn có thể coi đó là lấy mẫu bootstrap từ phân phối thay thế rất có thể được cung cấp dữ liệu, chỉ có điều bạn không phải là số liệu thay vì sử dụng bootstrap tham số. Do đó, bạn không nhận được giá trị p, tất nhiên được tính toán với giả định null.

Nếu bạn làm theo cách này, bạn sẽ nhận được:

> set.seed(1678)
> boot_t_B(rnorm(25,0,10), rnorm(25,5,10))
[1] 0.05
> set.seed(1678)
> boot_t_F(rnorm(25,0,10), rnorm(25,5,10))
[1] 0.0507

1

Thêm vào câu trả lời của @jbowman , để có được trực giác tốt hơn về quy trình bootstrap cho -test, bạn có thể nghĩ đến phép thử hoán vị mà bạn sẽ sử dụng trong tình huống này (xem ví dụ: một trong những cuốn Giới thiệu về thống kê thông qua các phương pháp lấy mẫu lại của Phillip I. Tốt hoặc các cuốn sách khác về chủ đề này của tác giả này). Để tiến hành kiểm tra hoán vị, chúng tôi sẽ giả sử rằng dưới phân phối null, tất cả các giá trị được phân phối lại ngẫu nhiên giữa các nhóm, vì vậy quy trình hoán vị sẽ được gán lại ngẫu nhiên các nhãn nhóm. Bạn phải lấy mẫu từ phân phối thân tàu và điều này có thể đạt được bằng cách gán lại nhãn nhóm hoặc bằng cách trừ phương tiện nhóm theo đề xuất của Efron và Tibshirani.t

perm_test <- function(x, y) {

  B <- 10000
  nx <- length(x)
  ny <- length(y)
  N <- nx+ny
  xy <- c(x, y)
  orig <- mean(x) - mean(y)
  res <- numeric(B)

  for (i in 1:B) {
    idx <- sample(N, nx)
    tmpx <- xy[idx]
    tmpy <- xy[-idx]
    res[i] <- mean(tmpx) - mean(tmpy)
  }

  mean(orig > res)

}

Kết quả tương tự với bootstrap "thích hợp" hoặc được sử dụng theo đề xuất của @jbowman :

> set.seed(1678)
> perm_test(rnorm(25,0,10), rnorm(25,5,10))
[1] 0.051
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.