4 votos

Obtener clasificación a partir de la comparación en parejas con resultado continuo

Tengo algunos datos de comparaciones entre jugadores con un valor continuo como resultado, por ejemplo, así:

Jugador1 Jugador2 Puntaje
---------------------
A       B       12.38
A       C        4.82
C       B        6.41
C       D        1.39
A       D       -1.05  
...    ...       ...

Donde un puntaje positivo significa que Jugador1 ganó contra Jugador2 por una cantidad significativa de puntos cuantificados por "Puntaje", y un puntaje negativo significa que Jugador2 ganó. Tenga en cuenta que puede haber incongruencias en los puntajes obtenidos, como en la tabla: A > C, C > D, pero A < D.

He visto que hay muchas técnicas para puntuar jugadores cuando se obtiene un resultado binario (solo la información sobre quién gana; ver aquí o aquí) con el sistema de puntuación ELO o el Modelo de Bradley-Terry. Sin embargo, creo que sería una pérdida innecesaria de información codificar cada resultado del juego como 0-1. ¿Conoces alguna forma de incorporar de alguna manera esa información en un modelo? Idealmente, lo que me interesa sería una medida continua de habilidad en el juego (mejor) o una clasificación de los jugadores.

7voto

clp Puntos 216

Nota: el sistema Elo es continuo. Una diferencia de rating se convierte en un porcentaje de puntaje esperado tal como lo describe Elo en El rating de jugadores de ajedrez, capítulo 8.94, Desarrollo de la Tabla de Expectativas en Porcentaje.

Las probabilidades normales pueden tomarse directamente de las tablas estándar de las áreas bajo la curva normal cuando la diferencia de rating se expresa como una puntuación z. Dado que la desviación estándar de las actuaciones individuales se define como 200 puntos, la desviación estándar de las diferencias en las actuaciones se convierte en *sqrt(2) o 282.84. El valor z de una diferencia entonces es D/282.84. Este z entonces divide el área bajo la curva en dos partes, la más grande dando P para el jugador con mayor rating y la más pequeña dando P para el jugador con menor rating.

Por ejemplo, supongamos D = 160. Entonces z = 160/282.84 = .566. La tabla da .7143 y .2857 como las áreas de las dos porciones bajo la curva. Estas probabilidades se redondean a dos cifras en la tabla 2.11.

En el ajedrez, el tamaño de estas probabilidades coincide con los puntajes reales, 1, ½ , 0. Un puntaje esperado de porcentaje del 50% corresponde a un empate (½). En otros sistemas de puntuación, las probabilidades de ganar deben convertirse en puntos de puntuación. Cuando el sistema de puntuación tiene un puntaje limitado, como en partidos (2, 1, 0), fútbol (3, 1, 0), puntajes de equipo, esta conversión es directa. Se necesita información adicional para mapear el sistema de puntuación como se describe arriba.

Una buena introducción al sistema Elo y sus precursores se puede encontrar en Mark E. Glickman, Nota Introductoria a 1928.

El sistema de rating de FIDE se describe en:

Actualización 1 - Fórmula de Rating Actual

Un jugador con rating propio = 2000, se encuentra con cinco jugadores con ratings 1600, 1700, 1800, 1900, 2100 y obtiene 12,38, 4,82, 6,41, 1,39, -1,05 puntos respectivamente. El cambio de rating se calcula de la siguiente manera.

Supongamos que el puntaje anterior se distribuye normalmente con media 0 y desviación estándar 4. Estos puntajes se pueden traducir en un puntaje 'normalizado' usando la fórmula (en R), W = pnorm(score, 0, sd=4). Luego, el puntaje esperado We se calcula utilizando las fórmulas de Elo. Finalmente, cuando un sistema de rating se lleva a cabo de forma continua, el cambio de rating se determina utilizando la fórmula de rating actual de Elo Rn = R0 + K(W-We).

Ejemplo de cálculo del método de evaluación continuo de Elo.

              Rating Propio = 2000   
Contrincante  Puntaje     W (*)   D     We (**) 
1600      12,38     1,00    400   0,92  
1700       4,82     0,89    300   0,85  
1800       6,41     0,95    200   0,76  
1900       1,39     0,64    100   0,64  
2100      -1,05     0,40   -100   0,36  
Total               3,86     -    3,53  =    0,33
                               Factor K =   10
                          Cambio de Rating =    3,32
                                     Rn = 2003
 (*) pnorm(x, 0, sd=4)
(**) pnorm(D, 0, sd=2000/7)

Actualización 2 - Rating de un grupo de jugadores sin rating

Supongamos que queremos determinar el rating basado en un solo evento como en la pregunta, sin asumir el rating de estos jugadores.

                                      Logístico Relativo
 Rating  Jugador  A     B     C     D  rating   dist. 
 1800     A      x  1.00  0.89  0.40   2017    2035
 1800     B   0.00     x  0.05     .   1372    1317
 1800     C   0.11  0.95     x  0.64   1878    1897
 1800     D   0.60    .   0.36     .   1951    1951

