
########################################################################
# Fit of the  model 
#
# Beware to install JAGS on your computer and in a second time
# the R package rjags, before using the script.
# 
# Author :  Thibaut Lurier
# Email : thibaut.lurier@vetagro-sup.fr
########################################################################



require(rjags)
require(lattice)

# Data
data <- read.table("Data_Lurier_LCM_Cburnetii_VetRes_2021.txt",header = TRUE)

############################################
# Description of the model in JAGS language#
############################################

model.lclass <-
  "model
{
  
  # Number of animal from each population (herd) in each of the 8 categories of tests results
  for (i in 1:Npop)
  {
  
  n[i,] ~ dmulti(p[i,],N[i])
  
  p[i,1] <- Pinf[i] * ((1 - Se1) * (1 - Se2) * (1 - Se3) + covse_000) + (1 - Pinf[i]) * ((Sp1 * Sp2 * Sp3) + covsp_000)
  p[i,2] <- Pinf[i] * ((1 - Se1) * (1 - Se2) * Se3  + covse_001) + (1 - Pinf[i]) * (Sp1 * Sp2 * (1 - Sp3) + covsp_001)
  p[i,3] <- Pinf[i] * ((1 - Se1) * Se2 * (1 - Se3)  + covse_010 ) + (1 - Pinf[i]) * (Sp1 * (1 - Sp2) * Sp3 + covsp_010)
  p[i,4] <- Pinf[i] * ((1 - Se1) * Se2 * Se3  + covse_011) + (1 - Pinf[i]) * (Sp1 * (1 - Sp2) * (1 - Sp3) + covsp_011)
  p[i,5] <- Pinf[i] * (Se1 * (1 - Se2) * (1 - Se3)  + covse_100) + (1 - Pinf[i]) * ((1 - Sp1) * Sp2 * Sp3 + covsp_100)
  p[i,6] <- Pinf[i] * (Se1 * (1 - Se2) * Se3  + covse_101) + (1 - Pinf[i]) * ((1 - Sp1) * Sp2 * (1 - Sp3) + covsp_101)
  p[i,7] <- Pinf[i] * (Se1 * Se2 * (1 - Se3)  + covse_110) + (1 - Pinf[i]) * ((1 - Sp1) * (1 - Sp2) * Sp3 + covsp_110)
  p[i,8] <- Pinf[i] * (Se1 * Se2 * Se3  + covse_111) + (1 - Pinf[i]) * ((1 - Sp1) * (1 - Sp2) * (1 - Sp3) + covsp_111)
  

  }
  
  # zero inflated beta-binomial distribution of the prevalence in each heard
    for(e in 1:Npop)
  {
  herdstatus[e] ~ dbern(Pherd[numdpt[e]])
  P[e] ~ dbeta(mup * (1 - gamma) / gamma, (1 - mup) * (1 - gamma) / gamma)T(0.00001,0.99999)
  Pinf[e] <- P[e] * herdstatus[e]
  
  # P[e] is at least 1 out the herdsize
  y_P[e] ~ dinterval(P[e], 1/Nherd[e])
  }
  
  # Calculation of the covariance terms
  covse_100 <- covse_011 + covse_111 - covse_000
	covse_101 <- -(covse_001 + covse_011 + covse_111)
	covse_110 <- covse_000 + covse_001 - covse_111
	covse_010 <- -(covse_000 + covse_001 + covse_011)
	
	covsp_100 <- covsp_011 + covsp_111 - covsp_000
	covsp_101 <- -(covsp_001 + covsp_011 + covsp_111)
	covsp_110 <- covsp_000 + covsp_001 - covsp_111
	covsp_010 <- -(covsp_000 + covsp_001 + covsp_011)
  
  ########
  # Prior#
  ########
  
  # Between herd prevalence of the jth departement 
  for(j in 1:Ndpt)
  {
    Pherd[j] ~ dbeta(0.5,0.5)
  }


  mup ~ dbeta(0.5,0.5)T(0.00001,0.99999)
  gamma ~ dbeta(0.5,0.5)T(0.00001,0.99999)
  
  Se1 ~ dbeta(0.5,0.5)
  Se2 ~ dbeta(0.5,0.5)
  Se3 ~ dbeta(0.5,0.5)
  Sp1 ~ dbeta(0.5,0.5)
  Sp2 ~ dbeta(0.5,0.5)
  Sp3 ~ dbeta(0.5,0.5)

  covse_111 ~ dt(0, 1/0.039^2 , 1)
  covse_011 ~ dt(0, 1/0.039^2 , 1)
  covse_000 ~ dt(0, 1/0.039^2 , 1)
  covse_001 ~ dt(0, 1/0.039^2 , 1)
  
  covsp_111 ~ dt(0, 1/0.039^2 , 1)
  covsp_011 ~ dt(0, 1/0.039^2 , 1)
  covsp_000 ~ dt(0, 1/0.039^2 , 1)
  covsp_001 ~ dt(0, 1/0.039^2 , 1)

  ##########################
  # Inequality constraints #
  ##########################

  # Se > 1-Sp
  yse1 ~ dinterval(Se1 ,c(1-Sp1,1))
  yse2 ~ dinterval(Se2 ,c(1-Sp2,1))
  yse3 ~ dinterval(Se3 ,c(1-Sp3,1))
  
  # inequality constraints for covariance terms
  
  yse_000 ~ dinterval(covse_000 ,c(-(1-Se1)*(1-Se2)*(1-Se3),min(1-Se1, min(1-Se2, 1-Se3))-(1-Se1)*(1-Se2)*(1-Se3)))
  yse_001 ~ dinterval(covse_001 ,c(-(1-Se1)*(1-Se2)*Se3,min(1-Se1, min(1-Se2, Se3))-(1-Se1)*(1-Se2)*Se3))
  yse_010 ~ dinterval(covse_010 ,c(-(1-Se1)*Se2*(1-Se3),min(1-Se1, min(Se2, 1-Se3))-(1-Se1)*Se2*(1-Se3)))
  yse_011 ~ dinterval(covse_011 ,c(-(1-Se1)*Se2*Se3, min(1-Se1, min(Se2, Se3))-(1-Se1)*Se2*Se3))
  yse_100 ~ dinterval(covse_100 ,c(-Se1*(1-Se2)*(1-Se3),min(Se1, min((1-Se2), (1-Se3))) -Se1*(1-Se2)*(1-Se3)))
  yse_101 ~ dinterval(covse_101 ,c(-Se1*(1-Se2)*Se3, min(Se1, min((1-Se2), Se3))-Se1*(1-Se2)*Se3))
  yse_110 ~ dinterval(covse_110 ,c(-Se1*Se2*(1-Se3),min(Se1, min(Se2, 1-Se3))-Se1*Se2*(1-Se3)))
  yse_111 ~ dinterval(covse_111 ,c(-Se1*Se2*Se3,min(Se1, min(Se2, Se3)) -Se1*Se2*Se3))
  
  ysp_000 ~ dinterval(covsp_000 ,c(-Sp1*Sp2*Sp3,min(Sp1, min(Sp2, Sp3))-Sp1*Sp2*Sp3))
  ysp_001 ~ dinterval(covsp_001 ,c(-Sp1*Sp2*(1-Sp3), min(Sp1, min(Sp2, 1-Sp3))-Sp1*Sp2*(1-Sp3)))
  ysp_010 ~ dinterval(covsp_010 ,c(-Sp1*(1-Sp2)*Sp3,min(Sp1, min(1-Sp2, Sp3))-Sp1*(1-Sp2)*Sp3))
  ysp_011 ~ dinterval(covsp_011 ,c(-Sp1*(1-Sp2)*(1-Sp3),min(Sp1, min(1-Sp2, 1-Sp3))-Sp1*(1-Sp2)*(1-Sp3)))
  ysp_100 ~ dinterval(covsp_100 ,c(-(1-Sp1)*Sp2*Sp3,min((1-Sp1),min(Sp2, Sp3))-(1-Sp1)*Sp2*Sp3))
  ysp_110 ~ dinterval(covsp_110 ,c(-(1-Sp1)*(1-Sp2)*Sp3,min((1-Sp1), min((1-Sp2), Sp3))-(1-Sp1)*(1-Sp2)*(1-Sp3)))
  ysp_101 ~ dinterval(covsp_101 ,c(-(1-Sp1)*Sp2*(1-Sp3),min((1-Sp1), min(Sp2, 1-Sp3))-(1-Sp1)*Sp2*(1-Sp3)))
  ysp_111 ~ dinterval(covsp_111 ,c(-(1-Sp1)*(1-Sp2)*(1-Sp3),min(1-Sp1, min(1-Sp2, 1-Sp3))-(1-Sp1)*(1-Sp2)*(1-Sp3)))
  
}"



