Partial Rank Data with the hyper2 Package: Likelihood Functions for Generalized Bradley-Terry Models

Abstract:

Here I present the hyper2 package for generalized Bradley-Terry models and give examples from two competitive situations: single scull rowing, and the competitive cooking game show MasterChef Australia. A number of natural statistical hypotheses may be tested straightforwardly using the software.

Cite PDF Tweet

Author

Affiliation

Robin K. S. Hankin ORCID ID for Robin K. S. Hankin

AUT University

Published

Nov. 22, 2017

Received

Jul 7, 2017

Citation

Hankin, 2017

Volume

Pages

9/2

429 - 439


1 Introduction: the Bradley-Terry model

The Bradley-Terry model for datasets involving paired comparisons has wide uptake in the R community. However, existing functionalityIn theory, the deprecated hyperdirichlet package  provides similar functionality but it is slow and inefficient. It is limited to a small number of players and cannot cope with the examples considered here, and is superceded by hyper2, which was originally called hyperdirichlet2. is restricted to paired comparisons. The canonical problem is to consider n players who compete against one another; the basic inference problem is to estimate numbers p=(p1,,pn), pi0, pi=1 which correspond to player “strengths”. Information about the pi may be obtained from the results of paired comparisons between the players.

Applications are legion. The technique is widely used in a competitive sport context , in which matches are held between two opposing individuals or teams. It can also be applied to consumer choice experiments in which subjects are asked to choose a favourite from among two choices , in which case the pi are known as “worth parameters”.

If player i competes against player j, and wins with probability Pij then the likelihood function for p1,pn corresponding to a win for i is pipi+pj. As  point out, this may be expressed as

logit(Pij)=logpilogpj

and this fact may be used to estimate p using generalized linear models. However, consider the case where three competitors, i, j, and k compete. The probability that i wins is then pipi+pj+pk ; but there is no simple way to translate this likelihood function into a GLM. However, working directly with the likelihood function for p has several advantages which are illustrated below. The resulting likelihood functions may readily be generalized to accommodate more general order statistics, as in a race. In addition, likelihood functions may be specified for partial order statistics; also, observations in which a loser is identified may be given a likelihood function using natural R idiom in the package.

Further generalizations

Observing the winner w from a preselected set of competitors C has a likelihood function of pw/iCpi. But consider a more general situation in which two disjoint teams A and B compete; this would have likelihood iApi/iABpi. Such datasets motivate consideration of likelihood functions L() with (1)L(p)=sO(ispi)ns where O is a set of observations and s a subset of [n]={1,2,,n}; numbers ns are integers which may be positive or negative. The approach adopted by the hyperdirichlet package  is to store each of the 2n possible subsets of [n] together with an exponent: (2)s2[n](ispi)ns. but this was noted as being needlessly memory intensive and slow; it is limited, in practice, to n9.

Consider, for example, the following inference problem. Suppose we wish to make inferences about p1,,p20, the unknown parameters of a multinomial distribution with classes c1,,c20; we demand that pi0 and pi=1. If our observation is a single trial with result c1c2 [that is, the observation was known to be either c1 or c2], then a likelihood function might be L1(p1,,p20)=p1+p2. However, observe that this very simple example is not accessible to the hyperdirichlet package, which would have to store 220>106 powers, almost all of which are zero.

The hyper2 package uses the obvious solution to this problem: work with equation (1), rather than equation (2) and store only nonzero powers. However, this requires one to keep track of which subsets of [n] have nonzero powers. Suppose we wish to incorporate subsequent observations into our likelihood function p1. We might observe two further independent trials, with results c1c2 and c1c3 respectively, having a likelihood (p1+p2)(p1+p3). Then a likelihood function for all three trials might be L2(p1,,p20)=(p1+p2)2(p1+p3).

