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

See Also

Caron 2012 - Bayesian Inference for Generalized Bradley-Terry Models - Overview · MCMC Basics