Atualmente, estou no processo de implementação de um modelo para previsão de resultados de futebol no JAGS. Na verdade, eu implementei várias, mas alcancei meu desafio mais difícil ainda: um modelo descrito por Rue & Salvesen em seu artigo "Previsão e análise retrospectiva de partidas de futebol em uma liga". Seu modelo usa um modelo misto para truncar uma distribuição de Poisson condicionada à força de ataque / defesa após 5 gols. Eles também adaptaram uma lei de Dixon & Coles (1997) para aumentar a probabilidade de resultados de 0-0 e 1-1 em jogos de baixa pontuação.
Meu problema é o seguinte, estou tentando implementar o modelo misto: Onde indica o número de gols marcados pela equipe da casa no jogo entre as equipes A e B e o indica a força das equipes. Eu tentei implementar essas duas leis no JAGS usando o truque zeros-ones, mas sem sorte até agora ( ). Meu modelo JAGS até agora:
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)
}
}
fonte
ifelse
. Eu recomendaria simplificar seu modelo para a versão menor que não funcionar! Isso pode lhe mostrar o caminho.Respostas:
Às vezes, o ifelse não funciona. Em vez de
Você deveria tentar
goalsScored [i, 1] == 0 retorna 1 se Verdadeiro e 0 se Falso
fonte
Eu não acho que você possa definir
zeros[i] ~ dpois(-log(kappa[i]) + C)
dentro da construção do modelo.Tente revisar o código a ser
zeros ~ dpois(-log(kappa[i]) + C)
(retire de '[i]').Após definir o modelo, você redefine os dados nos zeors:
Tente se isso funcionar.
Consulte o truque do cruzamento de zero para JAGS: Localizando raízes estocásticas para obter mais informações.
fonte