我正在使用来自R的Winbugs进行贝叶斯分析。我需要将两个Winbugs脚本合并为一个:但是,我收到一条错误消息(Variable x2 is not defined in model or in data set
)。这是winbugs代码:
model{
# Model’s likelihood
for (i in 1:n) {
tto[i] ~ dnorm( mu[i], tau ) # stochastic componenent
b[i] ~ dnorm(0.0, tau2)
# link and linear predictor
mu[i] <- 1 - (beta.concern2*concern2[i] + beta.concern3*concern3[i] + b[i])
}
for (i in 1:1002) {
# Linear regression on logit
logit(p[i]) <- beta.concern2*x2[i,1] + beta.concern2*x2[i,2]
# Likelihood function for each data point
y2[i] ~ dbern(p[i])
}
s2<-1/tau
s <-sqrt(s2)
a2<-1/tau2
a <-sqrt(a2)
}
其中x2
是1002 * 2矩阵,y
是向量
这是定义数据的R代码:
combined.data <- list(n=n,tto=tto,concern2=concern2,
concern3=concern3,y2=y2, x2=x2)
任何人都知道出了什么问题?
答案 0 :(得分:1)
我将在这里做出相当多的假设......
也许您可以添加一个图表来说明变量之间的关系,哪些是确定性的与随机的。在BUGS中制作模型时,我觉得这很有用。此外,拥有所有数据的维度,n
的含义以及您正在建模的内容和您感兴趣的节点的某些上下文或详细信息会很有帮助。
我猜测y
是长度为1002的二进制(0,1)向量,并且具有x2[,1]
和x2[,2]
的对应值(此处x1
, x2
)和concern2
,concern3
(此处c2
,c3
)和tto
即
nrow(x2) == 1002
以下是使用nrow==10
的一些示例数据:
y <- sample(x=c(0,1), size=10, replace=TRUE, prob=c(0.5,0.5))
x2 <- matrix(rnorm(20), nrow=10, ncol=2)
c2 <- rnorm(10)
c3 <- rnorm(10)
tto <- rnorm(10)
您似乎正在尝试为logit中beta.concern2
的两个值确定b2
(此为x2
)的值。不确定为什么要为两个不同的预测变量拟合相同的参数。如果这是一个拼写错误,我将b2
和b3
作为参数。我希望你能够根据自己的需要调整它。
b2
,b3
(随机)和c2
,c3
(给定)这些值的乘积用于生成变量mu
,它也有一个错误术语。 (我假设b[i]
(此处为b1[i]
)是一个正态分布的错误术语。)
然后tto
是一个正态分布的变量,它取决于mu
的值,并且它本身有一个错误项。在两种情况下,我都将误差项的精度设置为相等。
所以对于这样的模型:
require(rjags)
### The data
dataList <- list(
x1 = x2[,1],
x2 = x2[,2],
y = y,
c2 = c2,
c3 = c3,
tto = tto,
nRowX = nrow(x2)
)
### make sure logistic model can be fitted
f1 <- stats::glm(dataList$y ~ dataList$x1 + dataList$x2 -1, family=binomial(logit))
show(f1)
### set some approximate initial values
b1Init <- 0.1 # arbitrary
b2Init <- f1$coef[2]
b3Init <- f1$coef[3]
initsList <- list(
b1 = b1Init,
b2 = b2Init,
b3 = b3Init)
### Model: varying parameters (b2, b3) per observation; 2x error terms
modelstring <- "
model {
for(i in 1:nRowX){
tto[i] ~ dnorm(mu[i], prec)
mu[i] <- 1 - (b1 + b2*c2[i] + b3*c3[i])
y[i] ~ dbern(L[i]) # L for logit
L[i] <- 1/(1+exp(- ( b2*x1[i] + b3*x2[i]) ))
}
b1 ~ dnorm(0, prec) # precision
prec <- 1/sqrt(SD) # convert to Std Deviation
SD <- 0.5
b2 ~ dnorm(0, 1.4) # arbitrary
b3 ~ dnorm(0, 1.4)
}
"
writeLines(modelstring,con="model.txt")
parameters <- c("b1","b2","b3") # to monitor
adaptSteps <- 1e4 # "tune in" samplers
burnInSteps <- 2e4 # "burn in" samplers
nChains <- 3
numSavedSteps <-2e3
thinSteps <- 1 # Steps to "thin" (1=keep every step).
nPerChain <- ceiling(( numSavedSteps * thinSteps ) / nChains) # Steps per chain
rm(jagsModel) # in case already present
jagsModel <- rjags::jags.model(
"model.txt", data=dataList,
inits=initsList, n.chains=nChains,
n.adapt=adaptSteps)
stats::update(jagsModel, n.iter=burnInSteps)
### MCMC chain
MCMC1 <- as.matrix(rjags::coda.samples(
jagsModel, variable.names=parameters,
n.iter=nPerChain, thin=thinSteps))
### Extract chain values
b2Sample <- as.vector(MCMC1[,grep("b2",colnames(MCMC1))])