One natural representation for the likelihood function (p1+p2)2(p1+p3) would be as a function mapping subsets of {1,2,,20} to the real numbers; in this case we would map the set {1,2} to (the power) 2, and map {1,3} to 1. However, note that updating our likelihood function from L1 to L2 increments the power of p1+p2: some mechanism for identifying that the same sum appears in both marginal likelihood functions is needed.

2 The hyper2 package

One such mechanism is furnished by the C++ Standard Template Library’s “map” class to store and retrieve elements. In STL terminology, a map is an associative container that stores values indexed by a key, which is used to sort and uniquely identify the values. In the package, the key is a (STL) set of strictly positive integers n. The relevant typedef statements are:

typedef set<unsigned int> bracket;
typedef map<bracket, double> hyper2;

Thus a bracket object is a set of (unsigned) integers—here a sum of some pi; and a hyper2 object is a function that maps bracket objects to real numbers—here their power. The following C++ pseudocode shows how the aforementioned likelihood function would be created:

const bracket b1.insert({1,2});  // b1 = (p1+p2)
const bracket b2.insert({1,3});  // b2 = (p1+p3)

hyper2 L;       // L2 is the likelihood function

// first observation:
L[b1]  = 1;        // L = (p1+p2)

//second observation:
L[b1] += 1;        // L = (p1+p2)^2   # updating of existing map element
L[b2] += 1;        // L = (p1+p2)^2*(p1+p3)^1

In the STL, a map object stores keys and associated values in whatever order the software considers to be most propitious. This allows faster access and modification times but the order in which the maps, and indeed the elements of a set, are stored is not defined. In the case of likelihood functions such as Equation (1), this is not an issue because both multiplication and addition are associative and commutative operations. One side-effect of using this system is that the order of the bracket-power key-value pairs is not preserved.

The package in use

Table 1: Results of 88 chess matches (dataset chess in the aylmer package ) between three Grandmasters; entries show number of games won up to 2001 (draws are discarded). Topalov beats Anand 22-13; Anand beats Karpov 23-12; and Karpov beats Topalov 10-8.
Topalov Anand Karpov total
22 13 - 35
- 23 12 35
8 - 10 18
30 36 22 88

Consider the Chess dataset of the hyperdirchlet package, in which matches between three chess players are tabulated (Table 1). The Bradley-Terry model  is appropriate here , and the hyper2 package provides a likelihood function for the strengths of the players, p1,p2,p3 with p1+p2+p3=1. A likelihood function might be p130p236p322(p1+p2)35(p2+p3)35(p1+p3)18.

Using the hyper2 package, the R idiom to create this likelihood function would be a two-stage process. The first step would be to implement the numerator, that is the number of games won by each player:

R> library("hyper2")
R> chess <- hyper2(list(1, 2, 3), c(30, 36, 22))
R> chess
p1^30 * p2^36 * p3^22

Thus the chess object has the correct number of players (three), and has the numerator recorded correctly. To specify the denominator, which indicates the number of matches played by each pair of players, the package allows the following natural idiom:

R> chess[c(1, 2)] <- -35
R> chess[c(2, 3)] <- -35
R> chess[c(1, 3)] <- -18
R> chess
p1^30 * (p1 + p2)^-35 * (p1 + p3)^-18 * p2^36 * (p2 + p3)^-35 * p3^22

Note how the terms appear in an essentially random order, a side-effect of the efficient map class. It is sometimes desirable to name the elements explicitly:

R> pnames(chess) <- c("Topalov", "Anand", "Karpov")
R> chess
Topalov^30 * (Topalov + Anand)^-35 * (Topalov + Karpov)^-18 * Anand^36
* (Anand + Karpov)^-35 * Karpov^22

The package can calculate log-likelihoods:

R> loglik(chess, c(1/3, 1/3))
[1] -60.99695

[the second argument of function loglik() is a vector of length 2, third element of p being the “fillup” value ]; the gradient of the log-likelihood is given by function gradient():

R> gradient(chess, c(1/3, 1/3))
[1] 24.0 16.5

Such functionality allows the rapid location of the maximum likelihood estimate for p:

