Skip to contents

Applies a continuous "gravity" pull toward the player's centrality-implied ELO. This creates a stronger Bayesian prior that prevents low-centrality players from accumulating inflated ratings by dominating weak opponents in isolated ecosystems.

Usage

apply_centrality_correction(
  raw_elo,
  centrality_percentile,
  regression_strength = CENTRALITY_REGRESSION_STRENGTH,
  elo_per_percentile = CENTRALITY_ELO_PER_PERCENTILE
)

Arguments

raw_elo

Numeric. The player's current ELO after standard update.

centrality_percentile

Numeric. Player's centrality percentile (0-100). Use get_centrality_as_of() or get_cold_start_percentile() to obtain.

regression_strength

Numeric. Pull strength per delivery. Default uses CENTRALITY_REGRESSION_STRENGTH constant (0.005).

elo_per_percentile

Numeric. ELO points per percentile point. Default uses CENTRALITY_ELO_PER_PERCENTILE constant (6).

Value

Numeric. The corrected ELO rating.

Details

The regression is LINEAR and proportional to the gap between current ELO and centrality-implied ELO, providing consistent pull strength.

Formula: implied_elo = ELO_START + (centrality_percentile - 50) * ELO_PER_PERCENTILE correction = REGRESSION_STRENGTH * (implied_elo - raw_elo) corrected_elo = raw_elo + correction

Effect examples (with REGRESSION_STRENGTH = 0.005):

  • Player at 2400 ELO with 5% centrality (implied = 1130): correction = 0.005 * (1130 - 2400) = -6.35 per delivery Over 300 balls: ~1900 point regression toward implied level

  • Player at 1800 ELO with 90% centrality (implied = 1640): correction = 0.005 * (1640 - 1800) = -0.80 per delivery (Much smaller since high centrality justifies higher ELO)

Examples

# Low centrality player with inflated ELO
apply_centrality_correction(2400, 5)   # 2393.65 (pulls toward ~1130 implied)
#> [1] 2393.65

# Elite player with high ELO (justified by centrality)
apply_centrality_correction(2000, 95)  # 1998.35 (small correction)
#> [1] 1998.35

# Average player at average ELO
apply_centrality_correction(1400, 50)  # 1400 (no correction needed)
#> [1] 1400