Modellierung eines gemischten Modells in JAGS / BUGS [geschlossen]

8

Ich bin derzeit dabei, ein Modell für die Vorhersage von Fußballergebnissen in JAGS zu implementieren. Eigentlich habe ich mehrere implementiert, aber ich habe meine bisher schwierigste Herausforderung erreicht: Ein Modell, das Rue & Salvesen in ihrer Arbeit "Vorhersage und retrospektive Analyse von Fußballspielen in einer Liga" beschrieben hat. Ihr Modell verwendet ein gemischtes Modell zum Abschneiden einer Poisson-Verteilung, die von der Angriffs- / Verteidigungsstärke nach 5 Toren abhängig ist. Sie haben auch ein Gesetz von Dixon & Coles (1997) angepasst, um die Wahrscheinlichkeit von 0: 0- und 1: 1-Ergebnissen in Spielen mit geringer Punktzahl zu erhöhen.

Mein Problem ist wie folgt: Ich versuche, das gemischte Modell zu implementieren: Wobei die Anzahl der Tore angibt, die die Heimmannschaft im Spiel zwischen den Teams A und B erzielt hat, und bezeichnet die Stärke der Teams. Ich habe versucht, diese beiden Gesetze in JAGS mithilfe des Null-Eins-Tricks zu implementieren, aber bisher ohne Glück ( ). Mein bisheriges JAGS-Modell:x A , B l o g ( λ ( x ) A , B )

π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
quelle
3
Ich denke Marat ist nah dran - es könnte etwas mit dem sein ifelse. Ich würde empfehlen, Ihr Modell auf die kleinste Version zu vereinfachen, die nicht funktioniert! Dies könnte Ihnen den Weg zeigen.
Neugierig
2
Sie könnten stattdessen Stan ausprobieren - es ermöglicht Ihnen, tatsächlich zu programmieren, anstatt "Tricks" zu machen. Auch @Curious ist richtig - versuchen Sie, Ihr Modell zu vereinfachen: Beginnen Sie mit einem sehr einfachen und machen Sie es Schritt für Schritt etwas komplizierter, bis es nicht mehr funktioniert.
Tim

Antworten:

0

Manchmal funktioniert ifelse nicht. Stattdessen

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

du solltest es versuchen

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

ZieleScored [i, 1] == 0 gibt 1 zurück, wenn True, und 0, wenn False

Marat Zaynutdinoff
quelle
Danke Mann, aber das hat es nicht für mich getan. Ich habe immer noch keine Lösung dafür gefunden.
Thomrand
0

Ich glaube nicht, dass Sie zeros[i] ~ dpois(-log(kappa[i]) + C)innerhalb der Modellkonstruktion definieren können .

Versuchen Sie, den Code zu überarbeiten zeros ~ dpois(-log(kappa[i]) + C)(aus '[i]' herausnehmen).

Nachdem Sie das Modell definiert haben, definieren Sie die Daten bei zeors neu:

data$zero=0

Versuchen Sie, ob dies funktioniert.

Weitere Informationen finden Sie unter Der Nulldurchgangstrick für JAGS: Wurzeln stochastisch finden .

Shijia Bian
quelle