2014-09-18 3 views
3

Я пытаюсь провести тест значимости с использованием wilcox.test в R. Я хочу в основном проверить, действительно ли значение x находится внутри/вне дистрибутива d.альтернатива для wilcox.test в R

Я делаю следующее:

d = c(90,99,60,80,80,90,90,54,65,100,90,90,90,90,90) 
wilcox.test(60,d) 



    Wilcoxon rank sum test with continuity correction 

data: 60 and d 
W = 4.5, p-value = 0.5347 
alternative hypothesis: true location shift is not equal to 0 

Warning message: 
In wilcox.test.default(60, d) : cannot compute exact p-value with ties 

и в основном р-значение одинаково для большого диапазона испытаний номера я.

Я пробовал wilcox_test() из пакета coin, но я не могу заставить его работать, проверяя значение против распределения.

Есть ли альтернатива этому тесту, который делает то же самое и знает, как бороться со связями?

+0

Кстати, я не могу воспроизвести ваш пример - когда я использую 'x = 60' с вашим' d', я получаю 'W = 1.5',' p = 0.2018' вместо результатов, которые вы цитируете выше , –

+0

@Ben Bolker, потому что он использует 'wilcox_test()' из пакета 'coin', а не' wilcox.test() 'из пакета' stats'. –

+0

действительно ?? это не то, что они показывают в своем блоке кода. Вы можете заметить, что я выполнил «coin :: wilcox_test» в моем ответе ниже. –

ответ

7

Как вы беспокоитесь о неточных результатах? Я бы предположил, что приближение разумно для данных, задающих этот размер. (Мне удалось получить 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)) 

enter image description here

(exactRankTests добавлен по запросу, но при условии, что он больше не поддерживается и рекомендует пакет coin, я не уверен, насколько он надежный. Вы сами понимаете, какие различия между этими процедурами и которые лучше всего использовать ...)

Результаты имеют смысл здесь - проблема в том, что ваша мощность низкая. Если ваше значение равно полностью вне диапазона данных, для n = 15 это будет вероятность чего-то вроде 2 * (1/16) = 0,125 [т.е. вероятность того, что ваш образец окажется в качестве первого или последнего элемента в перестановке], что здесь не совсем то же самое, что и минимальное значение (wilcox.test: p = 0.105, wilcox_test: p = 0,08), но это может быть проблемой сближения , или у меня могут быть некоторые ошибки. Тем не менее, он находится в правильном футбольном поле.

+0

Бен, не могли бы вы также добавить процедуру 'wilcox.exact' из пакета' exactRankTests' в этот «тест»? Я сделал это и получил несколько разные результаты (этот пакет выдает предупреждение о том, что он больше не поддерживается - однако последнее обновление составляет всего 2 месяца) – Jealie

+0

(это 'pfun3 <- function (x) {wilcox.exact (x, d) $ p.value} '- я бы сделал это сам, но нет смысла писать новый ответ именно для этого ..). Итог: этот тест дает также несущественное значение p, однако с еще одним значением, которое выше (p = 0,3125). – Jealie

+0

Благодарим вас за этот замечательный ответ. Дело в том, что размер моих данных сильно варьируется. то, что я здесь даю, является лишь примером. Вопрос в следующем: будет ли изменение размера распределения сильно влиять на вычисление p-стоимости? Мне нужны p-значения, чтобы различать категории (представленные числом x). – ifreak

Смежные вопросы