JAGS / BUGSでの混合モデルのモデリング[終了]


8

私は現在、JAGSでサッカーの結果を予測するモデルの実装を進めています。実際、いくつか実装しましたが、まだ最も難しい課題に達しています。Rue&Salvesenの論文「リーグでのサッカーの試合の予測と遡及分析」で説明されているモデルです。彼らのモデルは、5ゴール後の攻撃/防御力を条件としたポアソン分布を切り捨てるために混合モデルを使用しています。彼らはまた、Dixon&Coles(1997)の法律を採用して、スコアの低いゲームで0-0と1-1の結果が出る確率を高めています。

私の問題は次のとおりです、私は混合モデルを実装しようとしています: ここで、は、チームAとBの間のゲームでホームチームが獲得したゴールの数を示し、は、チームの強さ。私はゼロゼロのトリックを使用してJAGSでこれらの2つの法則を実装しようとしましたが、今のところ運がありません()。これまでの私のJAGSモデル:

πg1バツByB|λBバツλBy=κバツByB|λBバツλByPoバツB|λBバツPoyB|λBy
バツBlogλBバツ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)
    }

}

3
マラットは近いと思います-に何かがあるかもしれませんifelse。モデルを単純化して、機能しない最小バージョンにすることをお勧めします!これはあなたに道を示すことができます。
好奇心が強い

2
あなたは代わりにスタンを試すことができます-それはあなたが「トリック」のものではなく実際のプログラミングをすることを可能にします。また、@ Curiousも正しいです。モデルを簡略化してみてください。非常に基本的なモデルから始めて、機能が停止するまで一度に少しずつ複雑にします。
Tim

回答:


0

ifelseが機能しない場合があります。代わりに

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

試してみてください

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

GoalsScored [i、1] == 0は、Trueの場合は1、Falseの場合は0を返します


おかげで、それは私のためにそれをしませんでした。これに対する解決策はまだ見つかりません。
トムランド2013年

0

zeros[i] ~ dpois(-log(kappa[i]) + C)モデル構築の内部を定義できるとは思いません。

コードを次のように修正してくださいzeros ~ dpois(-log(kappa[i]) + C)( '[i]' から削除)。

モデルを定義した後、zeorsでデータを再定義します。

data$zero=0

これが機能するかどうか試してください。

詳細については、JAGSのゼロクロッシングトリック:確率論的根を見つけるを参照してください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.