rjags 错误 ilogit 的无效矢量参数
rjags error Invalid vector argument to ilogit
我想比较 betareg 回归与使用 rjags 的相同回归
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 做同样的回归
#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) 如何为 beta 回归设置先验
谢谢。
发生此错误是因为您已将 id
向量提供给标量函数 logit
。在 Jags 中,反 link 函数无法向量化。要解决这个问题,您需要使用 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
、b
和 phi
)更感兴趣。
我想比较 betareg 回归与使用 rjags 的相同回归
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 做同样的回归
#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) 如何为 beta 回归设置先验
谢谢。
发生此错误是因为您已将 id
向量提供给标量函数 logit
。在 Jags 中,反 link 函数无法向量化。要解决这个问题,您需要使用 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
、b
和 phi
)更感兴趣。