Thực hiện kiểm tra hoán vị nào trong R để sử dụng thay cho kiểm tra t (ghép và không ghép)?


56

Tôi có dữ liệu từ một thí nghiệm mà tôi đã phân tích bằng các bài kiểm tra t. Biến phụ thuộc là khoảng cách được chia tỷ lệ và dữ liệu không được ghép đôi (nghĩa là 2 nhóm) hoặc được ghép nối (nghĩa là bên trong chủ thể). Ví dụ (trong các môn học):

x1 <- c(99, 99.5, 65, 100, 99, 99.5, 99, 99.5, 99.5, 57, 100, 99.5, 
        99.5, 99, 99, 99.5, 89.5, 99.5, 100, 99.5)
y1 <- c(99, 99.5, 99.5, 0, 50, 100, 99.5, 99.5, 0, 99.5, 99.5, 90, 
        80, 0, 99, 0, 74.5, 0, 100, 49.5)

Tuy nhiên, dữ liệu không bình thường nên một người đánh giá đã yêu cầu chúng tôi sử dụng một cái gì đó ngoài bài kiểm tra t. Tuy nhiên, như người ta có thể dễ dàng nhìn thấy, dữ liệu không chỉ không được phân phối bình thường mà các phân phối không bằng nhau giữa các điều kiện: văn bản thay thế

Do đó, các phép thử không tham số thông thường, Thử nghiệm Mann-Whitney-U (không ghép đôi) và Thử nghiệm Wilcoxon (ghép nối), không thể được sử dụng vì chúng yêu cầu phân phối bằng nhau giữa các điều kiện. Do đó, tôi quyết định rằng một số thử nghiệm lấy mẫu lại hoặc hoán vị sẽ là tốt nhất.

Bây giờ, tôi đang tìm kiếm một triển khai R của một phép thử tương đương dựa trên hoán vị, hoặc bất kỳ lời khuyên nào khác về việc phải làm gì với dữ liệu.

Tôi biết rằng có một số gói R có thể làm điều này cho tôi (ví dụ: coin, perm, precisionRankTest, v.v.), nhưng tôi không biết nên chọn gói nào. Vì vậy, nếu ai đó có một số kinh nghiệm sử dụng các thử nghiệm này có thể cho tôi một khởi đầu, đó sẽ là ubercool.

CẬP NHẬT: Sẽ thật lý tưởng nếu bạn có thể cung cấp một ví dụ về cách báo cáo kết quả từ bài kiểm tra này.

Câu trả lời:


43

Không nên quan trọng lắm vì thống kê kiểm tra sẽ luôn là sự khác biệt về phương tiện (hoặc một cái gì đó tương đương). Sự khác biệt nhỏ có thể đến từ việc thực hiện các phương pháp Monte-Carlo. Thử ba gói với dữ liệu của bạn bằng thử nghiệm một phía cho hai biến độc lập:

DV <- c(x1, y1)
IV <- factor(rep(c("A", "B"), c(length(x1), length(y1))))
library(coin)                    # for oneway_test(), pvalue()
pvalue(oneway_test(DV ~ IV, alternative="greater", 
                   distribution=approximate(B=9999)))
[1] 0.00330033

library(perm)                    # for permTS()
permTS(DV ~ IV, alternative="greater", method="exact.mc", 
       control=permControl(nmc=10^4-1))$p.value
[1] 0.003

library(exactRankTests)          # for perm.test()
perm.test(DV ~ IV, paired=FALSE, alternative="greater", exact=TRUE)$p.value
[1] 0.003171822

Để kiểm tra giá trị p chính xác bằng cách tính toán thủ công tất cả các hoán vị, tôi sẽ giới hạn dữ liệu ở 9 giá trị đầu tiên.

x1 <- x1[1:9]
y1 <- y1[1:9]
DV <- c(x1, y1)
IV <- factor(rep(c("A", "B"), c(length(x1), length(y1))))
pvalue(oneway_test(DV ~ IV, alternative="greater", distribution="exact"))
[1] 0.0945907

