[Date Prev][Date Next][Thread Prev][Thread Next][Date index][Thread index]

RE: st: How to create a rank?

From   "Newson, Roger B" <>
To   <>
Subject   RE: st: How to create a rank?
Date   Tue, 4 Mar 2008 20:30:27 -0000

As it happens, at least one statistical reason for using the default
ranks of -rank()- is that these are the ranks used in the Wilcoxon
ranksum test (see on-line help for -ranksum-).

These default ranks can be used to define Somers' D(Y|X), where Y is the
variable being ranked and X is a binary variable. Somers' D is the
parameter behind the so-called "non-parametric" ranksum test. If X has
values 0 and 1, then Somers' D is the difference between 2
probabilities, namely the probability that a random Y-value from the
sub-population where X==1 is larger than a random Y-value from the
subpopulation where X==0 and the probability that a random Y-value from
the subpopulation where X==0 is larger than a random Y-value from the
subpopulation where X==1.

If the sample number is N, and the numbers of X-values equal to 0 and 1
are N_0 and N_1, respectively, and Y_ij is the j'th Y-value in the
subsampl;e where X==i for i in {0,1} and j from 1 to N_i, then we have
the equality

D(Y|X) = (2/N) * ( (Sum_j=1^N_1 Rank(Y_1j)/N_1) - (Sum_j=1^N_0
Rank(Y_0j)/N_0) )

or, in other words, the difference between the 2 subsample mean ranks
multiplied by 2/N. Under these conditions, Somers' D is also known as
the rank-biserial correlation (RBC) coefficient of Cureton (1956).

I would like to thank Mike Lacy of Colorado State University for drawing
my attention to Edward Cureton's work on Somers' D for binary X, which
pre-dates the more general definition of Somers' D for possibly
non-binary X (Somers, 1962).



Cureton EE. Rank-biserial correlation. Psychometrika 1956; 21(3):

Somers RH. A new asymmetric measure of association for ordinal
variables. American Sociological Review 1962; 27: 799-811.

Roger B Newson
Lecturer in Medical Statistics
Respiratory Epidemiology and Public Health Group
National Heart and Lung Institute
Imperial College London
Royal Brompton campus
Room 33, Emmanuel Kaye Building
1B Manresa Road
London SW3 6LR
Tel: +44 (0)20 7352 8121 ext 3381
Fax: +44 (0)20 7351 8322
Web page:
Departmental Web page:

Opinions expressed are those of the author, not of the institution.

-----Original Message-----
[] On Behalf Of Nick Cox
Sent: 04 March 2008 18:48
Subject: RE: st: How to create a rank?

Roger makes the main point, that -egen, rank()- supports other
definitions of 
ranks that always yield integers. That is explained, although tersely,
in the on-line help. 

For most statistical purposes, ranks for n values are defined by a
choice of whether highest or lowest has rank 1 and two rules: 

1. Equal values get equal ranks. 

2. The sum of the ranks is always equal to the sum of the integers 1 to

The extra options -field- -track- and -unique- break either 1 or 2 and
correspond to occasional requests for something different. 
I don't know of a statistical case for any of them: the rationale is
more likely to be for data reporting or graphics. 

The options have their origins in user-written functions written by
Richard Goldstein and myself. The original account is
accessible in

and is more leisurely than the on-line help. Understand that the syntax
details in STB-51 do not correspond to current Stata syntax. 


Newson, Roger B

If you check the entry for -rank()- under -whelp egen-, then you will
find that -rank()- supports multiple definitions of ranks. The default

rank(Y_j) = 0.5 + 0.5*Sum_k(Y_k==Y_j) + Sum_k(Y_k<Y_j)

where Y_j is the value of the variable being ranked in the j'th
observation, rank(Y_j) is its rank, Y_k is the k'th observation, and
Sum_k is the sum over all k from 1 to N, where N is the number of
observations being ranked. This definition implies that tied Y_j values
are given the mean of the ranks that they would have had, if they had
been ranked randomly. This often implies fractional ranks. However,
there are other possibilities on offer. You can decide which one is
right for your purposes.


Thank you. I solved my problem. By the way, if there exist ties, egen
rank = 
rank(revenue) also creates a problem. In my case, the command produced 
***.5, etc. instead of a whole number.

Nick Cox

> For ranks, use -egen, rank()-. It's as simple as that.


>>  I am trying to create 'rank' based on total revenues. I used the
> following
>>  command:
>>  sort revenue
>>  egen rank=group(revenue)
>>  The result is that the smallest revenue is 1 and the highest revenue
> is 100,
>>  for example. How can I reverse the rank? I want the highest revenue
> to be
>>  number '1'.

*   For searches and help try:

*   For searches and help try:

© Copyright 1996–2019 StataCorp LLC   |   Terms of use   |   Privacy   |   Contact us   |   What's new   |   Site index