R> maxp(chess)
  Topalov     Anand    Karpov 
0.4036108 0.3405168 0.2558723 

3 Men’s single sculling in the 2016 Summer Olympic Games

In this section, I will take results from the 2016 Summer Olympic Games and create a likelihood function for the finishing order in Men’s single sculling. In Olympic sculling, up to six individual competitors race a small boat called a scull over a course of length 2 km; the object is to cross the finishing line first. Note that actual timings are irrelevant, given the model, as the sufficient statistic is the order in which competitors cross the finishing line. The 2016 Summer Olympics is a case in point: the gold and silver medallists finished less than 5 milliseconds apart, corresponding to a lead of 2.5cm. Following , the probability of competitor i winning in a field of j=1,,n is

pip1++pn.

However, there is information in the whole of the finishing order, not just the first across the line. Once the winner has been identified, then the runner-up may plausibly be considered to be the winner among the remaining competitors; and so on down the finishing order. Without loss of generality, if the order of finishing were 1,2,3,4,5,6, then a suitable likelihood function would be, following : (3)p1p1+p2+p3+p4+p5+p6p2p2+p3+p4+p5+p6p3p3+p4+p5+p6p4p4+p5+p6p5p5+p6p6p6 The result of heat 1 may be represented as fourniercabrerabhokanalsaensukkelmelisteilemb (a full list of the finishing order for all 25 events is given in the package as rowing.txt). The first step to incorporating the whole finishing order into a likelihood function is to define a hyper2 object which stores the names of the participants:

R> data("rowing")
R> H <- hyper2(pnames = allrowers)
R> H
(banna + bhokanal + boudina + cabrera + campbell + dongyong + drysdale
+ esquivel + fournier + gambour + garcia + grant + hoff + kelmelis +
khafaji + kholmirzayev + martin + memo + molnar + monasterio + obreno +
peebles + rivarola + rosso + saensuk + shcharbachenia + synek +
szymczyk + taieb + teilemb + yakovlev + zambrano)^0

Observe that the resulting likelihood function is uniform, as no information has as yet been included. Incorporating the information from Heat 1 into a likelihood function corresponding to Equation (3) is straightforward using the order_likelihood() function:

R> heat1 <- c("fournier", "cabrera", "bhokanal", "saensuk",
+   "kelmelis", "teilemb")
R> H <- H + order_likelihood(char2num(heat1, allrowers))
R> H
bhokanal * (bhokanal + cabrera + fournier + kelmelis + saensuk +
teilemb)^-1 * (bhokanal + cabrera + kelmelis + saensuk + teilemb)^-1 *
(bhokanal + kelmelis + saensuk + teilemb)^-1 * cabrera * fournier *
kelmelis * (kelmelis + saensuk + teilemb)^-1 * (kelmelis + teilemb)^-1
* saensuk

(variable heat1 shows the finishing order for Heat 1). Again observe that object H includes its terms in no apparent order. Although it would be possible to incorporate information from subsequent heats in a similar manner, the package includes a ready-made dataset, sculls2016:

R> head(sculls2016)
banna^4 * (banna + boudina + cabrera + molnar + obreno + rivarola)^-1 *
(banna + boudina + cabrera + molnar + rivarola)^-1 * (banna + boudina +
molnar + rivarola)^-1 * (banna + cabrera + campbell + grant + hoff)^-1
* (banna + cabrera + campbell + grant + hoff + szymczyk)^-1

Finding the maximum likelihood estimate for the parameter pbanna,,pzambrano is straightforward using the maxp() function, provided with the package (Figure 1). The optimization routine has access to derivatives which means that the estimate is found very quickly.

R> dotchart(maxp(sculls2016))
graphic without alt text
Figure 1: Maximum likelihood estimate for the strengths of the 32 competitors in the Men’s singles sculls in the 2016 Summer Olympics.

Figure 1 shows very clearly that the competitor with the highest strength is Drysdale, the gold medallist for this event. The bronze and silver medallists were Synek and Martin respectively, whose estimated strengths were second and third highest in the field.