Por ejemplo, sea x un vector de rating arbitrario x = (1800, 1800, 1800, 1800)T. Para la diferencia de rating D, la probabilidad de puntuación se establece en pnorm(D, 0, 2000 / 7, 1). Sobre esta base, calcula el puntaje esperado We(x). Ahora define la función f(x) = We(x) - W. Las raíces de esta función son los ratings requeridos. La función anterior forma un sistema de ecuaciones no lineales que pueden resolverse mediante métodos numéricos, por ejemplo, en Calc, Excel, Python o R.

Para sistemas pequeños, un procedimiento iterativo es práctico:

  • R0 = (c, ..., c ).
  • Ri+1 = Ri - delta.

Donde delta es ya sea

  • (We - W) / 800. (Newton Raphson) o
  • ln(We/W) * 400 / ln(10), calibrado para sumar = 0. (Zermelo)

La solución de este torneo, los ratings relativos, son únicos hasta una constante.

Actualización 3 - Dominios Indivisibles

Supongamos que el jugador C en el ejemplo anterior vence al jugador B por 1 a 0. Entonces no existe un camino no perdedor entre B y los otros jugadores en el torneo. Cuando se usa una curva sigmoidal entre cero y 100% como una probabilidad de puntuación como en el sistema Elo, no existe una solución limitada. El jugador B es "infinitamente" más débil que los otros jugadores. Una solución limitada existe si y solo si el grafo subyacente del torneo está fuertemente conectado.

                                     Lineal Logístico Relativo
 Rating  Jugador  A     B     C     D  rating   dist.   dist. 
 1800     A      x  1.00  0.89  0.40   1871    1870    1958
 1800     B   0.00     x  0.00     .    -      -     1504
 1800     C   0.11  1.00     x  0.64   1739    1740    1850
 1800     D   0.60    .   0.36     .   1790    1790    1818

Si se postula que la probabilidad de puntuación P depende linealmente de la diferencia de rating D, por ejemplo P = D / 4C + 50%, entonces todos los ratings se vuelven finitos, incluso si el dominio es divisible, como en este ejemplo. C = 200 es el intervalo de clase Elo. La constante 1/4 es la pendiente de la expectativa logística en x = 0. Nota que estos ratings son equivalentes a ratings de mínimos cuadrados.

1voto

Björn Puntos 457

Una solución obvia (especialmente si solo necesitas calcular esto una vez) es analizar tus datos con un modelo de efectos mixtos, donde hay un efecto aleatorio de jugador. Cada partido tiene dos jugadores, por lo que necesitas una versión de modelo con membresías múltiples (siempre exactamente 2 membresías) de dicho modelo. Mira por ejemplo esta publicación de blog sobre cómo ajustar un modelo de este tipo en R, pero es aún más fácil hacerlo en algo como el paquete de R brms:

library(tidyverse)
library(brms)
library(posterior)
library(patchwork)

set.seed(1234)
data <- tibble(player1 = sample(x=1L:20L, size=500, replace = T),
               player2 = sample(x=1L:20L, size=500, replace = T),
               score = rnorm(n=500,mean=player1-player2,sd=1),
               w1=1L, w2=-1L) %>%
  filter(player1 != player2)

p1 <- data %>%
  ggplot(aes(x=player1, y=score, col=factor(player2))) +
  theme_bw(base_size=18) +
  geom_jitter(height=0, width=0.1, alpha=0.5) +
  ylab("Diferencia de puntuación observada")

# modelo de múltiples membresías con dos miembros por grupo y pesos iguales
fit1 <- brm(score ~ 0 + (1|mm(player1, player2, weights=cbind(w1, w2), scale=FALSE)),  
            family = gaussian(),
            data = data)

resumen(fit1)

p2 <- fit1 %>%
  as_draws_df() %>%
  pivot_longer(cols=everything(), names_to="parámetro", values_to="valor") %>%
  filter(str_detect(parámetro, "r_mmplayer")) %>%
  mutate(playerno = as.integer(str_remove_all(str_extract(parámetro, "\\[[0-9]+\\,"), "\\[|\\,"))) %>%
  ggplot(aes(x=playerno, y=valor)) +
  theme_bw(base_size=18) +
  geom_jitter(width=0.1, height=0, alpha=0.3) +
  ylab("Habilidad estimada del jugador")

p1 + p2

introducir descripción de la imagen aquí

Esta versión ajusta esto como un modelo de efectos aleatorios, lo que induce contracción en la habilidad de los jugadores con muy pocos datos, lo cual a menudo tiene sentido. Si no te gusta eso, simplemente establece una prioridad que fije la desviación estándar entre jugadores a un número muy grande (prior = prior(class="sd", constant(1000)) o similar).

Por supuesto, una preocupación podría ser que los residuos no sean normales, por ejemplo, que haya más puntuaciones altas de lo esperado, en ese caso se podría elegir un error de Student-t. O tal vez te preocupa que en partidos muy desequilibrados el jugador mejor no se esfuerce tanto (en cuyo caso tal vez debería reducirse su habilidad estimada, pero también podrías sentir que no quieres hacer eso). En un escenario así, podrías introducir un término basado en la diferencia de habilidad estimada que diga que la puntuación esperada se reduce en función de la diferencia de habilidad (eso podría requerir un modelo más personalizado, supongo) o algo así. También podrías añadir un intercepto al modelo, si ser jugador 1 es una ventaja frente a ser jugador 2 (por ejemplo, como en el ajedrez donde es mejor ser blanco que negro).

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X