Actualmente estoy en el proceso de implementación de un modelo para el fútbol resultado de la predicción en ENTRECORTADO. En realidad, he implementado varios, pero he llegado a mi reto más difícil todavía: Un modelo descrito por la Rue & Salvesen, en su artículo "la Predicción y el análisis retrospectivo de los partidos de fútbol en una liga". Su modelo utiliza un modelo mixto para truncar una distribución de Poisson acondicionado en ataque / defensa de la fuerza después de 5 goles. También han adaptado una ley de Dixon & Coles (1997) para aumentar la probabilidad de 0-0 y 1-1 resultados en la baja puntuación de los juegos.
Mi problema es el siguiente, estoy tratando de implementar el modelo mixto:
$$
\pi_{g1}(x_{A,B},y_{A,B}|\lambda_{A,B}^{(x)},\lambda_{A,B}^{(y)}) = \kappa(x_{A,B},y_{A,B}|\lambda_{A,B}^{(x)},\lambda_{A,B}^{(y)})Po(x_{A,B}|\lambda_{A,B}^{(x)})Po(y_{A,B}|\lambda_{A,B}^{(y)})
$$
Donde $x_{A,B}$ indica el número de goles marcados por el equipo de casa en el juego entre los equipos a y B, y $log(\lambda_{A,B}^{(x)})$ denota la de los equipos de fuerza. He tratado de implementar estas dos leyes en ENTRECORTADO por el uso de los ceros-queridos truco, pero no hubo suerte hasta ahora (error: illegal parent values
). Mi ENTRECORTADO modelo hasta ahora:
data {
C <- 10000
for(i in 1:noGames) {
zeros[i] <- 0
}
homeGoalAvg <- 0.395
awayGoalAvg <- 0.098
rho <- 0.1
}
model {
### Time model - Brownian motion
tau ~ dgamma(10, 0.1)
precision ~ dgamma(0.1, 1)
for(t in 1:noTeams) {
attack[t, 1] ~ dnorm(0, precision)
defence[t, 1] ~ dnorm(0, precision)
for(s in 2:noTimeslices) {
attack[t, s] ~ dnorm(attack[t, (s-1)], (tau * precision) /
(abs(days[t,s]-days[t,s-1])))
defence[t, s] ~ dnorm(defence[t, (s-1)], (tau * precision) /
(abs(days[t,s]-days[t,s-1])))
}
}
### Goal model
gamma ~ dunif(0, 0.1)
for(i in 1:noGames) {
delta[i] <- (
attack[team[i, 1], timeslice[i, 1]] +
defence[team[i, 1], timeslice[i, 1]] -
attack[team[i, 2], timeslice[i, 2]] -
defence[team[i, 2], timeslice[i, 2]]
) / 2
log(homeLambda[i]) <- (
homeGoalAvg +
(
attack[team[i, 1], timeslice[i, 1]] -
defence[team[i, 2], timeslice[i, 2]] -
gamma * delta[i]
)
)
log(awayLambda[i]) <- (
awayGoalAvg +
(
attack[team[i, 2], timeslice[i, 2]] -
defence[team[i, 1], timeslice[i, 1]] +
gamma * delta[i]
)
)
goalsScored[i, 1] ~ dpois( homeLambda[i] )
goalsScored[i, 2] ~ dpois( awayLambda[i] )
is0X[i] <- ifelse(goalsScored[i, 1]==0, 1, 0)
isX0[i] <- ifelse(goalsScored[i, 2]==0, 1, 0)
is1X[i] <- ifelse(goalsScored[i, 1]==1, 1, 0)
isX1[i] <- ifelse(goalsScored[i, 2]==1, 1, 0)
is00[i] <- is0X[i] * isX0[i]
is01[i] <- is0X[i] * isX1[i]
is10[i] <- is1X[i] * isX0[i]
is11[i] <- is1X[i] * isX1[i]
kappa[i] <- (
is00[i] * ( 1 + (homeLambda[i] * awayLambda[i] * rho) ) +
is01[i] * ( 1 - (homeLambda[i] * rho ) ) +
is10[i] * ( 1 - (awayLambda[i] * rho ) ) +
is11[i] * ( 1 + rho ) +
1 - ( is00[i] + is01[i] + is10[i] + is11[i] )
)
# This does not work!
zeros[i] ~ dpois(-log(kappa[i]) + C)
}
}