Rank orderings under the Luce choice rule #
This file defines the probability of a complete rank ordering as the product
of successive top-choices from shrinking alternative sets — the ranking
postulate of [Luc59] (§2.F, p. 72), now known as the Plackett–Luce model
([Pla75]). We show that these probabilities sum to 1 over all
permutations, that marginalizing over the first choice recovers pChoice,
and that adjacent transpositions (rankProb_swap_div) and expected rank
(expectedRank_lt_of_score_gt) both respect the score order.
Main definitions #
rankProb: probability of a ranking (as aList) under the Luce rule.expectedRank: expected (1-indexed) rank of an alternative.
References #
The tail suffix of a list starting at position i (0-indexed).
Used to represent the shrinking alternative set at each step of ranking.
Equations
- Core.tailSuffix ranking i = (List.drop i ranking).toFinset
Instances For
Probability of a single step in the ranking: choosing ranking[i] from
the remaining alternatives {ranking[i], ranking[i+1],...}.
Equations
- Core.rankStepProb ra s ranking i = match ranking[i]? with | none => 1 | some a => ra.pChoice s (Core.tailSuffix ranking i) a
Instances For
Ranking probability ([Luc59]'s ranking postulate, p. 72):
The probability of observing the complete rank ordering a₁ > a₂ >... > aₙ
is the product of successive top-choices from shrinking sets:
P(a₁ > a₂ >... > aₙ) = P(a₁ | {a₁,...,aₙ}) · P(a₂ | {a₂,...,aₙ}) ·... · P(aₙ₋₁ | {aₙ₋₁, aₙ})
Under the Luce model with ratio scale v, this becomes:
P(a₁ >... > aₙ) = ∏ᵢ v(aᵢ) / ∑ⱼ≥ᵢ v(aⱼ)
Equations
- Core.rankProb ra s ranking = List.foldl (fun (acc : ℝ) (i : ℕ) => acc * Core.rankStepProb ra s ranking i) 1 (List.range ranking.length)
Instances For
Recursive characterization of ranking probability: the first-choice probability times the ranking probability of the remaining alternatives.
Equations
- Core.rankProbRec ra s [] = 1
- Core.rankProbRec ra s (a :: rest) = ra.pChoice s (a :: rest).toFinset a * Core.rankProbRec ra s rest
Instances For
rankProbRec agrees with the explicit rankProb definition.
Proof by list induction. The key steps use:
List.range_succ_eq_mapto decomposerange(n+1) = 0 :: map succ (range n)List.foldl_mapto shift indices through the mapfoldl_mul_comm_initto factor out the first-choice probability- Definitional equalities:
rankStepProb (a::rest) 0 = pChoiceandrankStepProb (a::rest) (i+1) = rankStepProb rest i
Ranking probability is non-negative: each factor is a pChoice value,
hence non-negative.
rankProbRec is positive when all scores are positive.
Ranking probability is positive when all scores are positive.
Score-ratio form #
The score-ratio factor at position i: v(aᵢ) / ∑ⱼ≥ᵢ v(aⱼ).
This is the i-th factor in the score-product form of ranking probability.
Equations
- One or more equations did not get rendered due to their size.
Instances For
The score-product form of ranking probability:
∏ᵢ v(aᵢ) / ∑ⱼ≥ᵢ v(aⱼ).
Equations
- Core.rankProbScoreProd ra s ranking = List.foldl (fun (acc : ℝ) (i : ℕ) => acc * Core.scoreRatio ra s ranking i) 1 (List.range ranking.length)
Instances For
Score form: ranking probability equals the product of score ratios.
Summation over permutations #
All permutations of a finset, as lists.
Equations
- Core.allRankings T = T.val.toList.permutations.toFinset
Instances For
Every ranking in allRankings T is a permutation of T.
Uses List.mem_permutations, List.perm_ext_iff_of_nodup, and
Multiset.mem_toList from mathlib to connect the List-level
permutation API with Finset membership.
Decomposition of allRankings by first element #
Ranking probabilities sum to 1 #
Ranking probabilities sum to 1: over all n! permutations of the
alternative set, ranking probabilities form a proper distribution.
Requires strictly positive scores (Luce's ratio scale assumption).
Marginalization: recovering pChoice #
Rankings starting with a given element a.
Equations
- Core.rankingsStartingWith T a = {r ∈ Core.allRankings T | r.head? = some a}
Instances For
Marginal first-choice: summing the ranking probability over all
rankings that start with a recovers the choice probability
pChoice(a, T). ([Luc59]'s own Theorem 9, p. 72, is the pairwise
analogue: P(x,y) is recovered by summing over rankings placing x
above y.)
Adjacent transpositions #
One step of rankProbRec in score form, for a head not repeated in the
tail.
Swapping two adjacent elements scales the ranking probability by
(v x + S) / (v y + S), where S sums the scores of the remaining
alternatives — not by the naive v x / v y: the second step of each
ranking draws from a different set.
Swapping adjacent elements into score order strictly increases ranking
probability: if v y < v x, then x before y is the more probable
order.
Expected rank #
The rank of element a in a ranking (1-indexed, so rank 1 = best).
Returns 0 if a is not in the ranking.
Equations
- Core.rankOf ranking a = if a ∈ ranking then List.findIdx (fun (x : A) => x == a) ranking + 1 else 0
Instances For
Expected rank of alternative a under the ranking distribution.
E[rank(a)] = ∑_σ P(σ) · rank(a, σ)
The monotonicity theorem expectedRank_lt_of_score_gt shows that
alternatives with higher v(a) have lower (better) expected rank.
Equations
- Core.expectedRank ra s T a = ∑ r ∈ Core.allRankings T, Core.rankProb ra s r * ↑(Core.rankOf r a)
Instances For
Expected rank monotonicity: infrastructure #
Expected rank decomposition: #
E[rank(a,T)] = 1 + ∑_{b≠a} pChoice(b) · E[rank(a,T\{b})]
Cross-set monotonicity #
Expected rank monotonicity: higher score implies lower expected rank.
If v(a₁) > v(a₂) then E[rank(a₁)] < E[rank(a₂)]: the alternative
with higher ratio-scale value is expected to be ranked higher (closer to 1).
This is a natural property of the Plackett–Luce model ([Luc59], [Pla75]) but does not appear as a formal theorem in either source. [Luc59] adopts the product decomposition as his ranking postulate and [Mar95] covers estimation, but neither states the expected rank monotonicity result explicitly.
Equal scores imply equal expected ranks: if score(a₁) = score(a₂),
then E[rank(a₁, T)] = E[rank(a₂, T)].
The proof uses the conditional expectation decomposition and antisymmetry:
decompose both expected ranks by first element, show the common terms are
equal by induction, and show the cross terms are equal by applying
expectedRank_cross_le_aux in both directions (since v(a₁) ≥ v(a₂) and
v(a₂) ≥ v(a₁) both hold).