Memodelkan model campuran dalam JAGS / BUGS [ditutup]

8

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:

πg1(xSEBUAH,B,ySEBUAH,B|λSEBUAH,B(x),λSEBUAH,B(y))=κ(xSEBUAH,B,ySEBUAH,B|λSEBUAH,B(x),λSEBUAH,B(y))PHai(xSEBUAH,B|λSEBUAH,B(x))PHai(ySEBUAH,B|λSEBUAH,B(y))
xSEBUAH,BlHaig(λSEBUAH,B(x))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)
    }

}
thomrand
sumber
3
Saya pikir Marat dekat - mungkin ada sesuatu dengan ifelse. Saya akan merekomendasikan untuk menyederhanakan model Anda ke versi terkecil yang tidak berfungsi! Ini bisa menunjukkan jalannya.
Penasaran
2
Anda bisa mencoba Stan sebagai gantinya - ini memungkinkan Anda untuk melakukan pemrograman yang sebenarnya alih-alih "trik". @Curious juga benar - coba sederhanakan model Anda: mulai dengan yang sangat mendasar dan buat sedikit lebih rumit selangkah demi selangkah hingga berhenti bekerja.
Tim

Jawaban:

0

Terkadang ifelse tidak bekerja. Sebagai gantinya

is0X[i] <- ifelse(goalsScored[i, 1]==0, 1, 0)

Kamu harus mencobanya

is0X[i] <- goalsScored[i, 1]==0

goalsScored [i, 1] == 0 mengembalikan 1 jika Benar dan 0 jika Salah

Marat Zaynutdinoff
sumber
Terima kasih, tapi itu tidak berhasil untukku. Masih belum menemukan solusi untuk ini.
thomrand
0

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:

data$zero=0

Coba jika ini berhasil.

Lihat Trik zero-crossing untuk JAGS: Menemukan akar secara stokastik untuk informasi lebih lanjut.

Shijia Bian
sumber