Mô hình hóa một mô hình hỗn hợp trong JAGS / BUGS [đã đóng]


8

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 )

π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))biểu thị sức mạnh của các đội. Tôi đã cố gắng thực hiện hai luật này trong JAGS bằng cách sử dụng thủ thuật số không, nhưng không có may mắn cho đến nay ( 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)
    }

}

3
Tôi nghĩ Marat rất gần - có thể có vài thứ với 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.
Tò mò

2
Thay vào đó, bạn có thể thử Stan - nó cho phép bạn thực hiện lập trình thực tế thay vì "thủ thuật". Ngoài ra @Cquil là đúng - hãy thử đơn giản hóa mô hình của bạn: bắt đầu với mô hình rất cơ bản và làm cho nó phức tạp hơn một chút một bước cho đến khi nó ngừng hoạt động.
Tim

Câu trả lời:


0

Đôi khi ifelse không hoạt động. Thay thế

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

bạn nên thử

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

GoalScored [i, 1] == 0 trả về 1 nếu Đúng và 0 nếu Sai


Cảm ơn người đàn ông, nhưng điều đó đã không làm điều đó cho tôi. Vẫn chưa tìm thấy giải pháp cho vấn đề này.
thomrand

0

Tôi không nghĩ bạn có thể định nghĩa zeros[i] ~ dpois(-log(kappa[i]) + C)bên trong việc xây dựng mô hình.

Cố gắng sửa lại mã thành zeros ~ dpois(-log(kappa[i]) + C)(lấy ra '[i]').

Sau khi xác định mô hình, bạn xác định lại dữ liệu tại zeors:

data$zero=0

Hãy thử nếu điều này làm việc.

Tham khảo Thủ thuật giao nhau bằng 0 cho JAGS: Tìm kiếm gốc một cách ngẫu nhiên để biết thêm thông tin.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.