私は現在、JAGSでサッカーの結果を予測するモデルの実装を進めています。実際、いくつか実装しましたが、まだ最も難しい課題に達しています。Rue&Salvesenの論文「リーグでのサッカーの試合の予測と遡及分析」で説明されているモデルです。彼らのモデルは、5ゴール後の攻撃/防御力を条件としたポアソン分布を切り捨てるために混合モデルを使用しています。彼らはまた、Dixon&Coles(1997)の法律を採用して、スコアの低いゲームで0-0と1-1の結果が出る確率を高めています。
私の問題は次のとおりです、私は混合モデルを実装しようとしています: ここで、は、チームAとBの間のゲームでホームチームが獲得したゴールの数を示し、は、チームの強さ。私はゼロゼロのトリックを使用してJAGSでこれらの2つの法則を実装しようとしましたが、今のところ運がありません()。これまでの私のJAGSモデル:
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)
}
}
あなたは代わりにスタンを試すことができます-それはあなたが「トリック」のものではなく実際のプログラミングをすることを可能にします。また、@ Curiousも正しいです。モデルを簡略化してみてください。非常に基本的なモデルから始めて、機能が停止するまで一度に少しずつ複雑にします。
—
Tim
ifelse
。モデルを単純化して、機能しない最小バージョンにすることをお勧めします!これはあなたに道を示すことができます。