4 MasterChef Australia

MasterChef Australia is a game show in which amateur cooks compete for a title . From a statistical perspective the contest is interesting because the typical show format is to identify the weakest player, who is then eliminated from the competition. Here, results from MasterChef Australia Series 6  will be analysed; an extended discussion of the data used is given in the package at masterchef.Rd.

We wish to make inferences about the contestents’ generalized Bradley-Terry strengths p1,,pn, pi=1. One informative event was a team challenge in which the contestants were split randomly into two teams, red and blue:

R> team_red <- c("Jamie", "Tracy", "Ben", "Amy", "Renae", "Georgia")
R> team_blue <- c("Brent", "Laura", "Emelia", "Colin", "Kira", "Tash")

We may represent the fact that the red team won as (4){Jamie+Tracy+Ben+Amy+Renae+Georgia}{Brent+Laura+Emelia+Colin+Kira+Tash}.

A plausible likelihood function can be generated using the standard assumption  that the competitive strength of a team is the sum of the strengths of its members. The likelihood function for the observation given in Equation (4) would then be (5)pJamie+pTracy+pBen+pAmy+pRenae+pGeorgiapJamie+pTracy+pBen+pAmy+pRenae+pGeorgia+pBrent+pLaura+pEmelia+pColin+pKira+pTash.

To generate a likelihood function in R, we need to set up a hyper2 object with appropriate contestants:

R> H <- hyper2(pnames = c(
+    "Amy", "Ben", "Brent", "Colin", "Emelia",
+    "Georgia", "Jamie", "Kira", "Laura", "Renae",
+    "Sarah", "Tash", "Tracy"))
R> H
(Amy + Ben + Brent + Colin + Emelia + Georgia + Jamie + Kira + Laura +
Renae + Sarah + Tash + Tracy)^0

Object H is a uniform likelihood function. The package R idiom for incorporating likelihood from Equation (5) is straightforward and natural:

R> H[team_red] <- +1
R> H[c(team_red, team_blue)] <- -1
R> H
(Amy + Ben + Brent + Colin + Emelia + Georgia + Jamie + Kira + Laura +
Renae + Tash + Tracy)^-1 * (Amy + Ben + Georgia + Jamie + Renae +
Tracy)

(Sarah did not take part). The above idiom makes it possible to define likelihoods for observations that have a peculiar probability structure, and I give two examples below.

One event involved eight competitors who were split randomly into four teams of two. The show format was specified in advance as follows: The teams were to be judged, and placed in order. The two top teams were to be declared safe, and the other two teams sent to an elimination trial from which an individual winner and loser were identified, the loser being obliged to leave the competition. The format for this event is also typical in MasterChef.

The observation was that Laura and Jamie’s team won, followed by Emelia and Amy, then Brent and Tracy. Ben and Renae’s team came last: {Laura+Jamie}{Emelia+Amy}{Brent+Tracy}{Ben+Renae}.

Again assuming that the team strength is the sum of its members’ strengths, a likelihood function for this observation may be obtained by using the order statistic technique of : (6)pLaura+pJamiepLaura+pJamie+pEmelia+pAmy+pBrent+pTracy+pBen+pRenaepEmelia+pAmypEmelia+pAmy+pBrent+pTracy+pBen+pRenaepBrent+pTracypBrent+pTracy+pBen+pRenae and we would like to incorporate information from this observation into object H, which is a likelihood function for the two-team challenge discussed above. The corresponding package idiom is natural:

R> blue   <- c("Laura", "Jamie")   
R> yellow <- c("Emelia", "Amy")    
R> green  <- c("Brent", "Tracy")   
R> red    <- c("Ben", "Renae")

(the teams were randomly assigned a colour). We may now generate a likelihood function for the observation that the order of teams was blue, yellow, green, red, as per Equation (6):

