[Rd] Inconsistencies in wilcox.test

Karolis Koncevičius k@ro||@@koncev|c|u@ @end|ng |rom gm@||@com
Sat Dec 7 21:38:34 CET 2019


Thank you for responding, and so quickly at that.

Yes, I do understand that this is a floating point issue.
However, since wilcox.test() works on ranks this might be a bit 
dangerous in my opinion. Maybe more so than for magnitude based tests.
Any small precision error will be ranked and it becomes a matter of 
errors being systematically >0 or <0 in one group.

Here is one example that I do not like:

x <- seq(0.9, 0.2, -0.1)
y <- seq(0.8, 0.1, -0.1)
wilcox.test(x, y, paired=TRUE, mu=0.1)

   Wilcoxon signed rank test with continuity correction

   data:  x and y
   V = 0, p-value = 0.01471
   alternative hypothesis: true location shift is not equal to 0.1
   # ... Warning, due to some precision deviations being duplicated ...

x-y
[1] 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1

sign(x-y - 0.1)
[1] -1 -1 -1 -1 -1 -1 -1  0


t.test() uses .Machine$double.eps with stderr and avoids this issue:

t.test(x, y, paired=TRUE, mu=0.1)
   Error in t.test.default(x, y, paired = TRUE, mu = 0.1) :
     data are essentially constant

On 2019-12-07 14:41, Ben Bolker wrote:
>
> Your second issue seems like a more or less unavoidable floating-point
>computation issue.  The paired test operates by computing differences
>between corresponding values of x and y.
>
>  It's not impossible to try to detect "almost-ties" (by testing for
>differences less than, say, sqrt(.Machine$double.eps)), but it's
>delicate and somewhat subjective/problem-dependent.
>
>  Example:
>
>options(digits=20)
>> unique(c(4,3,2)-c(3,2,1))
>[1] 1
>> unique(c(0.4,0.3,0.2)-c(0.3,0.2,0.1))
>[1] 0.100000000000000033307 0.099999999999999977796 0.100000000000000005551
>
>On 2019-12-07 1:55 p.m., Karolis Koncevičius wrote:
>> Hello,
>>
>> Writing to share some things I've found about wilcox.test() that seem a
>> a bit inconsistent.
>>
>> 1. Inf values are not removed if paired=TRUE
>>
>> # returns different results (Inf is removed):
>> wilcox.test(c(1,2,3,4), c(0,9,8,7))
>> wilcox.test(c(1,2,3,4), c(0,9,8,Inf))
>>
>> # returns the same result (Inf is left as value with highest rank):
>> wilcox.test(c(1,2,3,4), c(0,9,8,7), paired=TRUE)
>> wilcox.test(c(1,2,3,4), c(0,9,8,Inf), paired=TRUE)
>>
>> 2. tolerance issues with paired=TRUE.
>>
>> wilcox.test(c(4, 3, 2), c(3, 2, 1), paired=TRUE)
>> # ...
>> # Warning:  cannot compute exact p-value with ties
>>
>> wilcox.test(c(0.4,0.3,0.2), c(0.3,0.2,0.1), paired=TRUE)
>> # ...
>> # no warning
>>
>> 3. Always 'x observations are missing' when paired=TRUE
>>
>> wilcox.test(c(1,2), c(NA_integer_,NA_integer_), paired=TRUE)
>> # ...
>> # Error:  not enough (finite) 'x' observations
>>
>> 4. No indication if normal approximation was used:
>>
>> # different numbers, but same "method" name
>> wilcox.test(rnorm(10), exact=FALSE, correct=FALSE)
>> wilcox.test(rnorm(10), exact=TRUE, correct=FALSE)
>>
>>
>> From all of these I am pretty sure the 1st one is likely unintended,
>> so attaching a small patch to adjust it. Can also try patching others if
>> consensus is reached that the behavioiur has to be modified.
>>
>> Kind regards,
>> Karolis Koncevičius.
>>
>> ---
>>
>> Index: wilcox.test.R
>> ===================================================================
>> --- wilcox.test.R  (revision 77540)
>> +++ wilcox.test.R  (working copy)
>> @@ -42,7 +42,7 @@
>>          if(paired) {
>>              if(length(x) != length(y))
>>                  stop("'x' and 'y' must have the same length")
>> -            OK <- complete.cases(x, y)
>> +            OK <- is.finite(x) & is.finite(y)
>>              x <- x[OK] - y[OK]
>>              y <- NULL
>>          }
>>
>> ______________________________________________
>> R-devel using r-project.org mailing list
>> https://stat.ethz.ch/mailman/listinfo/r-devel
>
>______________________________________________
>R-devel using r-project.org mailing list
>https://stat.ethz.ch/mailman/listinfo/r-devel



More information about the R-devel mailing list