permTS(DV ~ IV, alternative="greater", exact=TRUE)$p.value
[1] 0.0945907

# perm.test() gives different result due to rounding of input values
perm.test(DV ~ IV, paired=FALSE, alternative="greater", exact=TRUE)$p.value
[1] 0.1029412

# manual exact permutation test
idx  <- seq(along=DV)                 # indices to permute
idxA <- combn(idx, length(x1))        # all possibilities for different groups

# function to calculate difference in group means given index vector for group A
getDiffM <- function(x) { mean(DV[x]) - mean(DV[!(idx %in% x)]) }
resDM    <- apply(idxA, 2, getDiffM)  # difference in means for all permutations
diffM    <- mean(x1) - mean(y1)       # empirical differencen in group means

# p-value: proportion of group means at least as extreme as observed one
(pVal <- sum(resDM >= diffM) / length(resDM))
[1] 0.0945907

coinexactRankTestscả hai từ cùng một tác giả, nhưng coindường như tổng quát và sâu rộng hơn - cũng về mặt tài liệu. exactRankTestskhông được tích cực phát triển nữa. Do đó, tôi sẽ chọn coin(cũng vì các chức năng thông tin như support()), trừ khi bạn không muốn xử lý các đối tượng S4.

EDIT: cho hai biến phụ thuộc, cú pháp là

id <- factor(rep(1:length(x1), 2))    # factor for participant
pvalue(oneway_test(DV ~ IV | id, alternative="greater",
                   distribution=approximate(B=9999)))
[1] 0.00810081

Cảm ơn câu trả lời tuyệt vời của bạn! 2 câu hỏi nữa: Ví dụ thứ hai của bạn có nghĩa là, đồng tiền đó trong thực tế có cung cấp tất cả các hoán vị có thể và là một thử nghiệm chính xác không? Có bất kỳ lợi ích của việc không cung cấp một bài kiểm tra chính xác trong trường hợp của tôi?
Henrik

10
(+1) Không có gì ngạc nhiên khi thử nghiệm t (không ghép đôi) mang lại về cơ bản cùng giá trị p, 0,000349. Bất chấp những gì người đánh giá đã nói, bài kiểm tra t thể áp dụng cho những dữ liệu này. Lý do là các phân phối lấy mẫu của phương tiện gần như bình thường, mặc dù các phân phối dữ liệu thì không. Hơn nữa, như bạn có thể thấy từ các kết quả, thử nghiệm t thực sự bảo thủ hơn so với thử nghiệm hoán vị. (Điều này có nghĩa là một kết quả quan trọng với thử nghiệm t cho thấy thử nghiệm hoán vị cũng có thể có ý nghĩa.)
whuber

2
@Henrik Đối với các tình huống nhất định (kiểm tra được chọn và độ phức tạp số), cointhực sự có thể tính toán phân phối hoán vị chính xác (mà không thực sự trải qua tất cả các hoán vị, có nhiều thuật toán tao nhã hơn thế). Với sự lựa chọn, phân phối chính xác có vẻ thích hợp hơn, nhưng sự khác biệt so với xấp xỉ Monte-Carlo với số lượng bản sao cao nên nhỏ.
caracal

1
@Caracal Cảm ơn đã làm rõ. Một câu hỏi vẫn còn: Dữ liệu tôi trình bày được ghép nối. Do đó, tôi cần tương đương với bài kiểm tra t cặp. Là oneway_testchức năng chính xác? Và nếu vậy, cái nào là chính xác cho dữ liệu không được ghép nối?
Henrik

2
@Henrik coinTác giả đã viết cho tôi rằng oneway_test()không thể tính phân phối chính xác cho trường hợp phụ thuộc, bạn phải đi với phép tính gần đúng MC (chỉ wilcoxsign_test()phù hợp với thử nghiệm chính xác). Tôi không biết điều này và muốn có lỗi trong trường hợp đó, nhưng MC phải đủ chính xác với số lượng bản sao cao.
caracal