#######################################################
#####################    SHEEP    #####################
#######################################################
data_O <- subset(data, data$species == "sheep")
data_O$Nherd[is.na(data_O$Nherd)] <- median(data_O$Nherd,na.rm = T)
#Creation of argument data for jags.model

N <- rowSums(data_O[,4:11])

data4jags.lclass_O <- list(Npop = nrow(data_O),
                           N = N,
                           Nherd = data_O$Nherd,
                           n = as.matrix(data_O[,4:11]),
                           Ndpt=10,
                           numdpt = data_O$dpt,
                           yse_000 = 1,
                           yse_001 = 1,
                           yse_010 = 1,
                           yse_011 = 1,
                           yse_100 = 1,
                           yse_101 = 1,
                           yse_110 = 1,
                           yse_111 = 1,
                           ysp_000 = 1,
                           ysp_001 = 1,
                           ysp_010 = 1,
                           ysp_011 = 1,
                           ysp_100 = 1,
                           ysp_101 = 1,
                           ysp_110 = 1,
                           ysp_111 = 1,
                           yse1 = 1,
                           yse2 = 1,
                           yse3 = 1,
                           y_P = rep(1,nrow(data_O)))

##################
# Initialisation #
##################

# initialization ensures that the parameters respect the constraints of the model

inits <- list(list(),list(),list())

