Kiểm tra ngẫu nhiên / hoán vị cho các vectơ được ghép nối trong R


9

Tôi không phải là một chuyên gia, vì vậy hãy tha thứ cho tôi nếu một số thuật ngữ hơi vụng về. Rất vui được cung cấp thêm thông tin khi có yêu cầu.

Tôi có hai vectơ gồm 50 giá trị số được ghép nối trong R. Tôi muốn thực hiện kiểm tra ngẫu nhiên hoặc hoán vị hai đuôi để xác định xem sự khác biệt của chúng có phải là do tình cờ hay không.

Thử nghiệm hoán vị (còn gọi là thử nghiệm ngẫu nhiên, thử nghiệm ngẫu nhiên lại hoặc thử nghiệm chính xác) là một loại thử nghiệm có ý nghĩa thống kê trong đó phân phối thống kê thử nghiệm theo giả thuyết null có được bằng cách tính tất cả các giá trị có thể có của thống kê thử nghiệm dưới sự sắp xếp lại của các nhãn trên các điểm dữ liệu quan sát.

Tôi muốn thực hiện loại thử nghiệm này vì tôi tin rằng sự phân phối của các giá trị trong các vectơ vi phạm các giả định của các thử nghiệm khác như thử nghiệm t (ví dụ: nhiều giá trị số trong vectơ là 0).

Các permtestchức năng trong thư viện BHH2 , hầu hết những gì tôi muốn, nhưng nó hoạt động trên tất cả hoán vị, sẽ mất nhiều thời gian. Thay vào đó, tôi muốn ước tính giá trị p, bằng cách lấy mẫu một số lượng lớn các hoán vị có thể. Tôi đã xem xét gói tiền xu , nhưng dường như không có gì để thực hiện kiểm tra hoán vị với việc lấy mẫu từ các vectơ số được ghép nối.250

Một số googling dẫn tôi đến email này , điều đó cho thấy lý do tôi không thể tìm thấy một gói để làm điều đó là vì nó là một lớp lót trong R. Thật không may, tôi không đủ kinh nghiệm với R để có thể tạo ra cái đó -chuyển

Có một gói hoặc phương thức nào sẽ thực hiện phép thử hoán vị ghép hai đuôi chỉ sử dụng một mẫu của không gian hoán vị?

Nếu không, ai đó có thể chia sẻ một chút mã R để làm điều đó không?


3
Tôi trông giống như gói coin(trong số một số khác) thực hiện các thử nghiệm ngẫu nhiên. ví dụ: xem câu trả lời cho câu hỏi này (đọc toàn bộ) . Nếu tôi hiểu đúng, các ví dụ bao gồm cả trường hợp gần đúng và chính xác và bao gồm cả mẫu độc lập và mẫu phụ thuộc.
Glen_b -Reinstate Monica

1
Xin lỗi, để rõ ràng - bằng cách 'đọc toàn bộ' Ý tôi là 'đọc câu trả lời hàng đầu suốt' - mặc dù bạn cũng có thể muốn xem câu trả lời dưới cùng.
Glen_b -Reinstate Monica

Khá nhiều điều thú vị duy nhất từ ​​câu trả lời cho các hoán vị được ghép nối là oneway_test(y ~ x | pairs, distribution=approximate(B=9999))với library(coin).
Nakx

Câu trả lời:


12

Mặc dù tôi đã chỉ ra ý kiến ​​về việc sử dụng coingói này, tôi nghĩ rằng nó đáng để minh họa rằng một thử nghiệm hoán vị / ngẫu nhiên thực sự khá đơn giản, vì vậy tôi đã thực hiện nó.

Ở đây tôi viết một số mã R để làm một thử nghiệm ngẫu nhiên cho một thử nghiệm mẫu về vị trí. Các thử nghiệm ngẫu nhiên lật các dấu hiệu về sự khác biệt và tính giá trị trung bình; điều này tương đương với việc gán ngẫu nhiên từng cặp giá trị cho các nhóm x và y. Mã dưới đây có thể được thực hiện ngắn hơn đáng kể (tôi có thể thực hiện nó thành hai dòng đủ dễ dàng hoặc thậm chí một dòng nếu bạn không nhớ mã chậm hơn).

Mã này mất vài giây trên máy của tôi:

# assumes the two samples are in 'x' and 'y' and x[i] and y[i] are paired
# set up:
B <- 99999
d <- x-y
m0 <- mean(d)

