Saat ini saya sedang dalam proses menerapkan model untuk prediksi hasil sepak bola di JAGS. Sebenarnya, saya telah menerapkan beberapa, tetapi saya telah mencapai tantangan saya yang paling sulit: Sebuah model yang dijelaskan oleh Rue & Salvesen dalam makalah mereka "Prediksi dan analisis retrospektif pertandingan sepak bola di liga". Model mereka menggunakan model campuran untuk memotong distribusi Poisson dikondisikan pada kekuatan serangan / pertahanan setelah 5 gol. Mereka juga telah mengadaptasi undang-undang dari Dixon & Coles (1997) untuk meningkatkan probabilitas hasil 0-0 dan 1-1 dalam permainan skor rendah.
Masalah saya adalah sebagai berikut, saya mencoba menerapkan model campuran: Di mana menunjukkan jumlah gol yang dicetak oleh tim tuan rumah dalam pertandingan antara tim A dan B, dan menunjukkan kekuatan tim. Saya telah mencoba menerapkan kedua hukum ini di JAGS dengan menggunakan trik nol-yang, tetapi sejauh ini tidak berhasil ( ). Model JAGS saya sejauh ini:
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)
}
}
sumber
ifelse
. Saya akan merekomendasikan untuk menyederhanakan model Anda ke versi terkecil yang tidak berfungsi! Ini bisa menunjukkan jalannya.Jawaban:
Terkadang ifelse tidak bekerja. Sebagai gantinya
Kamu harus mencobanya
goalsScored [i, 1] == 0 mengembalikan 1 jika Benar dan 0 jika Salah
sumber
Saya tidak berpikir Anda dapat mendefinisikan
zeros[i] ~ dpois(-log(kappa[i]) + C)
bagian dalam model konstruksi.Cobalah untuk merevisi kode menjadi
zeros ~ dpois(-log(kappa[i]) + C)
(ambil dari '[i]').Setelah mendefinisikan model, Anda mendefinisikan kembali data di zeors:
Coba jika ini berhasil.
Lihat Trik zero-crossing untuk JAGS: Menemukan akar secara stokastik untuk informasi lebih lanjut.
sumber