2017-08-14 164 views
1

我想用rjagsrjags錯誤無效向量參數ilogit

library(betareg) 
d = data.frame(p= sample(c(.1,.2,.3,.4),100, replace= TRUE), 
       id = seq(1,100,1)) 

# I am looking to reproduce this regression with jags 
b=betareg(p ~ id, data= d, 
      link = c("logit"), link.phi = NULL, type = c("ML")) 
summary(b) 

下面我試圖做rjags同樣迴歸到一個比較迴歸betareg主場迎戰同迴歸

#install.packages("rjags") 
library(rjags) 
jags_str = " 
model { 
#model 

y ~ dbeta(alpha, beta) 
alpha <- mu * phi 
beta <- (1-mu) * phi 
logit(mu) <- a + b*id 

#priors 
a ~ dnorm(0, .5) 
b ~ dnorm(0, .5) 
t0 ~ dnorm(0, .5) 
phi <- exp(t0) 
}" 
id = d$id 
y = d$p 
model <- jags.model(textConnection(jags_str), 
        data = list(y=y,id=id) 
) 
update(model, 10000, progress.bar="none"); # Burnin for 10000 samples 
samp <- coda.samples(model, 
        variable.names=c("mu"), 
        n.iter=20000, progress.bar="none") 

summary(samp) 
plot(samp) 

我得到一個錯誤,在這條線

model <- jags.model(textConnection(jags_str), 
         data = list(y=y,id=id) 
    ) 

Error in jags.model(textConnection(jags_str), data = list(y = y, id = id)) : 
    RUNTIME ERROR: 
Invalid vector argument to ilogit 

你可以建議

(1)如何修復錯誤

(2)如何設置先驗的測試迴歸

謝謝。

回答

1

發生此錯誤是因爲您已將id矢量提供給標量函數logit。在Jags中,反向鏈接函數不能被矢量化。要解決這個問題,您需要使用for循環遍歷id的每個元素。爲此,我可能會在數據列表中添加一個附加元素,表示id的長度。

d = data.frame(p= sample(c(.1,.2,.3,.4),100, replace= TRUE), 
      id = seq(1,100,1), len_id = length(seq(1,100,1))) 

從那裏你只需要對你的jags代碼做一個小的編輯。

for(i in 1:(len_id)){ 
y[i] ~ dbeta(alpha[i], beta[i]) 
alpha[i] <- mu[i] * phi 
beta[i] <- (1-mu[i]) * phi 
logit(mu[i]) <- a + b*id[i] 
} 

但是,如果跟蹤mu它將是一個矩陣,是20000(迭代#)100(的id長度)。您可能對實際參數更感興趣(a,bphi)。