Caron 2012 - Bradley-Terry Likelihood and Latent Exponential Augmentation
Summary
The Bradley-Terry model has a Gamma-augmented complete likelihood. Introducing (the sum of the minimum exponential arrival times over the matches of a pair) gives Hunter’s MM update as an EM step and a two-block Gibbs sampler with Gamma conditionals.
Overview
Zermelo (1929) and Bradley & Terry (1952) model pairwise contests among elements with positive “skill” . With = number of times beat and :
Bradley-Terry log-likelihood
The classical Thurstonian augmentation draws for every match and lets the smaller arrival time win: . Caron & Doucet instead keep only the aggregated minima, which reduces the fraction of missing information and so speeds EM and the sampler (Liu 2001).
Main Content
Latent variables
For each pair with , , so
with the Gamma law of shape and inverse scale (rate) .
Complete-data log-likelihood (their Eq. 3):
With the conjugate prior and (wins):
EM / MM update for MAP
At iteration ,
For (flat prior) the MAP equals the ML estimate and this is exactly Hunter’s (2004, Eq. 10) minorizing-function update, i.e. the Zermelo iteration.
Proof sketch. The E-step expectation of is (mean of a Gamma). The Q-function is plus constants; it separates across and each term is maximised by the stated ratio.
Data-augmentation (Gibbs) sampler
Iterate: (1) for each pair with ; (2) .
No proposal tuning is needed, and every update is a standard Gamma draw.
Examples
Three-player toy tournament
Setup. Wins: A beat B 6 times, B beat A 2 times; B beat C 5 times, C beat B 3 times; A beat C 4 times, C beat A 4 times. Flat prior (). Solution. Run the iteration and normalise. It converges to (B and C tie: each has 8 wins in 20 games, A has 10). Interpretation. Only ratios of are identified (see Caron 2012 - Identifiability, Hyperparameters and Further Extensions), so report or log-ratios.
import numpy as np
w = np.array([[0,6,4],[2,0,5],[4,3,0]], float) # w[i,j]: i beat j
n = w + w.T
lam = np.ones(3)/3
for _ in range(500):
denom = (n / (lam[:,None] + lam[None,:] + np.eye(3))).sum(1)
lam = w.sum(1) / denom
lam /= lam.sum()
print(lam)PyMC-style sketch (untested; the logit parameterisation used in E67):
import pymc as pm, numpy as np
with pm.Model():
beta = pm.Normal("beta", 0, 1, shape=K)
beta_c = beta - beta.mean() # sum-to-zero identification
pm.Binomial("wins", n=n_ij, p=pm.math.sigmoid(beta_c[i_idx]-beta_c[j_idx]), observed=w_ij)Connections
- The Bayesian log-skill model with a Gaussian prior on is the hierarchical-shrinkage analogue of the Gamma prior here (Hierarchical Models).
- Identifiability and rescaling: Caron 2012 - Identifiability, Hyperparameters and Further Extensions.
- Dynamic version (skills drifting in time): Elo, Glicko and TrueSkill - Dynamic Skill Ratings (Concept Note).
See Also
Caron 2012 - Bayesian Inference for Generalized Bradley-Terry Models - Overview · MCMC Basics