Actualmente estoy en el proceso de implementar un modelo para la predicción de resultados de fútbol en JAGS. En realidad, he implementado varios, pero he alcanzado mi desafío más difícil: un modelo descrito por Rue & Salvesen en su trabajo "Predicción y análisis retrospectivo de partidos de fútbol en una liga". Su modelo utiliza un modelo mixto para truncar una distribución de Poisson condicionada a la fuerza de ataque / defensa después de 5 goles. También han adaptado una ley de Dixon & Coles (1997) para aumentar la probabilidad de resultados de 0-0 y 1-1 en juegos de baja puntuación.
Mi problema es el siguiente, estoy tratando de implementar el modelo mixto: Donde denota el número de goles marcados por el equipo local en el juego entre los equipos A y B, y denota La fuerza de los equipos. He intentado implementar estas dos leyes en JAGS utilizando el truco de ceros, pero sin suerte hasta ahora ( ). Mi modelo JAGS hasta ahora:
error: illegal parent values
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)
}
}
fuente
ifelse
. ¡Recomendaría simplificar su modelo a la versión más pequeña que no funciona! Esto podría mostrarte el camino.Respuestas:
A veces ifelse no funciona. En lugar
Deberías intentarlo
goalsScored [i, 1] == 0 devuelve 1 si es Verdadero y 0 si es Falso
fuente
No creo que pueda definir
zeros[i] ~ dpois(-log(kappa[i]) + C)
dentro de la construcción del modelo.Intente revisar el código para ser
zeros ~ dpois(-log(kappa[i]) + C)
(sacar de '[i]').Después de definir el modelo, redefinir los datos en zeors:
Prueba si esto funciona.
Consulte el truco de cruces por cero para JAGS: encontrar raíces estocásticamente para obtener más información.
fuente