无法通过R中的尖齿对数据执行贝叶斯分析

时间:2020-04-22 23:31:11

标签: r list bayesian jags openbugs

这是我的代码

library(R2jags) #library(rjags)
library(bayesplot)
library(coda)


# set working directory
setwd("/Users/isa/Desktop/logreg")

# BUGS model code

cat("model {
  for( i in 1 : 8 ) {
    y[i] ~ dbin(theta[i],n[i])
    logit(theta[i]) <- beta0 + beta1 * x[i]
  }

  beta0 ~ dunif(-100, 100)
  beta1 ~ dunif(-100, 100)
}",
    file = "model_log.txt")



data <- read.delim("data.txt",
                   sep = "",
                   header = TRUE,
                   check.names = "FALSE",
                   stringsAsFactors = FALSE)




initsone <- list(beta0 = -100, beta1 = 100)
initstwo <- list(beta0 = 100, beta1 = -100)

initslog <- list(initsone, initstwo)
paramslog <- c("beta0", "beta1", "theta[6]")



outputlog <-
  jags(data = data,
       inits = initslog,
       parameters.to.save = paramslog,
       model.file = "model_log.txt",
       n.chains = 2,
       n.iter = 1000,
       n.burnin = 1000,
       n.thin = 1,
       DIC = TRUE#,
       # bugs.directory = getwd(),
       # working.directory = getwd()
  )

一切正常,直到我尝试编译输出。我收到错误消息:

Error in jags.model(model.file, data = data, inits = init.values, n.chains = n.chains,  : 
  Error in node y[1]
Node inconsistent with parents

我相信这与我的数据有关,我的数据是OpenBugs格式的

list(y = c(1, 3, 6, 8, 11, 15, 17, 19), 
     n = c(20, 20, 20, 20, 20, 20, 20, 20), 
     x = c(30, 32, 34, 36, 38, 40, 42, 44), 
    N = 8 )

但是我将其转换为R格式:

y n x
1 20 30
3 20 32
6 20 34
8 20 36
11 20 38
15 20 40
17 20 42
19 20 44

我是否正确转换了数据?数据哪里出问题了?一切正常,直到我尝试编译输出。我收到一个错误说明:jags.model(model.file,data = data,inits = init.values,n.chains = n.chains,错误: 节点y [1]中存在错误 节点与父母不一致

1 个答案:

答案 0 :(得分:0)

您已经在先验的边界处开始了参数的初始值。从本质上讲,这不是问题,但是那些logit缩放值可能会达到极限,因此将创建初始估计值Pr == 0或Pr == 1。

仅处理您的数据,假设我们使用beta0 = -100beta1 = 100初始化模型。

对于您的第一个数据点x = 30,您的logit-linear预测变量开始为:

theta = -100 + 100 * 30

theta = 2900
plogis(theta) = 1

因此,我们以1的成功概率开始,但是y=1试验的n=20的成功概率不能为1。您可以尝试一些方法来鼓励模型开始采样。

  1. 更改初始值。使它们更接近于0(例如,-4和4之间)。
  2. 执行步骤1,还要重新缩放x协变量,使其均值= 0且sd = 1(即,使用scale中的R函数。{{1} }不喜欢JAGS的直接输出,因此您最终会做scale。这很有帮助,因为它意味着您可以使用标准先验进行回归,但是意味着您需要解释系数与此不同。在线上有很多资源可以查看与均值中心变量相关的信息。

另一种获取初始值在正确区域中的某处的方法(假设您使用的是模糊先验)只是拟合常态逻辑回归模型,并将这些估计值用作每个参数的某些随机正态分布的平均值。毕竟,在先验含糊的情况下,频繁出现的估计应该确实接近贝叶斯估计,因为可能性将大大超过先验。

x = as.numeric(scale(c(30, 32, 34, 36, 38, 40, 42, 44)))

您可以在此处看到dat <- list(y = c(1, 3, 6, 8, 11, 15, 17, 19), n = c(20, 20, 20, 20, 20, 20, 20, 20), x = c(30, 32, 34, 36, 38, 40, 42, 44), N = 8 ) # set up as matrix of successes and failures y <- matrix(NA, ncol = 2, nrow = 8) y[,1] <- dat$y y[,2] <- dat$n - dat$y m1 <- glm(y ~ dat$x, family = binomial) summary(m1) Call: glm(formula = y ~ dat$x, family = binomial) Deviance Residuals: Min 1Q Median 3Q Max -0.39289 -0.20654 -0.04323 0.21294 0.50657 Coefficients: Estimate Std. Error z value Pr(>|z|) (Intercept) -13.55295 2.05832 -6.584 4.57e-11 *** dat$x 0.36630 0.05536 6.616 3.68e-11 *** --- Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 (Dispersion parameter for binomial family taken to be 1) Null deviance: 70.7352 on 7 degrees of freedom Residual deviance: 0.7544 on 6 degrees of freedom AIC: 27.71 Number of Fisher Scoring iterations: 4 附近的值与该特定模型的参数估计值相距很远。

因此,如果需要,可以设置一些初始值,如下所示:

abs(100)

当然,只有在没有先验信息的情况下,并且对于像这样的非常简单的模型,这才真正起作用。