R> H[blue] <- 1
R> H[c(blue, yellow, green, red)] <- -1
R> H[yellow] <- 1
R> H[c(yellow, green, red)] <- -1
R> H[green] <- 1
R> H[c(green, red)] <- -1
R> H
(Amy + Ben + Brent + Colin + Emelia + Georgia + Jamie + Kira + Laura +
Renae + Tash + Tracy)^-1 * (Amy + Ben + Brent + Emelia + Jamie + Laura
+ Renae + Tracy)^-1 * (Amy + Ben + Brent + Emelia + Renae + Tracy)^-1 *
(Amy + Ben + Georgia + Jamie + Renae + Tracy) * (Amy + Emelia) * (Ben +
Brent + Renae + Tracy)^-1 * (Brent + Tracy) * (Jamie + Laura)

We may incorporate subsequent observations relating to the elimination trial among the four competitors comprising the losing two teams. The observation was that Laura won, and Renae came last, being eliminated. We might write (7){Laura}{Brent,Tracey,Ben}{Renae}, which indicates that Laura came first, then Brent/Tracey/Ben in some order, then Renae came last. For this observation a likelihood function, following , might be (8)L(p1,p2,p3,p4,p5)=Prob(p1p2p3p4p5p1p2p4p3p5)=Prob([abc]p1papbpcp5)=p1p1+p2+p3+p4+p5p2p2+p3+p4+p5p3p3+p4+p5p4p4+p5+p1p1+p2+p4+p3+p5p2p2+p4+p3+p5p4p4+p3+p5p3p3+p5+p1p1+p3+p2+p4+p5p3p3+p2+p4+p5p2p2+p4+p5p4p4+p5+ where Laura’s strength is shown as p1 etc for brevity. The R idiom is as follows:

R> L <- ggol(H, 
+    winner     = "Laura",
+    btm4       = c("Brent", "Tracy", "Ben"),
+    eliminated = "Renae")

Arguments to ggol() are disjoint subsets of the players, the subsets themselves being passed in competition order from best to worst. Object L includes information from the team challenge (via first argument H) and the elimination results. It is a list of length 3!=6 objects of class hyper2, each of which gives a likelihood function for a consistent total ordering of the competitors.

A final example (taken from MasterChef series 8, week 10) is given as a generalization of the likelihood. The format was as follows. Eight contestents were split randomly into four teams of two, the top two teams being declared safe. Note that the likelihood interpretation differs from the previous team challenge, in which the observation was an unambiguous team ranking: here, there is only a partial ranking of the teams and one might expect this observation to be less informative. Without loss of generality, the result may be represented as {p1+p2,p3+p4}{p5+p6,p7+p8} and a likelihood function on p1,p8 for this observation might be L(p1,,p8)=Prob({p1+p2}{p3+p4}{p5+p6}{p7+p8}{p1+p2}{p3+p4}{p7+p8}{p5+p6}{p3+p4}{p1+p2}{p5+p6}{p7+p8}{p3+p4}{p1+p2}{p5+p6}{p7+p8})=p1+p2p1+p2+p3+p4+p5+p6+p7+p8p3+p4p3+p4+p5+p6+p7+p8p5+p6p5+p6+p7+p8++p3+p4p3+p4+p1+p2+p7+p8+p5+p6p1+p2p3+p4+p7+p8+p5+p6p7+p8p7+p8+p5+p6.

Maximum likelihood estimation

The package provides an overall likelihood function for all informative judgements in the series on the final 13 players in object masterchef_series6. We may assess a number of related hypotheses using the package. The first step is to calculate the likelihood for the hypothesis that all players are of equal strength:

R> data("masterchef")
R> n <- 13   
R> equal_strengths <- rep(1/n,n-1)
R> like_series(equal_strengths, masterchef_series6)
[1] -78.68654

The strengths of the 13 players may be estimated using standard maximum likelihood techniques. This requires constrained optimization in order to prevent the search from passing through inadmissible points in p-space:

R> UI <- rbind(diag(n-1), -1)  
R> CI <- c(rep(0, n-1), -1)    
R> constrOptim(
+    theta = equal_strengths,
+    f = function(p){-like_series(p, L)}, 
+    ui = UI, ci = CI,
+    grad = NULL)
R> pmax_masterchef6
         Amy          Ben        Brent        Colin       Emelia      Georgia 
1.086182e-01 7.457970e-02 1.343553e-01 2.819606e-02 1.169766e-01 6.850455e-09 
       Jamie         Kira        Laura        Renae        Sarah         Tash 
1.065412e-01 2.055794e-02 2.750621e-01 4.070643e-02 2.803893e-02 1.142094e-09 
       Tracy 
6.636755e-02 
R> dotchart(pmax_masterchef6)
graphic without alt text
Figure 2: Maximum likelihood estimate for the strengths of the top 13 competitors in Series 6 of MasterChef Australia.

In the above code, UI enforces pi0 and CI enforces p1++pn11. The resulting maximum likelihood estimate, pmax_masterchef6 in the package, is shown pictorially in Figure 2. The support at the precalculated evaluate is

R> like_series(indep(pmax_masterchef6), masterchef_series6)
[1] -66.19652

and this allows us to test the hypothesis of equal player strengths: by Wilks’s theorem  the quantity 2logΛ (where Λ is the likelihood ratio) has an asymptotic null distribution of χ122. This corresponds to a p-value of

R> pchisq(2*(78.7-66.2), df = 12, lower.tail = FALSE)
[1] 0.01482287

showing that the observations do constitute evidence for differential player strengths. Figure 2 suggests that Laura, the runner-up, is actually a stronger competitor than the winner, Brent. We may assess this statistically by finding the maximum likelihood for p, subject to the constraint that pLaurapBrent:

R> UI <- rbind(UI, c(0, 0, 1, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0))  
R> CI <- c(CI, 0)
R> ans2 <-
+    constrOptim(
+      theta = equal_strengths,
+      f = function(p){-like_series(p, masterchef_series6)},  
+      grad = NULL,
+      ui = UI, ci = CI)

(updated object UI represents the constraint that Brent’s strength exceeds that of Laura). In the package, object pmax_masterchef6_constrained is included as the result of the above optimization, at which point the likelihood is

R> like_series(indep(pmax_masterchef6_constrained), masterchef_series6)
[1] -67.37642

The two estimates differ by about 1.18, less than the two-units-of-support criterion of ; alternatively, one may observe that the likelihood ratio is not in the tail region of its asymptotic distribution (χ12) as the p-value is about 0.12. This shows that there is no strong evidence for Laura’s competitive strength being higher than that of Brent. Similar techniques can be used to give a profile likelihood function; the resulting support interval for Laura’s strength is [0.145,0.465], which does not include 1130.077, the mean player strength.

However, further work would be needed to make statistically robust inferences from these findings. Suppose, for example, that all competitors have equal competitive ability: then all the pi are identical, and players are exchangeable. Under these circumstances, one could run a tournament and identify a winner. One might expect that the winning player would have the highest pi as estimated by pmax(). It is not clear at this stage how to interpret likelihood functions for players conditional on their competition performance. Another issue would be the applicability of Wilks’s theorem  which states only that the asymptotic distribution of 2logΛ is chi-squared. Although the likelihood ratio statistic is inherently meaningful, its sampling distribution is not clear at this stage.

5 Conclusions

Several generalizations of Bradley-Terry strengths are appropriate to describe competitive situations in which order statistics are sufficient.

The hyper2 package is introduced, providing a suite of functionality for generalizations of the partial rank analysis of . The software admits natural R idiom for translating commonly occurring observations into a likelihood function.

The package is used to calculate maximum likelihood estimates for generalized Bradley-Terry strengths in two competitive situations: Olympic rowing, and MasterChef Australia. The estimates for the competitors’ strengths are plausible; and several meaningful statistical hypotheses are assessed quantitatively.

