General Instructions

To do each example, just click the Submit button. You do not have to type in any R instructions or specify a dataset. That's already done for you.

The Wilcoxon Signed Rank Test

Example 3.1 in Hollander and Wolfe.



The Associated Point Estimate (Median of the Walsh Averages)

The Hodges-Lehmann estimator associated with the signed rank test is the median of the Walsh averages, which are the n (n + 1) / 2 averages of pairs of differences

(Zi + Zj) / 2,     i ≤ j

The following somewhat tricky code computes the Walsh averages and their median.

Example 3.3 in Hollander and Wolfe.



The Associated Confidence Interval

Very similar to the confidence interval associated with the sign test, the confidence interval has the form

(W(k), W(m + 1 - k))

where m = n (n + 1) / 2 is the number of Walsh averages, and, as always, parentheses on subscripts indicates order statistics, in this case, of the Walsh averages Wk. That is, one counts in k from each end in the list of sorted Walsh averages to find the confidence interval.

Example 3.4 in Hollander and Wolfe.



The R Functions wilcox.test and wilcox.exact

All of the above can be done in one shot with the R function wilcox.test (on-line help).

Only one complaint. It does not report the actual achieved confidence level (here 96.1%) but rather the confidence level asked for (here 95%, the default). If you want to know the actual achieved confidence level, you'll have to use the code in the confidence interval section above. But you can use wilcox.test as a convenient check (the intervals should agree).

Warning About Ties and Zeros

Do not use the wilcox.test function when there are ties or zeros in the data. See the following section.

There is a function wilcox.exact explained below that does do hypothesis tests correctly in the presence of ties and zeros (if you accept the zero fudge).

Neither wilcox.test nor wilcox.exact calculate point estimates or confidence intervals correctly in the presence of ties or zeros.

Do not use for confidence intervals or point estimates!

Ties and Zeros

What if the continuity assumption is false and there are tied absolute Z values or zero Z values?

First, neither ties nor zeros should make any difference in calculating point estimators or confidence intervals.

This is a bit of programmer brain damage (PBD) in the implementation of the wilcox.test and wilcox.exact functions. They change the way they calculate point estimates and confidence intervals when there are ties or zeros. But they shouldn't.

The Zero Fudge

What we called the zero fudge in the context of the sign test (because it is fairly bogus there) makes much more sense in the context of the signed rank test. Zero values in the vector Z = Y − X of paired differences should get the smallest possible absolute rank because zero is smaller in absolute value than any other number. We might as well give them rank zero, starting counting at zero rather than at one. Then they make no contribution to the sum of ranks statistic.

Here's another way to see the same thing. Let's compare three procedures: Student t, signed rank, and sign.

This analysis explains why the Wilcoxon should treat differences of zero size just like the Student t, that is, they don't count at all.

There is another issue about the zero fudge. As explained in the section about the zero fudge for the sign test, the null hypothesis for the sign test with zero fudge is

pr(Zi < μ) = pr(Zi > μ).

which generally is neither true nor interesting for the sign test but which is true under the usual assumptions for the Wilcoxon signed rank test. We are already assuming the distribution of the differences is symmetric, and that implies the probability to either side of the population median μ is the same.

All that having been said, I still feel that there is something wrong with deliberately ignoring data favoring the null hypothesis. It still seems like cheating.

Thus we won't argue (at least not much) with the zero fudge for the signed rank test. We will start our hypothesis test calculations (don't do this for point estimates or confidence intervals) with

z <- y - z
z <- z - mu
z < z[z != 0]

Tied Ranks

The preceding section takes care of one kind of violation of the continuity assumption. But there's a second kind of violation that causes another problem.

If there are ties among the magnitudes of the Z values, then

So there are really two issues to be resolved.

  1. What test statistic?
  2. What is the sampling distribution of the test statistic under the null hypothesis.

The standard solution to the first problem is to use so-called tied ranks in which each of a set of tied magnitudes is assigned the average of the ranks they otherwise would have gotten if they had been slightly different (and untied). The R rank function automatically does this. So the ranks are done the same as before. And the test statistic is calculated from the ranks the same as before.

r <- rank(abs(z))
tplus <- sum(r[z > 0])

The Wrong Thing

The Wrong Thing (with a capital W and a capital T) is to just ignore the fact that tied ranks change the sampling distribution and just use tables in books or computer functions that are based on the assumption of no ties.

This is not quite as bad as it sounds, because tied ranks were thought up in the first place with the idea of not changing the sampling distribution much. So this does give wrong answers, but not horribly wrong.

Example 3.2 in Hollander and Wolfe.


As long as you have a computer, why not use it? There are only 2n points in the sample space of the sampling distribution of the test statistic under the null hypothesis corresponding to all possible choices of signs to the ranks. In this case, 212 = 4096, not a particularly big number for a computer (although out of the question for hand calculation). So just do it.

There is an R function wilcox.exact (on-line help) that does the job.

Example 3.2 in Hollander and Wolfe.


The Large Sample Approximation

We have been ignoring up to now, large sample (also called asymptotic) approximations to sampling distributions of test statistics. Why use an approximation when the computer can do it exactly?

However, the computer can't do it exactly for really large n. The functions psignrank and qsignrank crash when n is larger than about 50. The function wilcox.exact may also crash for large n but I haven't experimented with it.

Thus the need for large sample approximation.

It is a fact, which Hollander and Wolfe derive on pp. 44–45, that the mean and variance of the sampling distribution of T+ are

E(T+) = n (n + 1) / 4
var(T+) = n (n + 1) (2 n + 1) / 24

under the assumption of continuity (hence no ties).

When there are ties, the mean stays the same but the variance is reduced by a quantity that, because it has a summation sign in it, doesn't look good in web pages. Just see equation (3.13) in Hollander and Wolfe.

Here's how R uses this approximation.

Example 3.2 in Hollander and Wolfe.


The R function wilcox.test always uses 1 / 2 for the correction for continuity even though we can see that 1 / 4 works better in this case.

Fuzzy Procedures

These are analogous to the fuzzy procedures for the sign test explained on the sign test and related procedures page and on the fuzzy confidence intervals and P-values page.

Since they are so similar, we won't belabor the issues and interpretations. The only difference is that for fuzzy confidence intervals the jumps in the plot are at Walsh averages (no surprise) rather than at order statistics and for fuzzy P-values they are at numbers in the CDF table for the null distribution of the test statistic, which is now the Wilcoxon signed rank distribution rather than the symmetric binomial distribution.

In short, the distributions have changed but everything else remains the same.

Fuzzy P-Values


Interpretation: moderate evidence against the null hypothesis of no difference.

Is the fuzzy P-value really worse the the mess that preceded it in the literature and textbooks? Why not just do a right thing?

Fuzzy Confidence Intervals


Since these are so close to 95%, perhaps either is just as good as the fuzzy interval for practical purposes, but does what it was asked to do, whether it is useful or not. Here the ordinary intervals are fairly simple and close to what is wanted, so the advantage of fuzzy is not so clear here.