InkaKA
โ† Home

Is Terraforming Mars Random?

Pairwise Elo from 15 games ยท 66 player pairs ยท permutation testing

Data

15 games of Terraforming Mars on Board Game Arena since August 2024 between four players (anonymized as A, J,N, P). Each game has 3 or 4 players and a final score per player.

To turn each multi-player game into something testable, I expand the ranking into all pairwise matchups โ€” a 4-player game gives (42)=6\binom{4}{2} = 6 pairs, a 3-player game gives 3 โ€” for 66 pairs total across 15 games. The outcome for a pair is the score share of player A:

yA,B=scoreAscoreA+scoreBy_{A,B} = \frac{\text{score}_A}{\text{score}_A + \text{score}_B}

So a 90โ€“60 result gives y=0.6y = 0.6 for the winner; a tight 85โ€“84 gives yโ‰ˆ0.503y \approx 0.503. Ties score y=0.5y = 0.5 (no Elo update). Margin-weighted outcomes carry more information for the rating updates than a flat win/loss; the test scoring later is binary, which is a separate choice.

The prediction for each pair, made before the game is added to ratings, is the standard Elo expectation:

p^A,B=11+10(RBโˆ’RA)/400\hat{p}_{A,B} = \frac{1}{1 + 10^{(R_B - R_A)/400}}

After each game, each player's rating moves byKโˆ‘j(yP,jโˆ’p^P,j)K \sum_{j} (y_{P,j} - \hat{p}_{P,j})summed over their pairwise matchups in that game, withK=24K = 24and everyone starting at R0=100R_0 = 100. Ratings are computed from scratch using only these 15 games, so every prediction is strictly out-of-sample.

Final ratings

101.2
P
100.7
N
99.3
J
98.8
A

Mean absolute Elo difference at prediction time: 4.98 points. That's small โ€” an Elo gap of 100 implies a ~64% win probability for the favorite; our gap of 4.98 implies only ~51%. So even if Elo correctly ranks the players, the predictive edge it produces over this sample is thin, which limits the power of any test.

Elo over time

Outcome vs. Elo difference

Each dot is one of the 66 pairs, oriented so player A is the higher-Elo player. X-axis is the pre-game Elo gapRAโˆ’RBโ‰ฅ0R_A - R_B \geq 0; y-axis is the realized outcomeyA,By_{A,B} (A's score share). Dots above 0.5 mean Elo was right; below 0.5 is an upset. The dashed curve is the Elo predictionp^A,B\hat{p}_{A,B}: if Elo is predictive, dots should follow it. If outcomes are random, dots should scatter around 0.5 with no upward trend.

The test

Null hypothesis: Elo has no predictive power on pairwise outcomes. Equivalently, the rating assigned to each player is interchangeable with any other player's rating at the moment of prediction.

I test this by permutation. For each of N=10,000N = 10,000iterations, I shuffle which pre-game Elo gets assigned to which player within each game, recompute the pairwise predictions, and re-score them. This preserves the game structure (same players, same actual results, same marginal distribution of pre-game ratings) while severing the link between rating and identity. The p-value is the fraction of permuted runs that score at least as well as the observed Elo assignment.

All three metrics compare Elo's probability prediction against the binary outcome (did the higher-Elo player actually win?). Margin still drives Elo updates โ€” only the scoring is binary, matching the question "higher Elo should always win."

  • Log-likelihood(โˆ‘ylogโกp^+(1โˆ’y)logโก(1โˆ’p^)\sum y \log \hat{p} + (1-y) \log(1-\hat{p})with yโˆˆ{0,1}y \in \{0, 1\}). Rewards being well-calibrated, not just directionally right. Punishes overconfidence harshly, so with Elo predictions clustered near 0.5 this test has limited resolution.
  • Accuracy: fraction of pairs where the higher-Elo player won.
  • Binomial test: among non-tied pairs, is "higher Elo wins" rate significantly above 50%? (One-sided.)

Results

Log-likelihood (permutation)
p = 0.544n.s.
observed = -45.7782, null mean = -45.7598 ยฑ 0.1806
Accuracy (permutation)
p = 0.413n.s.
observed = 50.0%, null mean = 47.7% ยฑ 7.1%
Binomial vs. 50%
p = 0.500n.s.
32/63 = 50.8% [39.8%, 100.0%]

Permutation null distributions

The histograms below show what the test statistics look like under the null hypothesis (Elo shuffled within each game). The vertical line is the observed value with the actual Elo assignment. The p-value is the area to the right of the line.

Log-likelihood null
Accuracy null

Interpretation

All three tests fail to reject H0. The higher-Elo player wins32 of 63 pairs โ€”51%, indistinguishable from a coin flip (binomial p = 0.50). The permutation tests agree: the observed accuracy and log-likelihood sit squarely in the middle of their null distributions.

So: this sample is consistent with Terraforming Mars being randomfor these four players. That doesn't prove it is random โ€” it just means the 15-game history doesn't give Elo enough to work with to detect a skill gap if one exists.

Why so little signal? Final Elos span only ~2.4 points end-to-end (mean pre-game gap across all 66 pairs was 4.98), implying ~51% win probability for the "favorite." Updates from the non-tied games have largely cancelled โ€” everyone has beaten and lost to everyone else in roughly equal measure. The players are statistically indistinguishable given this evidence.

An earlier version of this analysis (with ties counted as full wins for the listed-higher player) found significant results โ€” but those were almost entirely driven by three tied games producing artificial ~24-point Elo swings each. With honest tie handling (y = 0.5, no Elo update) the apparent signal evaporates. A useful lesson in how much a small modeling choice can move a result when the underlying sample is small.

Caveats

  • Elo computed from scratch. The first few games' predictions are essentially 0.5 because all ratings start equal, which dilutes the test. A proper prior (e.g. each player's BGA Elo at the start of the window) would give the test more power. I don't have that data.
  • K-factor and initial rating are arbitrary. I picked K = 24and Rโ‚€ = 100. A lower K produces an even flatter trajectory; a higher K would inflate the swings from each game. With only 15 games the result is sensitive to these choices.
  • Margin-vs-binary for updates is a choice. Elo updates usey=sA/(sA+sB)y = s_A/(s_A + s_B), so a 110โ€“50 game moves ratings more than a 90โ€“85 game. Running Elo with binary updates (yโˆˆ{0,1}y \in \{0, 1\}) would dampen swings further and almost certainly push the test toward the same null-consistent conclusion.
  • The permutation null is conservative. Shuffling within games preserves correlation structure but doesn't account for the fact that ratings evolve. A more principled test might use sequential cross-validation. I think the permutation version is appropriate for the "is there any signal at all?" question.
  • 15 games is not a lot. Even if Elo is "really" right about player ranking, this sample size limits how confidently we can detect it.
