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).
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
