R wilcox.test()

时间:2015-05-21 10:10:13

标签: r

我对wilcox.test()函数中的正常近似有疑问。

我会直观地期望这些计算的结果是相同的:

vec1 <- c(10,11,12)
wilcox.test(vec1,rep(0,10),exact=FALSE,correct = FALSE)
wilcox.test(vec1,c(runif(8),0,0),exact=FALSE,correct=FALSE)

但这远非如此。 (0.0006056 vs 0.01112)

来自wilcox.test文档:

“如果样本包含少于50个有限值并且没有关系,则计算精确的p值。否则,使用正态近似值。”

我不清楚如何根据文档计算正态近似值。 搜索网(例如wiki,Mann-Whitney U-test),似乎可以通过以下方式计算:

U = sum of ranks of vec1 (-1 in R)
mU = length(vec1)*length(vec2)/2
sdU = sqrt(length(vec1)*length(vec2)*(length(vec1)+length(vec2)+1)/12)
z = (U-mU)/sdU
pval = 2*pnorm(-abs(z)) 

但由于U和这种情况下的向量长度相同,这显然不是R计算正态近似的方式。

所以我的问题是如何通过R中的wilcox.test()计算正态近似值。

1 个答案:

答案 0 :(得分:1)

上述公式的不一致是由于关联,在方差计算中会考虑到这种关系。以下是wilcox.test代码 R source

NTIES <- table(r)
z <- STATISTIC - n.x * n.y / 2
SIGMA <- sqrt((n.x * n.y / 12) *
    ((n.x + n.y + 1) - sum(NTIES^3 - NTIES) 
    / ((n.x + n.y) * (n.x + n.y - 1))))

其中n.xn.y是第一个和第二个样本的长度,r是组合样本的等级向量。

顺便说一句,将varU更改为其他名称,因为你采用了平方根。