JAGS 模型中的节点与父节点不一致 (R)
Node inconsistent with parents in JAGS model (R)
我是 JAGS 的新手,我正在尝试 运行 简单的逻辑回归。我的数据文件非常简单:响应是二进制的,我使用的一个预测器具有三个级别。像这样:
col1: 1 2 2 2 1 1 1 2 1 2 ...
col2: HLL, HLL, LHL, LLL, LHL, HLL ...
虚拟编码
col2
中的等级是HLL, LHL, LLL
。我对其进行了虚拟编码并创建了一个如下所示的数据框:
(intercept) HLL LHL LLL
1 1 0 0 1
2 1 0 0 1
4 1 0 0 1
5 1 0 1 0
6 1 0 1 0
7 1 0 0 1
资料列表
我的数据文件 (myList
) 看起来像这样:
List of 5
$ y : num [1:107881] 2 2 2 2 2 2 2 2 2 2 ...
$ N : num 500
$ HLL: num [1:107881] 0 0 0 0 0 0 0 0 0 0 ...
$ LHL: num [1:107881] 0 0 0 1 1 0 0 0 0 1 ...
$ LLL: num [1:107881] 1 1 1 0 0 1 1 1 1 0 ...
我正在使用 N=500
因为完整的数据框很大,我只是想测试一下。
型号
cat(
"model {
for( i in 1 : N ){
y[i] ~ dbern(mu[i])
mu[i] <- 1/(1+exp(-(a + b*HLL[i] + c*LHL[i] + d*LLL[i])))
}
a ~ dnorm(0, 1.0e-12)
b ~ dnorm(0, 1.0e-12)
c ~ dnorm(0, 1.0e-12)
d ~ dnorm(0, 1.0e-12)
}", file = "model.txt"
)
运行模型+误差
model = jags.model(file = "model.txt",
data = myList,
n.chains = 3, n.adapt = 500)
我收到错误
Error in jags.model(file = "model.txt", data = antPenList, n.chains = 3, :
Error in node y[1]
Node inconsistent with parents
dbern 分布期望在 {0,1} 而不是 {1,2} 中响应,因为您似乎已经对其进行了编码,因此您需要从 y 值中减去 1。
你得到这个错误有点奇怪,因为 dbern 通常不会给出其他响应值的错误(它基本上使 <0 = 0 和 >1 = 1)。该错误可能源于响应拟合所有相同值这一事实,但如果这不能解决问题,那么您可以尝试以下操作:
1) 尝试稍微提高 a/b/c/d 的先验精度 - 10^12 的方差很大
2) 而不是:
mu[i] <- 1/(1+exp(-(a + b*HLL[i] + c*LHL[i] + d*LLL[i])))
你可以这样写:
logit(mu[i]) <- -(a + b*HLL[i] + c*LHL[i] + d*LLL[i])
这也可能有助于 JAGS 将其识别为 GLM 并启动适当的采样器 - 请记住加载 glm 模块。
3) 为 a/b/c/d 设置一些与您的数据大致一致的初始值(可能是使用 R 中的 glm() 拟合得到的)
我用
解决了
mu[i] <- 1/(1.000001+exp(-(a + b*HLL[i] + c*LHL[i] + d*LLL[i])))
我是 JAGS 的新手,我正在尝试 运行 简单的逻辑回归。我的数据文件非常简单:响应是二进制的,我使用的一个预测器具有三个级别。像这样:
col1: 1 2 2 2 1 1 1 2 1 2 ...
col2: HLL, HLL, LHL, LLL, LHL, HLL ...
虚拟编码
col2
中的等级是HLL, LHL, LLL
。我对其进行了虚拟编码并创建了一个如下所示的数据框:
(intercept) HLL LHL LLL
1 1 0 0 1
2 1 0 0 1
4 1 0 0 1
5 1 0 1 0
6 1 0 1 0
7 1 0 0 1
资料列表
我的数据文件 (myList
) 看起来像这样:
List of 5
$ y : num [1:107881] 2 2 2 2 2 2 2 2 2 2 ...
$ N : num 500
$ HLL: num [1:107881] 0 0 0 0 0 0 0 0 0 0 ...
$ LHL: num [1:107881] 0 0 0 1 1 0 0 0 0 1 ...
$ LLL: num [1:107881] 1 1 1 0 0 1 1 1 1 0 ...
我正在使用 N=500
因为完整的数据框很大,我只是想测试一下。
型号
cat(
"model {
for( i in 1 : N ){
y[i] ~ dbern(mu[i])
mu[i] <- 1/(1+exp(-(a + b*HLL[i] + c*LHL[i] + d*LLL[i])))
}
a ~ dnorm(0, 1.0e-12)
b ~ dnorm(0, 1.0e-12)
c ~ dnorm(0, 1.0e-12)
d ~ dnorm(0, 1.0e-12)
}", file = "model.txt"
)
运行模型+误差
model = jags.model(file = "model.txt",
data = myList,
n.chains = 3, n.adapt = 500)
我收到错误
Error in jags.model(file = "model.txt", data = antPenList, n.chains = 3, :
Error in node y[1]
Node inconsistent with parents
dbern 分布期望在 {0,1} 而不是 {1,2} 中响应,因为您似乎已经对其进行了编码,因此您需要从 y 值中减去 1。
你得到这个错误有点奇怪,因为 dbern 通常不会给出其他响应值的错误(它基本上使 <0 = 0 和 >1 = 1)。该错误可能源于响应拟合所有相同值这一事实,但如果这不能解决问题,那么您可以尝试以下操作:
1) 尝试稍微提高 a/b/c/d 的先验精度 - 10^12 的方差很大
2) 而不是:
mu[i] <- 1/(1+exp(-(a + b*HLL[i] + c*LHL[i] + d*LLL[i])))
你可以这样写:
logit(mu[i]) <- -(a + b*HLL[i] + c*LHL[i] + d*LLL[i])
这也可能有助于 JAGS 将其识别为 GLM 并启动适当的采样器 - 请记住加载 glm 模块。
3) 为 a/b/c/d 设置一些与您的数据大致一致的初始值(可能是使用 R 中的 glm() 拟合得到的)
我用
解决了mu[i] <- 1/(1.000001+exp(-(a + b*HLL[i] + c*LHL[i] + d*LLL[i])))