Modélisation d'un modèle mixte dans JAGS / BUGS [fermé]

8

Je suis actuellement en train d'implémenter un modèle de prédiction des résultats de football dans JAGS. En fait, j'en ai mis en œuvre plusieurs, mais j'ai atteint mon défi le plus difficile à ce jour: un modèle décrit par Rue & Salvesen dans son article "Prédiction et analyse rétrospective des matchs de football dans une ligue". Leur modèle utilise un modèle mixte pour tronquer une distribution de Poisson conditionnée à la force d'attaque / défense après 5 buts. Ils ont également adapté une loi de Dixon et Coles (1997) pour augmenter la probabilité de résultats de 0-0 et 1-1 dans les matchs à faible score.

Mon problème est le suivant, j'essaie d'implémenter le modèle mixte: Où indique le nombre de buts marqués par l'équipe à domicile dans le match entre les équipes A et B, et indique la force des équipes. J'ai essayé d'implémenter ces deux lois dans JAGS en utilisant l'astuce zéros-uns, mais sans succès jusqu'à présent ( ). Mon modèle JAGS jusqu'à présent:

πg1(xA,B,yA,B|λA,B(x),λA,B(y))=κ(xA,B,yA,B|λA,B(x),λA,B(y))Po(xA,B|λA,B(x))Po(yA,B|λA,B(y))
xA,Blog(λA,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
la source
3
Je pense que Marat est proche - il pourrait y avoir quelque chose avec le ifelse. Je recommanderais de simplifier votre modèle à la plus petite version qui ne fonctionne pas! Cela pourrait vous montrer le chemin.
Curieux
2
Vous pouvez essayer Stan à la place - cela vous permet de faire de la programmation réelle plutôt que des trucs. @Curious a également raison - essayez de simplifier votre modèle: commencez par un modèle très basique et compliquez-le un peu à la fois jusqu'à ce qu'il cesse de fonctionner.
Tim

Réponses:

0

Parfois, ifelse ne fonctionne pas. Au lieu

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

tu devrais essayer

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

goalScored [i, 1] == 0 renvoie 1 si Vrai et 0 si Faux

Marat Zaynutdinoff
la source
Merci mec, mais ça ne l'a pas fait pour moi. Je n'ai toujours pas trouvé de solution à cela.
thomrand
0

Je ne pense pas que vous puissiez définir l' zeros[i] ~ dpois(-log(kappa[i]) + C)intérieur de la construction du modèle.

Essayez de réviser le code pour être zeros ~ dpois(-log(kappa[i]) + C)(retirer de «[i]»).

Après avoir défini le modèle, vous redéfinissez les données à zeors:

data$zero=0

Essayez si cela fonctionne.

Reportez-vous à l' astuce des passages par zéro pour JAGS: Trouver des racines stochastiquement pour plus d'informations.

Shijia Bian
la source