29

Một vài ý kiến ​​là, tôi tin, theo thứ tự.

1) Tôi khuyến khích bạn thử nhiều màn hình hiển thị dữ liệu của bạn, bởi vì chúng có thể ghi lại những thứ bị mất bởi biểu đồ (như biểu đồ) và tôi cũng khuyên bạn nên vẽ theo trục bên cạnh. Trong trường hợp này, tôi không tin rằng biểu đồ làm rất tốt việc truyền đạt các tính năng nổi bật của dữ liệu của bạn. Ví dụ: hãy xem các ô vuông cạnh nhau:

boxplot(x1, y1, names = c("x1", "y1"))

văn bản thay thế

Hoặc thậm chí là thoát y bên cạnh:

stripchart(c(x1,y1) ~ rep(1:2, each = 20), method = "jitter", group.names = c("x1","y1"), xlab = "")

văn bản thay thế

x1y1x1y1x1y1y1

2) Bạn đã không giải thích chi tiết về việc dữ liệu của bạn đến từ đâu, cũng như cách chúng được đo, nhưng thông tin này rất quan trọng khi đến lúc phải chọn một quy trình thống kê. Hai mẫu trên của bạn có độc lập không? Có bất kỳ lý do nào để tin rằng các phân phối biên của hai mẫu phải giống nhau (ngoại trừ sự khác biệt về vị trí chẳng hạn) không? Những cân nhắc trước khi nghiên cứu khiến bạn tìm kiếm bằng chứng về sự khác biệt giữa hai nhóm là gì?

zpp

p

5) Theo tôi, những dữ liệu này là một ví dụ hoàn hảo (?) Rằng một bức ảnh được chọn tốt có giá trị 1000 bài kiểm tra giả thuyết. Chúng tôi không cần số liệu thống kê để cho biết sự khác biệt giữa bút chì và chuồng. Tuyên bố phù hợp theo quan điểm của tôi đối với những dữ liệu này sẽ là "Những dữ liệu này thể hiện sự khác biệt rõ rệt về vị trí, tỷ lệ và hình dạng." Bạn có thể theo dõi với các thống kê mô tả (mạnh mẽ) cho từng số liệu để định lượng sự khác biệt và giải thích sự khác biệt có ý nghĩa gì trong bối cảnh nghiên cứu ban đầu của bạn.

pp

Câu trả lời này dài hơn nhiều so với dự định ban đầu của tôi. Xin lỗi vì điều đó.


Tôi tò mò nếu bạn xem xét một cách tiếp cận trực quan phù hợp sau: ước tính bootstrap cho các khoảnh khắc của hai nhóm (phương tiện, phương sai và khoảnh khắc cao hơn nếu bạn mong muốn), sau đó vẽ các ước tính này và khoảng tin cậy của chúng, tìm kiếm cho mức độ chồng chéo giữa các nhóm trên từng thời điểm. Điều này cho phép bạn nói về sự khác biệt tiềm năng trên nhiều đặc điểm phân phối. Nếu dữ liệu được ghép nối, hãy tính điểm số chênh lệch và khởi động lại các khoảnh khắc của phân phối đơn này. Suy nghĩ?
Mike Lawrence

2
(+1) Phân tích tốt. Bạn hoàn toàn đúng khi cho rằng kết quả là hiển nhiên và người ta không cần nhấn điểm với giá trị p. Bạn có thể hơi cực đoan trong tuyên bố của mình về (3), vì kiểm tra t không yêu cầu dữ liệu phân phối thông thường. Nếu bạn lo ngại, có tồn tại các điều chỉnh cho độ lệch (ví dụ: biến thể của Chen): bạn có thể xem liệu giá trị p cho thử nghiệm được điều chỉnh có thay đổi câu trả lời hay không. Nếu không, bạn có khả năng ok. Trong tình huống cụ thể này, với những dữ liệu (rất sai lệch) này, thử nghiệm t hoạt động tốt.
whuber

