r-JAGS中具有二进制和连续指示符的潜在变量估计



我使用R2jags同时使用二进制和连续变量来估计潜在因素。我想知道R2jags的jags命令是否可以同时处理二进制和连续变量。我试图找到解释jags可以处理的变量类型的文章,但我找不到。如果jags可以在同一个模型中同时考虑二进制和连续,那么在创建模型时,指定变量类型的正确方法是什么?

感谢您提前提供的帮助。

这里有一个例子。首先,我将制作一些数据:

library(R2jags)
set.seed(207)
z <- rnorm(250)
y_num <- apply(matrix(rnorm(750,0, .25), ncol=3), 2, (x)x+z)
y_bin <- apply(matrix(rnorm(750,0, .25), ncol=3), 2, (x)plogis(x+z))
y_bin <- apply(y_bin, 2, (x)rbinom(length(x), 1, x))
y_num <- scale(y_num)

接下来,我们将数据放在一个列表中,以提供给JAGS:

datl <- list(
N = nrow(y_num),
y_num = y_num, 
y_bin = y_bin, 
a0=c(0,0), 
A0 = diag(2)*.1
)

接下来,我们可以编写模型。在这里,我们使用伯努利分布来拟合二进制变量,使用正态分布来拟合连续变量(注意,下面的代码将把模型代码写入工作目录中的文件(:

jags.mod <- "model{
for(i in 1:N){
for(j in 1:3){
y_num[i,j] ~ dnorm(mu[i,j], tau[j])
mu[i,j] <- b[j]*zeta[i]
}
for(j in 1:3){
y_bin[i,j] ~ dbern(p[i,j])
logit(p[i,j]) <- a[1,j] + a[2,j]*zeta[i]
}
zeta[i] ~ dnorm(0,1)
}
b[1] <- 1
b[2] ~ dnorm(0,.1)T(0, )
b[3] ~ dnorm(0,.1)T(0, )
for(j in 1:3){
a[1:2, j] ~ dmnorm(a0[1:2], A0[1:2,1:2])
tau[j] ~ dt(0,.1, 1)T(0,)
}
}"
cat(jags.mod, file="jags_model.txt")

现在我们可以运行模型:

jgs <- jags(datl, 
inits=NULL, 
parameters.to.save = c("a", "b", "tau", "zeta"), 
model.file = "jags_model.txt")
#> module glm loaded
#> Compiling model graph
#>    Resolving undeclared variables
#>    Allocating nodes
#> Graph information:
#>    Observed stochastic nodes: 1500
#>    Unobserved stochastic nodes: 258
#>    Total graph size: 4776
#> 
#> Initializing model

最后,由于我们制作了数据,我们知道了真实的潜在变量,因此我们可以评估估计的潜在变量与真实潜在变量之间的相似性:

zeta_hat <- jgs$BUGSoutput$summary[,1]
zeta_hat <- zeta_hat[grep("zeta", names(zeta_hat))]
# correlate estimated latent variable (zeta_hat) with true latent variable (z). 
cor(zeta_hat, z)
#> [1] 0.99146

创建于2022-10-19由reprex包(v2.0.1(

最新更新