CRAN packages used

hyper2, aylmer

CRAN Task Views implied by cited packages

Distributions

Note

This article is converted from a Legacy LaTeX article using the texor package. The pdf version is the official version. To report a problem with the html, refer to CONTRIBUTE on the R Journal homepage.

Footnotes

  1. In theory, the deprecated hyperdirichlet package  provides similar functionality but it is slow and inefficient. It is limited to a small number of players and cannot cope with the examples considered here, and is superceded by hyper2, which was originally called hyperdirichlet2.[↩]

References

J. Aitchison. The statistical analysis of compositional data. The Blackburn Press, 1986.
R. A. Bradley and M. E. Terry. The rank analysis of incomplete block designs I. The method of paired comparisons. Biometrika, 39: 324–345, 1952.
F. Caron and A. Doucet. Efficient Bayesian inference for generalized Bradley-Terry models. Journal of Computational and Graphical Statistics, 21(1): 174–196, 2012. URL https://dx.doi.org/10.1080/10618600.2012.638220.
D. E. Critchlow. Metric methods for analyzing partially ranked data. New York: Springer-Verlag, 1985.
A. W. F. Edwards. Likelihood (expanded edition). John Hopkins, 1992.
R. K. S. Hankin. A generalization of the Dirichlet distribution. Journal of Statistical Software, 33(11): 1–18, 2010. URL https//doi.org/10.18637/jss.v033.i11.
R. K. S. Hankin. Exact tests for two-way contingency tables with structural zeros. Journal of Statistical Software, 28(11): 1–19, 2008. URL https://doi.org/10.18637/jss.v028.i11.
R. Hatzinger and R. Dittrich. Prefmod: An R package for modeling preferences based on paired comparisons, rankings, or ratings. Journal of Statistical Software, 48: 1–31, 2012. URL https://10.18637/jss.v048.i10.
R. Luce. Individual choice behaviour: A theoretical analysis. New York: John Wiley & Sons, 1959.
D. R. Musser, G. J. Derge and A. Saini. STL tutorial and reference guide: C++ programming with the Standard Template Library. 3rd ed Addison-Wesley Professional, 2009.
R. L. Plackett. The analysis of permutations. Applied Statistics, 24: 193–202, 1975.
H. Turner and D. Firth. Bradley-terry models in R: The BradleyTerry2 package. Journal of Statistical Software, 48(9): 1–21, 2012. URL https://doi.org/10.18637/jss.v048.i09.
Wikipedia. MasterChef AustraliaWikipedia, the free encyclopedia. 2017a. URL https://en.wikipedia.org/w/index.php?title=MasterChef_Australia&oldid=761024807. [Online; accessed 1-February-2017].
Wikipedia. MasterChef Australia (series 6) — Wikipedia, the free encyclopedia. 2017b. URL https://en.wikipedia.org/w/index.php?title=MasterChef_Australia_(series_6)&oldid=762395535. [Online; accessed 1-February-2017].
S. S. Wilks. The large-sample distribution of the likelihood ratio for testing composite hypotheses. The Annals of Mathematical Statistics, 9(1): 60–62, 1938. URL http://www.jstor.org/stable/2957648.

Reuse

Text and figures are licensed under Creative Commons Attribution CC BY 4.0. The figures that have been reused from other sources don't fall under this license and can be recognized by a note in their caption: "Figure from ...".

Citation

For attribution, please cite this work as

Hankin, "Partial Rank Data with the hyper2 Package: Likelihood Functions for Generalized Bradley-Terry Models", The R Journal, 2017

BibTeX citation

@article{RJ-2017-061,
  author = {Hankin, Robin K. S.},
  title = {Partial Rank Data with the hyper2 Package: Likelihood Functions for Generalized Bradley-Terry Models},
  journal = {The R Journal},
  year = {2017},
  note = {https://rjournal.github.io/},
  volume = {9},
  issue = {2},
  issn = {2073-4859},
  pages = {429-439}
}