for (k in 1:3) {
  
  Sp1 <- rbeta(1,5,1)
  Sp2 <- rbeta(1,5,1)
  Sp3 <- rbeta(1,5,1)
  
  Se1 <- runif(1,1-Sp1,1)
  Se2 <- runif(1,1-Sp2,1)
  Se3 <- runif(1,1-Sp3,1)
  
  
  covse_111 <- 0
  covse_011 <- 0
  covse_001 <- 0
  covse_000 <- 0
  
  covsp_111 <- 0
  covsp_011 <- 0
  covsp_001 <- 0
  covsp_000 <- 0
  
  P <- runif(length(data_O$Nherd),1/data_O$Nherd,1)
  
  inits[[k]] <-  list(Se1 = Se1, Se2 = Se2, Se3 = Se3,Sp1 = Sp1,
                      Sp2 = Sp2, Sp3 = Sp3, covse_111 = covse_111,
                      covse_011 = covse_011, covse_001 = covse_001,
                      covse_000 = covse_000, covsp_111 = covsp_111,
                      covsp_011 = covsp_011, covsp_001 = covsp_001,
                      covsp_000 = covsp_000, P = P)
}


##################################
# Inference using MCMC algorithm #
# This step can take a few hours #
##################################
m.lclass_O<- jags.model(file = textConnection(model.lclass), 
                        data = data4jags.lclass_O,  n.chains = 3, inits = inits)

