r语言 - JAGS和缺失数据:非imputation解决方案?



我正在尝试使用rjagsrunjags包来拟合具有交互项的模型。我遇到了下面重现的错误信息RUNTIME ERROR: Compilation error on line 4. Possible directed cycle involving ymean,我认为这是由于变量中存在缺失值(NA)。

我当前项目的目标是比较使用和不使用多重输入的rjags模型,因此我最终将进行多重输入,但我假设该模型将继续使用一些默认技术,例如使用lm()进行case - wise删除,但我只是以错误消息结束。是否有一种方法可以强制删除或在模型本身中使用另一种非imputation方法,而无需事先处理数据?

library(rjags)
#> Loading required package: coda
#> Linked to JAGS 4.3.1
#> Loaded modules: basemod,bugs
library(runjags)
library(coda)
data(mtcars)
data(airquality)
# If I use this, it'll actually work because `mtcars` has no missing values
# y <- mtcars$mpg
# x1 <- mtcars$disp
# x2 <- mtcars$drat
# nn <- length(y)
# But this one with missing values causes the error message
y <- airquality$Solar.R
x1 <- airquality$Wind
x2 <- airquality$Temp
nn <- length(y)
dataList = list(y = y, x1 = x1, x2 = x2, Ntotal = nn)
modelString = "
data {
ymean <- mean(y); ysd <- sd(y); x1mean <- mean(x1); x1sd <- sd(x1); x2mean <- mean(x2); x2sd <- sd(x2)
for (i in 1:Ntotal){
zy[i] <- (y[i] - ymean)/ysd
z1[i] <- (x1[i] - x1mean)/x1sd
z2[i] <- (x2[i] - x2mean)/x2sd
}
}
model{
for (i in 1:Ntotal){
zy[i] ~ dt(zbeta0 + zbeta1*z1[i] + zbeta2*z2[i] + zbetaInt*z1[i]*z2[i], 1/zsigma^2, nu)
}

zbeta0 ~ dnorm(0,1/2^2)
zbeta1 ~ dnorm(0,1/2^2) 
zbeta2 ~ dnorm(0,1/2^2) 
zbetaInt ~ dnorm(0,1/2^2) 
zsigma ~ dunif(0.00001, .99999)
nu ~ dexp(.0333)
sigma <- zsigma*ysd
}
"
writeLines(modelString, con = "modelString.txt")
myinits <- list(
list(zbeta0 = rnorm(1,0,1), zbeta1 = rnorm(1,0,1), zbeta2 = rnorm(1,0,1), zbetaInt = rnorm(1,0,1), zsigma = runif(1), nu = runif(1)),
list(zbeta0 = rnorm(1,0,1), zbeta1 = rnorm(1,0,1), zbeta2 = rnorm(1,0,1), zbetaInt = rnorm(1,0,1), zsigma = runif(1), nu = runif(1)),
list(zbeta0 = rnorm(1,0,1), zbeta1 = rnorm(1,0,1), zbeta2 = rnorm(1,0,1), zbetaInt = rnorm(1,0,1), zsigma = runif(1), nu = runif(1)))
out <- run.jags(model="modelString.txt", 
data = dataList, inits = myinits, n.chains = 3,
adapt = 500, burnin = 2000, sample = 15000, 
monitor = c("zbeta0", "zbeta1", "zbeta2", "zbetaInt", "sigma", "nu", "DIC"))
#> module dic loaded
#> Compiling rjags model...
#> Error: The following error occured when compiling and adapting the model using rjags:
#>  Error in rjags::jags.model(model, data = dataenv, inits = inits, n.chains = length(runjags.object$end.state),  : 
#>   RUNTIME ERROR:
#> Compilation error on line 4.
#> Possible directed cycle involving ymean
#> 
#> 
#> 
#> It may help to use failed.jags(c('model','data','inits')) to see model/data/inits syntax with line numbers
print(out)
#> Error in print(out): object 'out' not found

不,没有办法让JAGS按大小写删除缺失的值或运行一个参数。做那样的事。我最好的建议是这样做:

dataList <- data.frame(y = y, x1 = x1, x2 = x2)
out <- run.jags(model= modelString, data = na.omit(dataList), ...)

然后你将不得不替换'for (i in 1:Ntotal){'与'for (i in 1:length(y)){'在你的模型和数据块。

然而,JAGS的一个优点是,只要将缺失数据建模为随机关系中的响应,则通常在模型内自动处理插入。在你的例子中,你是在模拟一个y的函数,这就是为什么你会有这个问题,但是如果你能重新制定模型,使y(而不是zy)是响应,那么你就不会有问题。当然,在响应缺失的地方添加数据实际上在任何情况下都不会对模型推理产生影响,所以我不完全确定为什么要这样做。

最新更新