All 66 pairs (raw)
GameDateABScoreElo AElo BP(A)y(A)
12024-08-24AP104โ€“841001000.500.55
12024-08-24AJ104โ€“831001000.500.56
12024-08-24PJ84โ€“831001000.500.50
22024-09-02AN79โ€“741031000.500.52
22024-09-02AP79โ€“69103990.510.53
22024-09-02AJ79โ€“65103990.510.55
22024-09-02NP74โ€“69100990.500.52
22024-09-02NJ74โ€“65100990.500.53
22024-09-02PJ69โ€“6599990.500.51
32024-12-07AN67โ€“671051010.510.50
32024-12-07AP67โ€“59105980.510.53
32024-12-07NP67โ€“59101980.500.53
42024-12-07PN105โ€“88971020.490.54
42024-12-07PA105โ€“85971050.490.55
42024-12-07NA88โ€“851021050.500.51
52025-02-23PA69โ€“651001030.490.51
52025-02-23PJ69โ€“61100960.500.53
52025-02-23PN69โ€“591001010.500.54
52025-02-23AJ65โ€“61103960.510.52
52025-02-23AN65โ€“591031010.500.52
52025-02-23JN61โ€“59961010.490.51
62025-10-18AP115โ€“1071031020.500.52
62025-10-18AN115โ€“98103990.510.54
62025-10-18PN107โ€“98102990.500.52
72025-12-20NP95โ€“93981020.490.51
72025-12-20NA95โ€“85981050.490.53
72025-12-20NJ95โ€“7198960.500.57
72025-12-20PA93โ€“851021050.500.52
72025-12-20PJ93โ€“71102960.510.57
72025-12-20AJ85โ€“71105960.510.54
82026-01-05PN89โ€“831041010.500.52
82026-01-05PJ89โ€“81104920.520.52
82026-01-05NJ83โ€“81101920.510.51
92026-01-17PJ81โ€“79104920.520.51
92026-01-17PA81โ€“791041040.500.51
92026-01-17PN81โ€“701041000.510.54
92026-01-17JA79โ€“79921040.480.50
92026-01-17JN79โ€“70921000.490.53
92026-01-17AN79โ€“701041000.510.53
102026-02-01PA110โ€“851051040.500.56
102026-02-01PN110โ€“74105980.510.60
102026-02-01AN85โ€“74104980.510.53
112026-02-07JP99โ€“93941080.480.52
112026-02-07JN99โ€“8594950.500.54
112026-02-07JA99โ€“80941030.490.55
112026-02-07PN93โ€“85108950.520.52
112026-02-07PA93โ€“801081030.510.54
112026-02-07NA85โ€“80951030.490.52
122026-04-11AP92โ€“851001080.490.52
122026-04-11AN92โ€“79100950.510.54
122026-04-11PN85โ€“79108950.520.52
132026-04-26JN77โ€“7797940.500.50
132026-04-26JA77โ€“68971010.490.53
132026-04-26JP77โ€“65971070.490.54
132026-04-26NA77โ€“68941010.490.53
132026-04-26NP77โ€“65941070.480.54
132026-04-26AP68โ€“651011070.490.51
142026-05-16JA94โ€“86991000.500.52
142026-05-16JP94โ€“67991040.490.58
142026-05-16AP86โ€“671001040.490.56
152026-05-16NP109โ€“97971000.490.53
152026-05-16NA109โ€“85971010.490.56
152026-05-16NJ109โ€“84971020.490.56
152026-05-16PA97โ€“851001010.500.53
152026-05-16PJ97โ€“841001020.500.54
152026-05-16AJ85โ€“841011020.500.50

Generated 2026-09-12T18:17:40Z. K = 24, Rโ‚€ = 100,10,000 permutations.