update(m.lclass_O, n.iter = 10000) # burnin

mcmc.lclass_O<- coda.samples(m.lclass_O, c("mup","gamma","Pherd","Se1","Se2","Se3",
                                           "Sp1","Sp2","Sp3","covse_000","covse_001",
                                           "covse_011", "covse_111","covsp_000","covsp_001",
                                           "covsp_011", "covsp_111"), n.iter = 100000, thin = 20) 


##############################
# Estimation and diagnostics #
##############################

# Check of the convergence 
xyplot((mcmc.lclass_O),layout=c(3,6))
gelman.diag(mcmc.lclass_O)


# Parameter estimations
summary( mcmc.lclass_O)
densityplot(mcmc.lclass_O,layout=c(3,6))



#######################################################
#####################    GOAT     #####################
#######################################################

data_C <- subset(data, data$species == "goat")
data_C$Nherd[is.na(data_C$Nherd)] <- median(data_C$Nherd,na.rm = T)
#Creation of argument data for jags.model

N <- rowSums(data_C[,4:11])

data4jags.lclass_C <- list(Npop = nrow(data_C),
                           N = N,
                           Nherd = data_C$Nherd,
                           n = as.matrix(data_C[,4:11]),
                           Ndpt=10,
                           numdpt = data_C$dpt,
                           yse_000 = 1,
                           yse_001 = 1,
                           yse_010 = 1,
                           yse_011 = 1,
                           yse_100 = 1,
                           yse_101 = 1,
                           yse_110 = 1,
                           yse_111 = 1,
                           ysp_000 = 1,
                           ysp_001 = 1,
                           ysp_010 = 1,
                           ysp_011 = 1,
                           ysp_100 = 1,
                           ysp_101 = 1,
                           ysp_110 = 1,
                           ysp_111 = 1,
                           yse1 = 1,
                           yse2 = 1,
                           yse3 = 1,
                           y_P = rep(1,nrow(data_C)))

##################
# Initialisation #
##################

# initialization ensures that the parameters respect the constraints of the model



inits <- list(list(),list(),list())

for (k in 1:3) {
  
  Sp1 <- rbeta(1,5,1)
  Sp2 <- rbeta(1,5,1)
  Sp3 <- rbeta(1,5,1)
  
  Se1 <- runif(1,1-Sp1,1)
  Se2 <- runif(1,1-Sp2,1)
  Se3 <- runif(1,1-Sp3,1)
  
  
  covse_111 <- 0
  covse_011 <- 0
  covse_001 <- 0
  covse_000 <- 0
  
  covsp_111 <- 0
  covsp_011 <- 0
  covsp_001 <- 0
  covsp_000 <- 0
  
  P <- runif(length(data_C$Nherd),1/data_C$Nherd,1)
  
  inits[[k]] <-  list(Se1 = Se1, Se2 = Se2, Se3 = Se3,Sp1 = Sp1,
                      Sp2 = Sp2, Sp3 = Sp3, covse_111 = covse_111,
                      covse_011 = covse_011, covse_001 = covse_001,
                      covse_000 = covse_000, covsp_111 = covsp_111,
                      covsp_011 = covsp_011, covsp_001 = covsp_001,
                      covsp_000 = covsp_000, P = P)
}

##################################
# Inference using MCMC algorithm #
# This step can take a few hours #
##################################
m.lclass_C<- jags.model(file = textConnection(model.lclass), 
                        data = data4jags.lclass_C,  n.chains = 3, inits = inits)

update(m.lclass_C, n.iter = 10000) # burnin

mcmc.lclass_C<- coda.samples(m.lclass_C, c("mup","gamma","Pherd","Se1","Se2","Se3",
                                           "Sp1","Sp2","Sp3","covse_000","covse_001",
                                           "covse_011", "covse_111","covsp_000","covsp_001",
                                           "covsp_011", "covsp_111"), n.iter = 100000, thin = 20) 


