I am new to Bayesian statistics and I have been trying to write up a logistic model for JAGS in R. I have defined the priors and the likelihood accordingly. However. I keep getting an error "Node Inconsistent with parents". I have 6 categorical variables and 4 Numerical variables. Any advise would be much appreciated. Thank you.
Code:
model = "model{
# Priors
beta1~dnorm(0,1/100^2);beta2~dunif(0,1);
beta3~dnorm(64.4,1/100^2);beta4~dunif(0,1);
beta5~dunif(0,1);beta6~dunif(0,1);
beta7~dunif(0,1);beta8~dnorm(0.40,1/100^2);
beta9~dnorm(0.64,1/100^2);beta10~dunif(0,1);
# Likelihood
for(i in 1:N) {
p[i] = 1/(1 + exp(-(beta1
+ beta2*genderMale[i]
+ beta3*age[i]
+ beta4*hypertension1[i]
+ beta5*heart_disease1[i]
+ beta6*ever_marriedYes[i]
+ beta7*Residence_typeUrban[i]
+ beta8*avg_glucose_level[i]
+ beta9*bmi[i]
+ beta10*smoking_statussmokes[i])));
Y[i] ~ dbern(p[i])
}
}"
data$gender <- as.factor(data$gender)
data$hypertension <- as.factor(data$hypertension)
data$heart_disease <- as.factor(data$heart_disease)
data$Residence_type <- as.factor(data$Residence_type)
data$smoking_status <- as.factor(data$smoking_status)
data$work_type <- as.factor(data$work_type)
X <- model.matrix(stroke ~ gender + age + hypertension + heart_disease + ever_married + Residence_type + avg_glucose_level + bmi + smoking_status, data=data) # Design matrix
Y <- data$stroke;
library("rjags");library(coda);
set.seed(42)
data = list(Y = Y, genderMale = X[,"genderMale"], age = X[,"age"], hypertension1 = X[,"hypertension1"], heart_disease1 = X[,"heart_disease1"], ever_marriedYes = X[,"ever_marriedYes"], Residence_typeUrban = X[,"Residence_typeUrban"], avg_glucose_level = X[,"avg_glucose_level"], bmi = X[,"bmi"], smoking_statussmokes = X[,"smoking_statussmokes"], N =length(Y));
variable_names = c("beta1","beta2","beta3","beta4","beta5","beta6","beta7","beta8","beta9","beta10","p");
fileConn=file("model.temp");
writeLines(model, fileConn);
close(fileConn);
m = jags.model(file="model.temp", data=data)
draw = jags.samples(m, 1000, thin=1, variable.names = variable_names)
# Convert to a list
make_list <- function(draw)
{
results = list()
for(name in names(draw))
{
# Extract "chain 1"
results[[name]] = as.array(draw[[name]][,,1])
# Transpose 2D arrays
if(length(dim(results[[name]])) == 2)
results[[name]] = t(results[[name]])
}
return(results)
}