我对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()计算正态近似值。
答案 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.x
,n.y
是第一个和第二个样本的长度,r
是组合样本的等级向量。
顺便说一句,将varU
更改为其他名称,因为你采用了平方根。