##############################
# Estimation and diagnostics #
##############################

# Check of the convergence 
xyplot((mcmc.lclass_C),layout=c(3,6))
gelman.diag(mcmc.lclass_C)

# Parameter estimations
summary( mcmc.lclass_C)
densityplot(mcmc.lclass_C,layout=c(3,6))




#######################################################
########   CATTLE without 7th Department  #############
#######################################################
data_B_s7 <- subset(data, data$species == "cattle" & data$dpt!=7)
data_B_s7$Nherd <- as.integer(data_B_s7$Nherd)
data_B_s7$Nherd[is.na(data_B_s7$Nherd)] <- median(data_B_s7$Nherd,na.rm = T)
#Creation of argument data for jags.model

N <- rowSums(data_B_s7[,4:11])

data4jags.lclass_B_s7 <- list(Npop = nrow(data_B_s7),
                           N = N,
                           Nherd = data_B_s7$Nherd ,
                           n = as.matrix(data_B_s7[,4:11]),
                           Ndpt=10,
                           numdpt = data_B_s7$dpt,
                           yse_000 = 1,
                           yse_001 = 1,
                           yse_010 = 1,
                           yse_011 = 1,
                           yse_100 = 1,
                           yse_101 = 1,
                           yse_110 = 1,
                           yse_111 = 1,
                           ysp_000 = 1,
                           ysp_001 = 1,
                           ysp_010 = 1,
                           ysp_011 = 1,
                           ysp_100 = 1,
                           ysp_101 = 1,
                           ysp_110 = 1,
                           ysp_111 = 1,
                           yse1 = 1,
                           yse2 = 1,
                           yse3 = 1,
                           y_P = rep(1,nrow(data_B_s7)))

##################
# Initialisation #
##################

# initialization ensures that the parameters respect the constraints of the model

inits <- list(list(),list(),list())

for (k in 1:3) {
  
  Sp1 <- rbeta(1,5,1)
  Sp2 <- rbeta(1,5,1)
  Sp3 <- rbeta(1,5,1)
  
  Se1 <- runif(1,1-Sp1,1)
  Se2 <- runif(1,1-Sp2,1)
  Se3 <- runif(1,1-Sp3,1)
  
  
  covse_111 <- 0
  covse_011 <- 0
  covse_001 <- 0
  covse_000 <- 0
  
  covsp_111 <- 0
  covsp_011 <- 0
  covsp_001 <- 0
  covsp_000 <- 0
  
  P <- runif(length(data_B_s7$Nherd),1/data_B_s7$Nherd,1)
  
  inits[[k]] <-  list(Se1 = Se1, Se2 = Se2, Se3 = Se3,Sp1 = Sp1,
                      Sp2 = Sp2, Sp3 = Sp3, covse_111 = covse_111,
                      covse_011 = covse_011, covse_001 = covse_001,
                      covse_000 = covse_000, covsp_111 = covsp_111,
                      covsp_011 = covsp_011, covsp_001 = covsp_001,
                      covsp_000 = covsp_000, P = P)
}


##################################
# Inference using MCMC algorithm #
# This step can take a few hours #
##################################
m.lclass_B_s7<- jags.model(file = textConnection(model.lclass), 
                        data = data4jags.lclass_B_s7,  n.chains = 3, inits = inits)

update(m.lclass_B_s7, n.iter = 10000) # burnin

mcmc.lclass_B_s7<- coda.samples(m.lclass_B_s7, c("mup","gamma","Pherd","Se1","Se2","Se3",
                                           "Sp1","Sp2","Sp3","covse_000","covse_001",
                                           "covse_011", "covse_111","covsp_000","covsp_001",
                                           "covsp_011", "covsp_111"), n.iter = 100000, thin = 20) 


##############################
# Estimation and diagnostics #
##############################

