我是JAGS的新手,我正在尝试使用9个非连续预测变量来预测二元结果(0/1)。预测值可能是0,1或2.这是我第一次这样做,即使我可以让模型运行,我100%肯定这里肯定有很多问题。
$y
[1] 0 0 0 1 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0
[29] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0
$N
[1] 50
$oAnt
[1] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 0 1 1 1 1 1 1 1 1 1
[29] 1 1 1 1 1 1 2 1 1 0 1 1 1 1 1 2 1 1 1 1 1 1
$nAnt
[1] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
[29] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
$cAnt
[1] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0
[29] 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0
$oPen
[1] 1 1 1 1 1 1 1 1 0 1 1 1 1 1 0 1 1 1 1 0 0 1 1 1 1 1 1 0
[29] 1 0 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 0 2 1 1
$nPen
[1] 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 2 1 1 1 1 1 1 1 1 1 1 2 1
[29] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1
$cPen
[1] 0 1 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 1 1 0 0 0 0 1 0 0
[29] 0 0 0 1 1 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 0
$oFin
[1] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1
[29] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
$nFin
[1] 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 2 1 1 1 1 1 1 2 1 1 1
[29] 1 1 1 1 2 1 1 1 1 2 1 1 1 2 1 1 1 1 1 1 1 3
$cFin
[1] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 1
[29] 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0
model {
for( i in 1 : N ){
y[i] ~ dbern(mu[i])
mu[i] <- 1/(1+exp(-(b0 + b1*oAnt[i] + b2*nAnt[i] + b3*cAnt[i] + b4*oPen[i] + b5*nPen[i] + b6*cPen[i] + b7*oFin[i] + b8*nFin[i] + b9*cFin[i])))
}
b0 ~ dnorm(0, 1.0e-12)
b1 ~ dnorm(0, 1.0e-12)
b2 ~ dnorm(0, 1.0e-12)
b3 ~ dnorm(0, 1.0e-12)
b4 ~ dnorm(0, 1.0e-12)
b5 ~ dnorm(0, 1.0e-12)
b6 ~ dnorm(0, 1.0e-12)
b7 ~ dnorm(0, 1.0e-12)
b8 ~ dnorm(0, 1.0e-12)
b9 ~ dnorm(0, 1.0e-12)
}
我使用了来自glm()
模型的估计值(由A. Gelman建议) - 但为了简单起见,我们假设我将让JAGS选择链的初始值。
jagsModel = jags.model(file = "antPenFin.txt", data = dataList, n.chains = 2, n.adapt = 500)
update(jagsModel, n.iter = 500)
codaSamples = coda.samples(jagsModel,
variable.names = names(dataList)[3:11], n.iter = 5000)
我模型的输出完全关闭(当我尝试绘制它时会变得清晰)。我相信这里有一些非常基本的问题。有人可以帮忙吗?
非常感谢。
答案 0 :(得分:0)
您的问题是,您不能提供一系列数字(在您的情况下从0到3)作为分类协变量。目前,您的模型将这些数字解释为连续的。您需要做的是将这些转换为dummy variables。您可以使用R中的model.matrix
函数轻松完成此操作。我将生成一些数据作为示例,然后您可以将其应用于数据。
# generate y
y <- sample(0:1, 30, replace = TRUE)
# add three different categorical covariates. Note here that these are all
# factors.
oAnt <- factor(sample(0:2, 30, replace = TRUE))
cAnt <- factor(sample(0:1, 30, replace = TRUE))
nFin <- factor(sample(0:3, 30, replace = TRUE))
# create your model matrix
my_matrix <- model.matrix(y ~ oAnt + cAnt + nFin)
head(my_matrix)
(Intercept) oAnt1 oAnt2 cAnt1 nFin1 nFin2 nFin3
1 1 1 0 1 0 1 0
2 1 1 0 1 1 0 0
3 1 1 0 0 0 0 1
4 1 1 0 1 0 0 1
5 1 0 0 1 0 1 0
6 1 1 0 1 0 0 1
对于预测变量因子中的每个级别,您将需要创建n-1列(例如,nFin范围为0-3,您将创建3列虚拟变量)。因此,您将在模型中包含更多的regresison系数。制作模型矩阵后,您可以将其转换为列表。
# remove the intercept from the list as you already have it in your model
matrix_list <- as.list(data.frame(my_matrix[,-1]))
从那里,您需要做的就是为模型创建更多预测变量。另外,如果你的模型中的nAnt
真的是全部,那么继续删除它,你基本上只包括两个拦截。