在 JAGS 中订购 logit

机器算法验证 物流 锯齿
2022-03-18 18:18:16

我正在尝试用 JAGS 编写一个简单的模型:

set.seed(123)
x1 <- rnorm(100) 
x2 <- rnorm(100)
z <- 1.0 + x1*0.1 - x2*0.5 + rnorm(100)
y <- z
y[z < 0] <- 1
y[z >= 0 & z < 1] <- 2
y[z >= 1 & z < 1.5] <- 3
y[z >= 1.5] <- 4

jagsdf <- list(y=y,x1=x1,x2=x2)
params <- c("alpha","beta")

mcmcmodel <- jags.model(file="ordlog.jag",data=jagsdf,n.chains=3)

使用ordlog.jag如下:

model{
    for(i in 1:100){
        mu[i] <- beta[1]*x1[i] + beta[2]*x2[i]

        logit(Q[i,1]) <- alpha[1]-mu[i]
        p[i,1] <- Q[i,1]
        for(j in 2:3){
            logit(Q[i,j]) <- alpha[j]-mu[i]
            p[i,j] <- Q[i,j] - Q[i,j-1]
        }
        p[i,4] <- 1 - Q[i,3] 

        y[i] ~ dcat(p[i,])
    } 

    ## priors over thresholds
    for(r in 1:3){
        alpha0[r] ~ dnorm(0,1.0E-3)
    }
    alpha <- sort(alpha0)

    for(j in 1:2){
        beta[j] ~ dnorm(0,1.0E-3)
    }
}

但我收到以下错误:

Error in node y[3]
Observed node inconsistent with unobserved parents at initialization

我怀疑这是由于初始化,但我无法以某种方式正确设置它。有任何想法吗?

1个回答

默认情况下,JAGS 会将 alpha0 的所有元素初始化为先验均值 0。所以 p 的初始值为 c(0.5, 0, 0, 0.5)。在这些先验条件下,y[i] 不可能等于 2 或 3。但是,在您的模拟数据中,y[3] = 3。

解决方案是将 alpha0 的元素初始化为不同的值

inits <- list("alpha0" = c(-0.5, 0, 0.5))
mcmcmodel <- jags.model(file="ordlog.jag", data=jagsdf, 
                        inits=inits, n.chains=3)