# Check of the convergence 
xyplot((mcmc.lclass_B_s7),layout=c(3,6))
gelman.diag(mcmc.lclass_B_s7)

# Parameter estimations
summary( mcmc.lclass_B_s7)
densityplot(mcmc.lclass_B_s7,layout=c(3,6))




#######################################################
#######   CATTLE only in the 7th Department  ##########
#######################################################
data_B_7 <- subset(data, data$species == "cattle" & data$dpt==7)
data_B_7$Nherd[is.na(data_B_7$Nherd)] <- median(data_B_7$Nherd,na.rm = T)
#Creation of argument data for jags.model

N <- rowSums(data_B_7[,4:11])

data4jags.lclass_B_7 <- list(Npop = nrow(data_B_7),
                              N = N,
                              Nherd = data_B_7$Nherd,
                              n = as.matrix(data_B_7[,4:11]),
                              Ndpt=10,
                              numdpt = data_B_7$dpt,
                              yse_000 = 1,
                              yse_001 = 1,
                              yse_010 = 1,
                              yse_011 = 1,
                              yse_100 = 1,
                              yse_101 = 1,
                              yse_110 = 1,
                              yse_111 = 1,
                              ysp_000 = 1,
                              ysp_001 = 1,
                              ysp_010 = 1,
                              ysp_011 = 1,
                              ysp_100 = 1,
                              ysp_101 = 1,
                              ysp_110 = 1,
                              ysp_111 = 1,
                              yse1 = 1,
                              yse2 = 1,
                              yse3 = 1,
                             y_P = rep(1,nrow(data_B_7)))

##################
# Initialisation #
##################

# initialization ensures that the parameters respect the constraints of the model

inits <- list(list(),list(),list())
for (k in 1:3) {
  
  Sp1 <- rbeta(1,5,1)
  Sp2 <- rbeta(1,5,1)
  Sp3 <- rbeta(1,5,1)
  
  Se1 <- runif(1,1-Sp1,1)
  Se2 <- runif(1,1-Sp2,1)
  Se3 <- runif(1,1-Sp3,1)
  
  
  covse_111 <- 0
  covse_011 <- 0
  covse_001 <- 0
  covse_000 <- 0
  
  covsp_111 <- 0
  covsp_011 <- 0
  covsp_001 <- 0
  covsp_000 <- 0
  
  P <- runif(length(data_B_7$Nherd),1/data_B_7$Nherd,1)
  
  inits[[k]] <-  list(Se1 = Se1, Se2 = Se2, Se3 = Se3,Sp1 = Sp1,
                      Sp2 = Sp2, Sp3 = Sp3, covse_111 = covse_111,
                      covse_011 = covse_011, covse_001 = covse_001,
                      covse_000 = covse_000, covsp_111 = covsp_111,
                      covsp_011 = covsp_011, covsp_001 = covsp_001,
                      covsp_000 = covsp_000, P = P)
}



##################################
# Inference using MCMC algorithm #
# This step can take a few hours #
##################################
m.lclass_B_7<- jags.model(file = textConnection(model.lclass), 
                           data = data4jags.lclass_B_7,  n.chains = 3, inits = inits)

update(m.lclass_B_7, n.iter = 10000) # burnin

mcmc.lclass_B_7<- coda.samples(m.lclass_B_7, c("mup","gamma","Pherd","Se1","Se2","Se3",
                                                 "Sp1","Sp2","Sp3","covse_000","covse_001",
                                                 "covse_011", "covse_111","covsp_000","covsp_001",
                                                 "covsp_011", "covsp_111"), n.iter = 100000, thin = 20) 


##############################
# Estimation and diagnostics #
##############################

# Check of the convergence 
xyplot((mcmc.lclass_B_7),layout=c(3,6))
gelman.diag(mcmc.lclass_B_7)

# Parameter estimations
summary( mcmc.lclass_B_7)
densityplot(mcmc.lclass_B_7,layout=c(3,6))

