Ich bin derzeit dabei, ein Modell für die Vorhersage von Fußballergebnissen in JAGS zu implementieren. Eigentlich habe ich mehrere implementiert, aber ich habe meine bisher schwierigste Herausforderung erreicht: Ein Modell, das Rue & Salvesen in ihrer Arbeit "Vorhersage und retrospektive Analyse von Fußballspielen in einer Liga" beschrieben hat. Ihr Modell verwendet ein gemischtes Modell zum Abschneiden einer Poisson-Verteilung, die von der Angriffs- / Verteidigungsstärke nach 5 Toren abhängig ist. Sie haben auch ein Gesetz von Dixon & Coles (1997) angepasst, um die Wahrscheinlichkeit von 0: 0- und 1: 1-Ergebnissen in Spielen mit geringer Punktzahl zu erhöhen.
Mein Problem ist wie folgt: Ich versuche, das gemischte Modell zu implementieren: Wobei die Anzahl der Tore angibt, die die Heimmannschaft im Spiel zwischen den Teams A und B erzielt hat, und bezeichnet die Stärke der Teams. Ich habe versucht, diese beiden Gesetze in JAGS mithilfe des Null-Eins-Tricks zu implementieren, aber bisher ohne Glück ( ). Mein bisheriges JAGS-Modell:x A , B l o g ( λ ( x ) A , B )
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)
}
}
quelle
ifelse
. Ich würde empfehlen, Ihr Modell auf die kleinste Version zu vereinfachen, die nicht funktioniert! Dies könnte Ihnen den Weg zeigen.Antworten:
Manchmal funktioniert ifelse nicht. Stattdessen
du solltest es versuchen
ZieleScored [i, 1] == 0 gibt 1 zurück, wenn True, und 0, wenn False
quelle
Ich glaube nicht, dass Sie
zeros[i] ~ dpois(-log(kappa[i]) + C)
innerhalb der Modellkonstruktion definieren können .Versuchen Sie, den Code zu überarbeiten
zeros ~ dpois(-log(kappa[i]) + C)
(aus '[i]' herausnehmen).Nachdem Sie das Modell definiert haben, definieren Sie die Daten bei zeors neu:
Versuchen Sie, ob dies funktioniert.
Weitere Informationen finden Sie unter Der Nulldurchgangstrick für JAGS: Wurzeln stochastisch finden .
quelle