# perform a one-sample randomization test on d
# for the null hypothesis H0: mu_d = 0   vs H1 mu_d != 0  (i.e. two tailed)
# here the test statistic is the mean
rndmdist <- replicate(B,mean((rbinom(length(d),1,.5)*2-1)*d))

# two tailed p-value:
sum( abs(rndmdist) >= abs(m0))/length(rndmdist)

Đó là toàn bộ.

Lưu ý rằng rbinom(length(d),1,.5)*2-1)cung cấp ngẫu nhiên -1hoặc 1... tức là một dấu hiệu ngẫu nhiên, vì vậy khi chúng ta nhân với bất kỳ tập hợp ký nào d, nó tương đương với việc gán ngẫu nhiên +hoặc -các dấu hiệu cho sự khác biệt tuyệt đối. [Việc dbạn bắt đầu phân phối các dấu hiệu nào không quan trọng , bây giờ dsẽ có các dấu hiệu ngẫu nhiên.]

Ở đây, tôi so sánh nó với một bài kiểm tra t trên một số dữ liệu đã tạo:

 set.seed(seed=438978)
 z=rnorm(50,10,2)
 x=z-rnorm(50,0,.5)
 y=z+.4+rnorm(50,0,.5)
 t.test(y-x) # gives p = 0.003156

 B <- 99999
 d <- x-y
 m0 <- mean(d)
 rndmdist <- replicate(B,mean((rbinom(length(d),1,.5)*2-1)*d))
 sum( abs(rndmdist) >= abs(m0))/length(rndmdist) 

Khi thử nghiệm t là hợp lệ, nó thường cho giá trị p rất giống với thử nghiệm hoán vị được liệt kê hoàn toàn và giá trị p mô phỏng như trên (khi số lượng mô phỏng đủ lớn) sẽ hội tụ đến giá trị p thứ hai đó.

Tại số lần sao chép được sử dụng ở trên, giá trị p hoán vị thực (nghĩa là từ phép liệt kê hoàn chỉnh) 0,05 sẽ được ước tính trong khoảng 0,001 (nghĩa là sẽ cho giá trị p ngẫu nhiên trong khoảng 0,049 đến 0,051) khoảng 85% thời gian và trong vòng 0,002 trên 99,5% thời gian.


Rất nhiều đánh giá cao, cảm ơn bạn. Làm thế nào bạn tính toán độ chính xác của giá trị p?
Timothy Jones

1
Đó chỉ là xấp xỉ bình thường với tỷ lệ nhị thức , sử dụng sai số chuẩn của tỷ lệ ; . s.e.(p^)=p(1p)/n
Glen_b -Reinstate Monica

Tại sao bạn nhân hàm rbinom với tỷ số 2-1? Rồi d?

Để có được các dấu hiệu ngẫu nhiên d, bởi vì đó là cách kiểm tra hoán vị về sự khác biệt trung bình cho dữ liệu được ghép nối hoạt động. Xem bình luận bổ sung mới sau đoạn mã đó.
Glen_b -Reinstate Monica

1
@Joe khi chúng ta thêm mẫu quan sát, nó sẽ tạo thành một số tròn
Glen_b -Reinstate Monica

0

Đây là mã để thực hiện kiểm tra hoán vị. Tôi có dữ liệu trong đó chẳng hạn. x là sự khác biệt giữa hai vectơ.

x <- c(5.1, 9.4, 7.2, 8.1, 8.8, 2.5, 4.2, 6.9, 5.5, 5.3)
m = 5
n = 5
xsum = sum(x)
asum = sum(x[1:m])
bsum = xsum - asum
truediff = asum/m - bsum/n
truediff
abstruediff = abs(truediff)
iter = 100000
difflist <- 1:iter
for(i in 1:iter) {
  s <- sample(x,m) # select a sample of size m
  pasum = sum(s)
  pbsum = sum(x) - sum(s)
  diff  = pasum/m - pbsum/n
  difflist[i] <- diff # add permutation difference to list
}
difflist  <- sort(difflist)
xquantile <- quantile(difflist,probs=c(.005, .01, .025, .05, .95, .975, .99, .995))
xquantile
pdist  <- quantile(difflist, probs=seq(0,1,1/iter))
ntail1 <- length(pdist[difflist <= -abstruediff])
tail1  <- ntail1/iter
tail1  # left-tail probability
ntail2 <- length(pdist[difflist >= abstruediff])
tail2  <- ntail2/iter
tail2  # right-tail probability
twotail = tail1 + tail2
twotail 
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.