(+1) Bắt đẹp! Và ý kiến ​​rất tốt.
chl

Chúng tôi dường như đang chấp nhận khái niệm rằng phân phối cơ bản là "tương tự" với khởi tạo ngẫu nhiên. Vì vậy, không ai có thể đặt ra câu hỏi: cả hai đều từ beta (0,25, 0,25) và sau đó thử nghiệm sẽ là liệu chúng có cùng tham số (không) trung tâm không. Và sẽ không biện minh bằng cách sử dụng một thử nghiệm hoán vị hoặc Wilcoxon?
DWin

4

5

Nhận xét của tôi không phải là về việc thực hiện thử nghiệm hoán vị mà là về các vấn đề tổng quát hơn được đưa ra bởi các dữ liệu này và thảo luận về nó, đặc biệt là bài đăng của G. Jay Kerns.

Hai bản phân phối thực sự trông khá giống với tôi NGOẠI TRỪ đối với nhóm 0 trong Y1, khác nhiều so với các quan sát khác trong mẫu đó (nhỏ nhất tiếp theo là khoảng 50 trên thang điểm 0-100) cũng như tất cả những người trong X1. Trước tiên tôi sẽ điều tra xem liệu có bất cứ điều gì khác biệt về những quan sát đó không.

Thứ hai, giả sử những số 0 đó thuộc về phân tích, nói rằng phép thử hoán vị không hợp lệ vì các phân phối dường như khác nhau đặt ra câu hỏi. Nếu null là đúng (các bản phân phối giống hệt nhau), bạn có thể (với xác suất hợp lý) có thể nhận các bản phân phối trông khác nhau như hai bản này không? Trả lời đó là toàn bộ vấn đề của bài kiểm tra, phải không? Có thể trong trường hợp này, một số người sẽ xem xét câu trả lời rõ ràng mà không cần chạy thử nghiệm, nhưng với những phân phối nhỏ, kỳ dị này, tôi không nghĩ mình sẽ làm thế.


Có vẻ như đây phải là một hoặc nhiều bình luận, không phải là một câu trả lời. Nếu bạn nhấp vào "thêm bình luận" màu xám nhỏ, bạn có thể đặt suy nghĩ của mình vào cuộc trò chuyện bên dưới câu hỏi hoặc câu trả lời cụ thể, nơi chúng thuộc về. Bạn thực hiện những điểm quan trọng ở đây, nhưng không rõ ràng rằng đây không phải là nơi thích hợp cho họ.
gung - Phục hồi Monica

1
@gung Phải mất một chút tiếng tăm để có thể đăng bình luận ;-).
whuber

4
2(1/2)7.01

4

Khi câu hỏi này xuất hiện trở lại, tôi có thể thêm một câu trả lời khác lấy cảm hứng từ một bài đăng trên blog gần đây thông qua R-Bloggers từ Robert Kabacoff, tác giả của Quick-RR in Action bằng cách sử dụng lmPermgói.

Tuy nhiên, phương pháp này tạo ra kết quả tương phản mạnh (và rất không ổn định) với kết quả được tạo bởi coingói trong câu trả lời của @caracakl (giá trị p của phân tích bên trong đối tượng là 0.008). Phân tích cũng chuẩn bị dữ liệu từ câu trả lời của @ caracal:

x1 <- c(99, 99.5, 65, 100, 99, 99.5, 99, 99.5, 99.5, 57, 100, 99.5, 
        99.5, 99, 99, 99.5, 89.5, 99.5, 100, 99.5)
y1 <- c(99, 99.5, 99.5, 0, 50, 100, 99.5, 99.5, 0, 99.5, 99.5, 90, 
        80, 0, 99, 0, 74.5, 0, 100, 49.5)

DV <- c(x1, y1)
IV <- factor(rep(c("A", "B"), c(length(x1), length(y1))))
id <- factor(rep(1:length(x1), 2)) 

library(lmPerm)

summary(aovp( DV ~ IV + Error(id)))

