Je suis actuellement en train d'implémenter un modèle de prédiction des résultats de football dans JAGS. En fait, j'en ai mis en œuvre plusieurs, mais j'ai atteint mon défi le plus difficile à ce jour: un modèle décrit par Rue & Salvesen dans son article "Prédiction et analyse rétrospective des matchs de football dans une ligue". Leur modèle utilise un modèle mixte pour tronquer une distribution de Poisson conditionnée à la force d'attaque / défense après 5 buts. Ils ont également adapté une loi de Dixon et Coles (1997) pour augmenter la probabilité de résultats de 0-0 et 1-1 dans les matchs à faible score.
Mon problème est le suivant, j'essaie d'implémenter le modèle mixte: Où indique le nombre de buts marqués par l'équipe à domicile dans le match entre les équipes A et B, et indique la force des équipes. J'ai essayé d'implémenter ces deux lois dans JAGS en utilisant l'astuce zéros-uns, mais sans succès jusqu'à présent ( ). Mon modèle JAGS jusqu'à présent:
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)
}
}
la source
ifelse
. Je recommanderais de simplifier votre modèle à la plus petite version qui ne fonctionne pas! Cela pourrait vous montrer le chemin.Réponses:
Parfois, ifelse ne fonctionne pas. Au lieu
tu devrais essayer
goalScored [i, 1] == 0 renvoie 1 si Vrai et 0 si Faux
la source
Je ne pense pas que vous puissiez définir l'
zeros[i] ~ dpois(-log(kappa[i]) + C)
intérieur de la construction du modèle.Essayez de réviser le code pour être
zeros ~ dpois(-log(kappa[i]) + C)
(retirer de «[i]»).Après avoir défini le modèle, vous redéfinissez les données à zeors:
Essayez si cela fonctionne.
Reportez-vous à l' astuce des passages par zéro pour JAGS: Trouver des racines stochastiquement pour plus d'informations.
la source