您對非精確結果有多擔心?我猜想這個大小的數據集的近似值是合理的。 (我還是設法得到coin::wilcox_test
工作,其結果是沒有巨大的差別......)
d <- c(90,99,60,80,80,90,90,54,65,100,90,90,90,90,90)
pfun <- function(x) {
suppressWarnings(w <- wilcox.test(x,d)$p.value)
return(w)
}
testvec <- 30:120
p1 <- sapply(testvec,pfun)
library("coin")
pfun2 <- function(x) {
dd <- data.frame(y=c(x,d),f=factor(c(1,rep(2,length(d)))))
return(pvalue(wilcox_test(y~f,data=dd)))
}
p2 <- sapply(testvec,pfun2)
library("exactRankTests")
pfun3 <- function(x) {wilcox.exact(x,d)$p.value}
p3 <- sapply(testvec,pfun3)
圖片:
par(las=1,bty="l")
matplot(testvec,cbind(p1,p2,p3),type="s",
xlab="value",ylab="p value of wilcoxon test",lty=1,
ylim=c(0,1),col=c(1,2,4))
legend("topright",c("stats::wilcox.test","coin::wilcox_test",
"exactRankTests::wilcox.exact"),
lty=1,col=c(1,2,4))
(exactRankTests
按要求添加,但考慮到它不再被維護,並推薦coin
包,我不知道它有多可靠。你自己找出這些程序之間的區別是什麼以及哪個最好使用......)
結果在這裏有意義 - 問題在於你的能力低下。如果你的值是完全超出數據範圍,對於n = 15,這將是類似於2 *(1/16)= 0.125的概率。你的樣本以排列的第一個或最後一個元素結束的概率],這與此處的最小值不完全相同(wilcox.test
:p = 0.105,wilcox_test
:p = 0.08),但這可能是一個近似問題,或者我可能有一些細節錯誤。儘管如此,它是在正確的場地。
順便說一句,我不能再現你的例子 - 當我用你的'd'使用'x = 60'時,我得到'W = 1.5','p = 0.2018'而不是你上面引用的結果。 – 2014-09-18 18:28:40
@Ben Bolker,因爲他使用'coin'包中的'wilcox_test()',而不是'stats'包中的'wilcox.test()'。 – 2016-12-30 02:35:19
真的嗎?這不是他們在代碼塊中顯示的內容。你可能注意到我在下面的答案中實現了'coin :: wilcox_test'。 – 2016-12-30 02:51:43