sản xuất:

> summary(aovp( DV ~ IV + Error(id)))
[1] "Settings:  unique SS "

Error: id
Component 1 :
          Df R Sum Sq R Mean Sq
Residuals 19    15946       839


Error: Within
Component 1 :
          Df R Sum Sq R Mean Sq Iter Pr(Prob)  
IV         1     7924      7924 1004    0.091 .
Residuals 19    21124      1112                
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1   1 

Nếu bạn chạy này nhiều lần, các giá trị p sẽ nhảy trong khoảng từ ~ .05 đến ~ .1.

Mặc dù đây là câu trả lời cho câu hỏi, cho phép tôi đặt câu hỏi ở cuối (tôi có thể chuyển câu hỏi này sang câu hỏi mới nếu muốn):
Mọi ý tưởng về lý do tại sao phân tích này không ổn định và tạo ra giá trị p rất khác nhau phân tích tiền xu? Tôi đã làm gì sai sao?


2
Có thể tốt hơn để hỏi đây là một câu hỏi riêng biệt, nếu đó thực sự là một câu hỏi bạn muốn trả lời, thay vì một giải pháp khả thi khác mà bạn muốn liệt kê với phần còn lại. Tôi nhận thấy rằng bạn chỉ định một tầng lỗi, nhưng @caracal thì không; đó sẽ là dự đoán đầu tiên của tôi về sự khác biệt b / t sản lượng này & của anh ấy. Ngoài ra, khi mô phỏng, các giá trị thường nhảy xung quanh; để tái sản xuất, bạn chỉ định hạt giống, ví dụ set.seed(1); để có độ chính xác cao hơn trong ước tính MC, bạn tăng số lần lặp; Tôi không chắc liệu một trong hai câu trả lời là 'đúng' cho câu hỏi của bạn, nhưng chúng có thể có liên quan.
gung - Phục hồi Monica

2
Một lần nữa, tôi đề nghị điểm chuẩn các kết quả MC so với các tính toán thủ công bằng cách sử dụng thử nghiệm hoán vị đầy đủ (tái ngẫu nhiên hóa). Xem mã cho ví dụ của bạn để so sánh oneway_anova()(luôn gần với kết quả chính xác) và aovp()(thường cách xa kết quả chính xác). Tôi không biết tại sao aovp()lại cho kết quả rất khác nhau, nhưng ít nhất là trong trường hợp này ở đây chúng không thể tin được. @gung cuộc gọi cuối cùng oneway_test(DV ~ IV | id, ...)trong câu trả lời ban đầu của tôi đã chỉ định tầng lỗi cho trường hợp phụ thuộc (cú pháp khác với sử dụng bởi aov()).
caracal

@caracal, bạn nói đúng. Tôi đã không nhìn vào khối mã cuối cùng sau khi chỉnh sửa. Tôi đã nhìn vào khối mã hàng đầu - cẩu thả về phía tôi.
gung - Phục hồi Monica

Tôi không thực sự cần câu trả lời. Nó chỉ là một khả năng khác đáng được đề cập ở đây. Thật không may, nó khác xa với các kết quả khác mà tôi cũng đáng chú ý.
Henrik

1
@Henrik chạy aovp với maxExact = 1000. Nếu mất quá nhiều thời gian, hãy đặt iter = 1000000 và Ca = 0,001. Việc tính toán chấm dứt khi sai số chuẩn ước tính của p nhỏ hơn Ca * p. (Giá trị thấp hơn cho kết quả ổn định hơn.)
xmjx

1

Là những tỷ lệ điểm số? Nếu vậy, bạn chắc chắn không nên sử dụng thử nghiệm tham số gaussian và trong khi bạn có thể tiếp tục với cách tiếp cận không tham số như thử nghiệm hoán vị hoặc bootstrap của phương tiện, tôi khuyên bạn nên có thêm sức mạnh thống kê sử dụng một cách tiếp cận tham số không gaussian thích hợp. Cụ thể, bất cứ khi nào bạn có thể tính toán một tỷ lệ tỷ lệ trong một đơn vị quan tâm (ví dụ: người tham gia trong một thử nghiệm), bạn có thể và có thể nên sử dụng mô hình hiệu ứng hỗn hợp chỉ định các quan sát với lỗi phân phối nhị phân. Xem Dixon 2004 .


