Tôi hiện đang trong quá trình triển khai mô hình dự đoán kết quả bóng đá trong JAGS. Trên thực tế, tôi đã thực hiện một số, nhưng tôi đã đạt được thử thách khó khăn nhất của mình: Một mô hình được mô tả bởi Rue & Salvesen trong bài báo của họ "Dự đoán và phân tích hồi cứu các trận bóng đá trong một giải đấu". Mô hình của họ sử dụng mô hình hỗn hợp để cắt bớt phân phối Poisson dựa trên sức mạnh tấn công / phòng thủ sau 5 bàn thắng. Họ cũng đã điều chỉnh một luật từ Dixon & Coles (1997) để tăng xác suất 0-0 và 1-1 trong các trận đấu có điểm số thấp.
Vấn đề của tôi là như sau, tôi đang cố gắng thực hiện mô hình hỗn hợp: Trong đóxA,Bbiểu thị số lượng bàn thắng mà nhà cái ghi được đội trong trận đấu giữa đội A và B, vàlog(λ ( x ) Một , B )
error: illegal parent values
). Mô hình JAGS của tôi cho đến nay:
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)
}
}
ifelse
. Tôi khuyên bạn nên đơn giản hóa mô hình của mình thành phiên bản nhỏ nhất không hoạt động! Điều này có thể chỉ cho bạn cách.