########################################################################################################### # # A landscape-scale assessment of tropical mammals reveals the effects of habitat and anthropogenic disturbance on community occupancy # # N. Cavada, R. Havmøller, N. Sharff, F. Rovero # # Appendix 1: R and Jags model code # ########################################################################################################### #set working directory setwd("/your/path") # load data load("multiregion_occupancy.RData") #number of regions (i.e. forest blocks) R<-5 #number of augmented species M<-100 #number of camera trap sites in each region R nsite<-c(51,34,26,25,28) #number of camera trap days nrep<-nrepmatrix ##total number of detected species in forest block nspec<-c(29,33,24,25,24) #total number oof augmented individuals for each forest block nz<-c(71,67,76,75,76) #Jags model cat(" model{ # Hyperpriors mu.omega ~ dnorm(0,0.01) #occupancy parameter mean.omega <- 1/(1+exp(-mu.omega)) mu.lpsi~ dnorm(0,0.01) #community mean of occupancy (logit) - intercept mu.sd.lpsi ~ dunif(0,10) # variability among species in logit(psi) beta1 ~ dunif(-10,10) #slope of logit(psi) on logmass mu.beta2.global ~ dunif(-10,10) #slope of logit(psi) on distance to nearest river (dRiv) tau.beta2.global <- pow(sd.beta2.global,-2) sd.beta2.global ~ dunif(0,4) mu.beta3.global ~ dunif(-10,10) #slope of logit(psi) on distance to reserve border (dRes) tau.beta3.global <- pow(sd.beta3.global,-2) sd.beta3.global ~ dunif(0,4) mu.beta4.global ~ dunif(-10,10) #slope of logit(psi) on moist forest cover (forCov) tau.beta4.global <- pow(sd.beta4.global,-2) sd.beta4.global ~ dunif(0,4) mu.lp ~ dnorm(0,0.01)# community mean of detection mu.sd.lp ~ dunif(0,10) # variability among species in logit(p) alpha1 ~ dunif(-5,5) #slope of logit(p) on logmass mu.alpha2.global ~ dunif(-10,10) #slope of logit(p) on distance to reserve border (dRes) tau.alpha2.global <- pow(sd.alpha2.global,-2) sd.alpha2.global ~ dunif(0,4) #priors for species trait - logmass for(r in 1:R){ for(k in 1:M){ logmass[k,r] ~ dnorm(mu.logmass[r],tau.logmass[r]) } } for(r in 1:R){ mu.logmass[r] ~ dnorm(0,0.01) tau.logmass[r] <- pow(sigma.logmass[r],-2) sigma.logmass[r] ~ dunif(0,10) } for(r in 1:R){ lpsi[r]<-mu.lpsi #region lpsi means constrained to overall mean sd.lpsi[r] <- mu.sd.lpsi tau.lpsi[r] <- pow(sd.lpsi[r],-2) lp[r] <- mu.lp #region lp means constrained to overall mean sd.lp[r] <- mu.sd.lp tau.lp[r] <- pow(sd.lp[r],-2) for(k in 1:M){ alpha2[k,r] ~ dnorm(mu.alpha2[r],tau.alpha2[r]) beta2[k,r]~ dnorm(mu.beta2[r],tau.beta2[r]) beta3[k,r]~ dnorm(mu.beta3[r],tau.beta3[r]) beta4[k,r]~ dnorm(mu.beta4[r],tau.beta4[r]) } } for(r in 1:R){ mu.alpha2[r] <- mu.alpha2.global tau.alpha2[r] <- tau.alpha2.global mu.beta2[r] <- mu.beta2.global tau.beta2[r] <- tau.beta2.global mu.beta3[r] <- mu.beta3.global tau.beta3[r] <- tau.beta3.global mu.beta4[r] <- mu.beta4.global tau.beta4[r] <- tau.beta4.global } # state process for(r in 1:R){ for(k in 1:M){ w[k,r] ~ dbern(omega[r]) #Metacommunity membership indicator (data augmentation variable) beta0[k,r] ~ dnorm(lpsi[r], tau.lpsi[r]) alpha0[k,r] ~ dnorm(lp[r], tau.lp[r]) #occupancy model for(i in 1:nsite[r]){ logit(psi[k,i,r]) <- beta0[k,r] + beta1 * logmass[k,r] + beta2[k,r] * dRiv[i,r] + beta3[k,r] * dSettl[i,r] + beta4[k,r] * forCov[i,r] mu.psi[k,i,r] <- psi[k,i,r] * w[k,r] z[k,i,r] ~ dbern(mu.psi[k,i,r]) #observation model logit(p[k,i,r]) <- alpha0[k,r] + alpha1 * logmass[k,r] + alpha2[k,r] * dSettl[i,r] mu.p[k,i,r] <- p[k,i,r]*z[k,i,r] yaug[k,i,r] ~ dbin(mu.p[k,i,r], nrep[i,r]) } } } #derived quantities for(r in 1:R){ logit(omega[r]) <- mu.omega Ntotal[r] <- sum(w[,r]) n0[r] <- sum(w[(nspec[r]+1):(nspec[r]+nz[r]),r]) for(k in 1:M){ Nocc.fs[k,r] <- sum(z[k,1:nsite[r],r]) } for (i in 1:nsite[r]) { Nsite[i,r] <- sum(z[1:nspec[r],i,r]) #1:nspec[r] # Number of occurring species at each site } }}", fill = TRUE, file="multiregion_occupancy.txt") #data jags.data <- list(M=M, nsite=nsite, R=R, nrep=nrepmatrix, nspec=nspec, nz=nz, yaug=yaug, logmass=logmass, dRiv=dRiv, dSettl=dSettl, forCov=forCov) ##initial values inits <- function() {list(z=zst, w=wst, mu.omega=runif(1,-0.8,-0.6), lpsi=rnorm(n=nspec+nz), lp=rnorm(n=nspec+nz), beta1=runif(1,0.1,0.4), alpha1=runif(1,-0.18,0.15), mu.alpha2.global=runif(1,-0.5,0.5), sd.alpha2.global=runif(1,0.5,1.5), mu.beta2.global=runif(1,-0.5,0.5), sd.beta2.global=runif(1,0.5,1.5), mu.beta3.global=runif(1,-0.5,0.5), sd.beta3.global=runif(1,0.5,1.5), mu.beta4.global=runif(1,-0.5,0.5), sd.beta4.global=runif(1,0.5,1.5)) } params <- c("mu.lpsi","mu.sd.lpsi" ,"mu.omega","mu.beta2.global","sd.beta2.global","beta1", "mu.beta3.global","sd.beta3.global","mu.beta4.global","sd.beta4.global","mu.lp", "mu.sd.lp","mu.alpha2.global","sd.alpha2.global","alpha1", "mu.logmass","sigma.logmass","n0","Ntotal","Nsite") n.burnin <- 5000 n.iter <- 50000 n.thin <- 10 n.chains <- 3 library(R2jags) out <- jags(data=jags.data, inits=inits, parameters.to.save=params, model.file="multiregion_occupancy.txt", n.chains=n.chains, n.iter=n.iter, n.burnin=n.burnin, n.thin=n.thin)