Điểm số không phải là tỷ lệ mà là ước tính của những người tham gia theo thang điểm từ 0 đến 100 (dữ liệu được trình bày là phương tiện ước tính trên một số mục với thang điểm đó).
Henrik

Sau đó, phi thông số có vẻ là cách truyền thống để đi. Điều đó nói rằng, tôi đã tự hỏi nếu dữ liệu quy mô như vậy có thể được suy luận một cách hữu ích để xuất phát từ một quá trình nhị thức và do đó phân tích như vậy. Nghĩa là, bạn nói rằng mỗi điểm là giá trị trung bình của một số mục và giả sử mỗi mục là thang điểm 10, trong trường hợp đó, tôi đại diện cho câu trả lời là "8" như một chuỗi các thử nghiệm, 8 trong số các thử nghiệm có giá trị 1 và hai trong số đó có giá trị 0, tất cả được dán nhãn cùng nhãn trong một biến "mục". Với dữ liệu được mở rộng / nhị phân này, sau đó bạn có thể tính toán mô hình hiệu ứng hỗn hợp nhị thức.
Mike Lawrence

Theo nhận xét trước đây của tôi, tôi cần lưu ý rằng trong dữ liệu được mở rộng / nhị thức, bạn có thể mô hình biến "mục" là hiệu ứng cố định hoặc ngẫu nhiên. Tôi nghĩ rằng tôi muốn hướng tới việc mô hình hóa nó như một hiệu ứng cố định bởi vì có lẽ bạn có thể quan tâm đến việc không chỉ tính toán mà còn đánh giá sự khác biệt của vật phẩm và mọi tương tác có thể có giữa vật phẩm và các biến dự đoán khác.
Mike Lawrence

0

Chỉ cần thêm một cách tiếp cận khác, ezPermcủa ezgói:

> # preparing the data
> DV <- c(x1, y1)
> IV <- factor(rep(c("A", "B"), c(length(x1), length(y1))))
> id <- factor(rep(1:length(x1), 2))
> df <- data.frame(id=id,DV=DV,IV=IV)
>
> library(ez)
> ezPerm( data = df, dv = DV, wid = id, within = IV, perms = 1000)
|=========================|100%              Completed after 17 s 
  Effect     p p<.05
1     IV 0.016     *

Điều này có vẻ phù hợp với oneway_testcác coingói:

> library(coin)
> pvalue(oneway_test(DV ~ IV | id,  distribution=approximate(B=999999)))
[1] 0.01608002
99 percent confidence interval:
 0.01575782 0.01640682

Tuy nhiên, lưu ý rằng đây không phải là ví dụ tương tự được cung cấp bởi @caracal . Trong ví dụ của mình, anh ta bao gồm alternative="greater", do đó, sự khác biệt về giá trị p ~0.008so với ~0.016.

Các aovpgói đề xuất trong một trong các câu trả lời sản xuất p-giá trị nghi ngờ thấp hơn, và chạy một cách nghi ngờ nhanh ngay cả khi tôi cố gắng giá trị cao cho Iter, CamaxIterlập luận:

library(lmPerm)
summary(aovp(DV ~ IV + Error(id/IV), data=df,  maxIter = 1000000000))
summary(aovp(DV ~ IV + Error(id/IV), data=df,  Iter = 1000000000))
summary(aovp(DV ~ IV + Error(id/IV), data=df,  Ca = 0.00000000001))

Điều đó nói rằng, các đối số dường như giảm nhẹ các biến thể của giá trị p từ ~.03~.1(tôi đã nhận được một phạm vi lớn hơn mà báo cáo của @Henrik), 0.030.07.

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.