Machalilla Spatial Factor Multi-Species Occupancy Model

Data from: Machalilla

model
code
analysis
58 sites, 11 mammal species
Authors

German Forero

Robert Wallace

Galo Zapara-Rios

Emiliana Isasi-Catalá

Diego J. Lizcano

Published

August 16, 2025

Single-species occupancy models

Single-species occupancy models (MacKenzie et al., 2002) are widely used in ecology to estimate and predict the spatial distribution of a species from data collected in presence–absence repeated surveys. The popularity of these models stems from their ability to estimate the effects of environmental or management covariates on species occurrences, while accounting for false-negative errors in detection, which are common in surveys of natural populations.

Multi-species occupancy models

Multi-species occupancy models for estimating the effects of environmental covariates on several species occurrences while accounting for imperfect detection were build on the principle of the Single-species occupancy model, and developed more than 20 years ago.

Multi-species occupancy models are a powerful tool for combining information from multiple species to estimate both individual and community-level responses to management and environmental variables.

Objective

We want to asses the effect of protected areas on the occupancy of the species. We hypothesize that several mammal species have benefited of the conservation actions provided by protected areas, so we expect a decreases in occupancy from the interior of the protected area to the exterior as a function of the distance to the protected area border.

To account for several ecological factors we also tested and included elevation and forest integrity index as occupancy covariates.

We used the newly developed R package spOccupancy as approach to modelling the probability of occurrence of each species as a function of fixed effects of measured environmental covariates and random effects designed to account for unobserved sources of spatial dependence (spatial autocorrelation).

Code
library(grateful) # Facilitate Citation of R Packages
library(readxl) # Read Excel Files
library(DT) # A Wrapper of the JavaScript Library 'DataTables'
library(sf) # Simple Features for R
library(mapview) # Interactive Viewing of Spatial Data in R
library(maps) # Draw Geographical Maps
library(tmap) # Thematic Maps
library(terra) # Spatial Data Analysis
library(elevatr) # Access Elevation Data from Various APIs

# library(rjags) # Bayesian Graphical Models using MCMC 
library(bayesplot) # Plotting for Bayesian Models # Plotting for Bayesian Models
library(tictoc) # Functions for Timing R Scripts, as Well as Implementations of "Stack" and "StackList" Structures 
library(MCMCvis) # Tools to Visualize, Manipulate, and Summarize MCMC Output
library(coda) # Output Analysis and Diagnostics for MCMC
library(beepr) # Easily Play Notification Sounds on any Platform 
library(snowfall) # Easier Cluster Computing (Based on 'snow')

#library(ggmcmc)
library(camtrapR) # Camera Trap Data Management and Preparation 
library(spOccupancy) # Single-Species, Multi-Species, and Integrated Spatial Occupancy
library(tidyverse) # Easily Install and Load the 'Tidyverse'

Fitting a Multi-Species Spatial Occupancy Model

We use a more computationally efficient approach for fitting spatial multi-species occupancy models. This alternative approach is called a “spatial factor multi-species occupancy model”, and is described in depth in Doser, Finley, and Banerjee (2023). This newer approach also accounts for residual species correlations (i.e., it is a joint species distribution model with imperfect detection). The simulation results from Doser, Finley, and Banerjee (2023) show that this new alternative approach outperforms, or performs equally to spMsPGOcc(), while being substantially faster.

The Latent factor multi-species occupancy model is described in detail here

Data from Plantas Medicinales Putumayo

Here we use the table: - COL-18-Putumayo2023

Code
source("C:/CodigoR/WCS-CameraTrap/R/organiza_datos_v3.R")

AP_PlantasMed <- read_sf("C:/CodigoR/Occu_APs/shp/PlantasMedicinales/WDPA_WDOECM_May2025_Public_555511938_shp-polygons.shp")

### Ecu 17, Ecu 18, ECU 20, Ecu 22  

# load data and make array_locID column
Col_18 <- loadproject("F:/WCS-CameraTrap/data/BDcorregidas/Colombia/COL-018-Putumayo2023_WCS_WI.xlsx") |> mutate(array_locID=paste("Col_18", locationID, sep="_"))


# get sites
Col_18_sites <- get.sites("F:/WCS-CameraTrap/data/BDcorregidas/Colombia/COL-018-Putumayo2023_WCS_WI.xlsx")



# get elevation map
elevation_18 <- rast(get_elev_raster(Col_18_sites, z = 10)) #z =1-14
# bb <-  st_as_sfc(st_bbox(elevation_17)) # make bounding box 




# extract covs using points and add to _sites
covs_Col_18_sites <- cbind(Col_18_sites, terra::extract(elevation_18, Col_18_sites))
# covs_Col_17_sites <- cbind(Col_17_sites, terra::extract(elevation_17, Col_17_sites))


# get which are in and out
covs_Col_18_sites$in_AP = st_intersects(covs_Col_18_sites, AP_PlantasMed, sparse = FALSE)
# covs_Col_17_sites$in_AP = st_intersects(covs_Col_17_sites, AP_Yasuni, sparse = FALSE)




# make a map
mapview (elevation_18, alpha=0.5) + 
  mapview (AP_PlantasMed, color = "green", col.regions = "green", alpha = 0.5) +
  mapview (covs_Col_18_sites, zcol = "in_AP", col.regions =c("red","blue"), burst = TRUE) 
  # mapview (covs_Col_17_sites, zcol = "in_AP", col.regions =c("red","blue"), burst = TRUE) +

Data fom Bajo Madidi and Heath

Here we use the tables: - BOL-008a - BOL-008b - BOL14a - BOL14b

Code
source("C:/CodigoR/WCS-CameraTrap/R/organiza_datos_v3.R")

Area_Madidi <- read_sf("C:/CodigoR/Occu_APs/shp/Area_Madidi/WDPA_WDOECM_Jul2025_Public_303894_shp-polygons.shp")

Madidi_NP <- read_sf("C:/CodigoR/Occu_APs/shp/Madidi_NP/WDPA_WDOECM_Jul2025_Public_98183_shp-polygons.shp")
#AP_Tahuayo <- read_sf("C:/CodigoR/Occu_APs/shp/Tahuayo/WDPA_WDOECM_Jun2025_Public_555555621_shp-polygons.shp")

# load data and make array_locID column
#Bol_Pacaya <- read_excel("F:/WCS-CameraTrap/data/BDcorregidas/Peru/PER-003_BD_ACRCTT_T0.xlsx", sheet = "Image")


Bol_Madidi_1 <- loadproject("F:/WCS-CameraTrap/data/BDcorregidas/Bolivia/Guido/BOL-008a.xlsx") |> mutate(Point.x=as.character(paste("M1",Point.x, sep = "-"))) |> mutate(Point.y=as.character(paste("M1",Point.y, sep = "-")))

Bol_Madidi_2 <- loadproject("F:/WCS-CameraTrap/data/BDcorregidas/Bolivia/Guido/BOL-008b.xlsx") |> mutate(Point.x=as.character(paste("M2",Point.x, sep = "-"))) |> mutate(Point.y=as.character(paste("M2",Point.y, sep = "-")))

Bol_Madidi_3 <- loadproject("F:/WCS-CameraTrap/data/BDcorregidas/Bolivia/Guido/BOL-014a.xlsx")|> mutate(Point.x=as.character(paste("M3",Point.x, sep = "-"))) |> mutate(Point.y=as.character(paste("M3",Point.y, sep = "-")))

Bol_Madidi_4 <- loadproject("F:/WCS-CameraTrap/data/BDcorregidas/Bolivia/Guido/BOL-014b.xlsx")|> mutate(Point.x=as.character(paste("M4",Point.x, sep = "-"))) |> mutate(Point.y=as.character(paste("M1",Point.y, sep = "-")))


FLII2016 <- rast("C:/CodigoR/WCS_2024/FLI/raster/FLII_final/FLII_2016.tif")



# get sites
Bol_Madidi_sites1 <-  Bol_Madidi_1 |> 
   dplyr::bind_rows(Bol_Madidi_2) |> 
   dplyr::bind_rows(Bol_Madidi_3) |> 
   dplyr::bind_rows(Bol_Madidi_4) |> 
  select("Latitude", "Longitude", "Point.x" 
) |> dplyr::distinct( )  

Bol_Madidi_sites <- sf::st_as_sf(Bol_Madidi_sites1, coords = c("Longitude","Latitude"))
st_crs(Bol_Madidi_sites) <- 4326


# get elevation map
elevation_17 <- rast(get_elev_raster(Bol_Madidi_sites, z = 9)) #z =1-14
# bb <-  st_as_sfc(st_bbox(elevation_17)) # make bounding box 




# extract covs using points and add to _sites
covs_Bol_Madidi_sites <- cbind(Bol_Madidi_sites, terra::extract(elevation_17, Bol_Madidi_sites))
# covs_Ecu_17_sites <- cbind(Ecu_17_sites, terra::extract(elevation_17, Ecu_17_sites))


# get which are in and out
covs_Bol_Madidi_sites$in_AP = st_intersects(covs_Bol_Madidi_sites, Madidi_NP, sparse = FALSE)
# covs_Ecu_17_sites$in_AP = st_intersects(covs_Ecu_17_sites, AP_Machalilla, sparse = FALSE)


# make a map
mapview (elevation_17, alpha=0.7) + 
  mapview (Madidi_NP, color = "green", col.regions = "green", alpha = 0.5) +
  mapview (Area_Madidi, color = "yellow", col.regions = "yellow", alpha = 0.5) +
  #mapview (AP_Tahuayo, color = "green", col.regions = "green", alpha = 0.5) +
  mapview (covs_Bol_Madidi_sites, zcol = "in_AP", col.regions =c("red","blue"), burst = TRUE) 

Tamshiyacu Tahuayo data

Here we use the tables: - PER-003_BD_ACRCTT_T0.xlsx - PER-002_BD_ACRTT-PILOTO.xlsx

Code
source("C:/CodigoR/WCS-CameraTrap/R/organiza_datos_v3.R")

AP_Pacaya <- read_sf("C:/CodigoR/Occu_APs/shp/PacayaSamiria/WDPA_WDOECM_Jun2025_Public_249_shp-polygons.shp")

AP_Tahuayo <- read_sf("C:/CodigoR/Occu_APs/shp/Tahuayo/WDPA_WDOECM_Jun2025_Public_555555621_shp-polygons.shp")

# load data and make array_locID column
Per_Tahuayo_piloto <- loadproject("F:/WCS-CameraTrap/data/BDcorregidas/Peru/PER-002_BD_ACRTT-PILOTO.xlsx")



Per_Tahuayo <- loadproject("F:/WCS-CameraTrap/data/BDcorregidas/Peru/PER-003_BD_ACRCTT_T0.xlsx")

 
FLII2016 <- rast("C:/CodigoR/WCS_2024/FLI/raster/FLII_final/FLII_2016.tif")

# get sites
# Per_Pacaya_sites <- get.sites("F:/WCS-CameraTrap/data/BDcorregidas/Peru/PER-003_BD_ACRCTT_T0.xlsx")

# get sites
Per_Tahuayo_sites1 <- Per_Tahuayo |> select("Latitude",
                                    "Longitude",
                                    "Camera_Id" 
                                    ) |> dplyr::distinct( )  

Per_Tahuayo_sites <- sf::st_as_sf(Per_Tahuayo_sites1, coords = c("Longitude","Latitude"))
st_crs(Per_Tahuayo_sites) <- 4326



# get Pacaya sites
Per_Tahuayo_piloto_sites1 <- Per_Tahuayo_piloto |> select("Latitude",
                                    "Longitude",
                                    "Camera_Id" 
                                    ) |> dplyr::distinct( )  

Per_Tahuayo_piloto_sites <- sf::st_as_sf(Per_Tahuayo_piloto_sites1, coords = c("Longitude","Latitude"))
st_crs(Per_Tahuayo_piloto_sites) <- 4326




# get elevation map
elevation_PE <- rast(get_elev_raster(Per_Tahuayo_sites, z = 10)) #z =1-14
# bb <-  st_as_sfc(st_bbox(elevation_17)) # make bounding box 





# extract covs using points and add to _sites
covs_Per_Tahuayo_sites <- cbind(Per_Tahuayo_sites,
                                terra::extract(elevation_PE,
                                               Per_Tahuayo_sites)
                                )

# extract covs using points and add to _sites
covs_Per_Tahuayo_piloto_sites <- cbind(Per_Tahuayo_piloto_sites, terra::extract(elevation_PE, Per_Tahuayo_piloto_sites))



# get which are in and out
covs_Per_Tahuayo_sites$in_AP = st_intersects(covs_Per_Tahuayo_sites, AP_Tahuayo, sparse = FALSE)

covs_Per_Tahuayo_piloto_sites$in_AP = st_intersects(covs_Per_Tahuayo_piloto_sites, AP_Tahuayo, sparse = FALSE)




# make a map
mapview (elevation_PE, alpha=0.5) + 
  mapview (AP_Pacaya, color = "green", col.regions = "green", alpha = 0.5) +
  mapview (AP_Tahuayo, color = "green", col.regions = "green", alpha = 0.5) +
  mapview (covs_Per_Tahuayo_sites, zcol = "in_AP", col.regions =c("red","blue"), burst = TRUE) +   
  mapview (covs_Per_Tahuayo_piloto_sites, 
           zcol = "in_AP", 
           col.regions =c("blue"), 
           burst = TRUE) 

Yasuni data

Here we use the tables Ecu-13, Ecu-17, Ecu-18 y Ecu-20

Code
source("C:/CodigoR/WCS-CameraTrap/R/organiza_datos_v3.R")

AP_Yasuni <- read_sf("C:/CodigoR/Occu_APs/shp/Yasuni/WDPA_WDOECM_May2025_Public_186_shp-polygons.shp")

### Ecu 17, Ecu 18, ECU 20, Ecu 22  

# load data and make array_locID column
Ecu_13 <- loadproject("F:/WCS-CameraTrap/data/BDcorregidas/Ecuador/ECU-013.xlsx") |> mutate(array_locID=paste("Ecu_13", locationID, sep="_"))
Ecu_17 <- loadproject("F:/WCS-CameraTrap/data/BDcorregidas/Ecuador/ECU-017.xlsx") |> mutate(array_locID=paste("Ecu_17", locationID, sep="_"))
Ecu_18 <- loadproject("F:/WCS-CameraTrap/data/BDcorregidas/Ecuador/ECU-018.xlsx")|> mutate(array_locID=paste("Ecu_18", locationID, sep="_"))
Ecu_20 <- loadproject("F:/WCS-CameraTrap/data/BDcorregidas/Ecuador/ECU-020_Fix.xlsx")|> mutate(array_locID=paste("Ecu_20", locationID, sep="_"))
# Ecu_21 <- loadproject("F:/WCS-CameraTrap/data/BDcorregidas/Ecuador/ECU-021.xlsx") |> mutate(array_locID=paste("Ecu_14", locationID, sep="_"))
Ecu_22 <- loadproject("F:/WCS-CameraTrap/data/BDcorregidas/Ecuador/ECU-022.xlsx")|> mutate(array_locID=paste("Ecu_22", locationID, sep="_"))



# get sites
Ecu_13_sites <- get.sites("F:/WCS-CameraTrap/data/BDcorregidas/Ecuador/ECU-013.xlsx")
Ecu_17_sites <- get.sites("F:/WCS-CameraTrap/data/BDcorregidas/Ecuador/ECU-017.xlsx")
Ecu_18_sites <- get.sites("F:/WCS-CameraTrap/data/BDcorregidas/Ecuador/ECU-018.xlsx")
Ecu_20_sites <- get.sites("F:/WCS-CameraTrap/data/BDcorregidas/Ecuador/ECU-020_Fix.xlsx")
# Ecu_21_sites <- get.sites("F:/WCS-CameraTrap/data/BDcorregidas/Ecuador/ECU-021.xlsx")
Ecu_22_sites <- get.sites("F:/WCS-CameraTrap/data/BDcorregidas/Ecuador/ECU-022.xlsx")




# get elevation map
elevation_EC <- rast(get_elev_raster(Ecu_17_sites, z = 7)) #z =1-14
bb <-  st_as_sfc(st_bbox(elevation_EC)) # make bounding box 




# extract covs using points and add to _sites
covs_Ecu_13_sites <- cbind(Ecu_13_sites, terra::extract(elevation_EC, Ecu_13_sites))
covs_Ecu_17_sites <- cbind(Ecu_17_sites, terra::extract(elevation_EC, Ecu_17_sites))
covs_Ecu_18_sites <- cbind(Ecu_18_sites, terra::extract(elevation_EC, Ecu_18_sites))
covs_Ecu_20_sites <- cbind(Ecu_20_sites, terra::extract(elevation_EC, Ecu_20_sites))
#covs_Ecu_21_sites <- cbind(Ecu_21_sites, terra::extract(elevation_17, Ecu_21_sites))
covs_Ecu_22_sites <- cbind(Ecu_22_sites, terra::extract(elevation_EC, Ecu_22_sites))

# get which are in and out
covs_Ecu_13_sites$in_AP = st_intersects(covs_Ecu_13_sites, AP_Yasuni, sparse = FALSE)
covs_Ecu_17_sites$in_AP = st_intersects(covs_Ecu_17_sites, AP_Yasuni, sparse = FALSE)
covs_Ecu_18_sites$in_AP = st_intersects(covs_Ecu_18_sites, AP_Yasuni, sparse = FALSE)
covs_Ecu_20_sites$in_AP = st_intersects(covs_Ecu_20_sites, AP_Yasuni, sparse = FALSE)
#covs_Ecu_21_sites$in_AP = st_intersects(covs_Ecu_21_sites, AP_Yasuni, sparse = FALSE)
covs_Ecu_22_sites$in_AP = st_intersects(covs_Ecu_22_sites, AP_Yasuni, sparse = FALSE)

# covs_Ecu_16_sites$in_AP = st_intersects(covs_Ecu_16_sites, AP_Llanganates, sparse = FALSE)



# make a map
mapview (elevation_EC, alpha=0.5) + 
  mapview (AP_Yasuni, color = "green", col.regions = "green", alpha = 0.5) +
  mapview (covs_Ecu_13_sites, zcol = "in_AP", col.regions =c("red"), burst = TRUE) +
  mapview (covs_Ecu_17_sites, zcol = "in_AP", col.regions =c("red","blue"), burst = TRUE) +
  mapview (covs_Ecu_18_sites, zcol = "in_AP", col.regions =c("red"), burst = TRUE) +
  mapview (covs_Ecu_20_sites, zcol = "in_AP", col.regions =c("red","blue"), burst = TRUE) +
#  mapview (covs_Ecu_21_sites, zcol = "in_AP", col.regions =c("red"), burst = TRUE) +
  mapview (covs_Ecu_22_sites, zcol = "in_AP", burst = TRUE, col.regions = c("red") ) #+
  # mapview (covs_Ecu_16_sites, zcol = "in_AP", burst = TRUE, col.regions =c("red","blue")) 

Llanganates data

Here we use the tables Ecu-14, Ecu-15 y Ecu-16.

Code
source("C:/CodigoR/WCS-CameraTrap/R/organiza_datos_v3.R")

FLII2016 <- rast("C:/CodigoR/WCS_2024/FLI/raster/FLII_final/FLII_2016.tif")


AP_Llanganates <- read_sf("C:/CodigoR/Occu_APs/shp/Llanganates/WDPA_WDOECM_May2025_Public_97512_shp-polygons.shp")

### Ecu 14, Ecu 15  y Ecu 16

# load data and make array_locID column
Ecu_14 <- loadproject("F:/WCS-CameraTrap/data/BDcorregidas/Ecuador/ECU-014.xlsx") |> mutate(array_locID=paste("Ecu_14", locationID, sep="_"))
Ecu_15 <- loadproject("F:/WCS-CameraTrap/data/BDcorregidas/Ecuador/ECU-015.xlsx")|> mutate(array_locID=paste("Ecu_15", locationID, sep="_"))
Ecu_16 <- loadproject("F:/WCS-CameraTrap/data/BDcorregidas/Ecuador/ECU-016.xlsx")|> mutate(array_locID=paste("Ecu_16", locationID, sep="_"))



# get sites
Ecu_14_sites <- get.sites("F:/WCS-CameraTrap/data/BDcorregidas/Ecuador/ECU-014.xlsx")
Ecu_15_sites <- get.sites("F:/WCS-CameraTrap/data/BDcorregidas/Ecuador/ECU-015.xlsx")
Ecu_16_sites <- get.sites("F:/WCS-CameraTrap/data/BDcorregidas/Ecuador/ECU-016.xlsx")




# get elevation map
elevation_14 <- rast(get_elev_raster(Ecu_14_sites, z = 9)) #z =1-14
bb <-  st_as_sfc(st_bbox(elevation_14)) # make bounding box 




# extract covs using points and add to _sites
covs_Ecu_14_sites <- cbind(Ecu_14_sites, terra::extract(elevation_14, Ecu_14_sites))

covs_Ecu_15_sites <- cbind(Ecu_15_sites, terra::extract(elevation_14, Ecu_15_sites))

covs_Ecu_16_sites <- cbind(Ecu_16_sites, terra::extract(elevation_14, Ecu_16_sites))

# get which are in and out
covs_Ecu_14_sites$in_AP = st_intersects(covs_Ecu_14_sites, AP_Llanganates, sparse = FALSE)

covs_Ecu_15_sites$in_AP = st_intersects(covs_Ecu_15_sites, AP_Llanganates, sparse = FALSE)

covs_Ecu_16_sites$in_AP = st_intersects(covs_Ecu_16_sites, AP_Llanganates, sparse = FALSE)



# make a map
mapview (elevation_14, alpha=0.7) + 
  mapview (AP_Llanganates, color = "green", col.regions = "green", alpha = 0.5) +
  mapview (covs_Ecu_14_sites, zcol = "in_AP", col.regions =c("red","blue"), burst = TRUE) +
  mapview (covs_Ecu_15_sites, zcol = "in_AP", burst = TRUE, col.regions = c("blue") )+
  mapview (covs_Ecu_16_sites, zcol = "in_AP", burst = TRUE, col.regions =c("red","blue")) 

Machalilla 2014 data

Here we use the tables Machalilla_DL_CT-PNM-2014

Camera trap operation data and detection history

Code
# # Join 3 tables
# # fix count in ECU 13, 17, 22,
# Ecu_13$Count <- as.character(Ecu_13$Count)
# Ecu_17$Count <- as.character(Ecu_17$Count)
# Ecu_22$Count <- as.character(Ecu_22$Count)
# 
# Ecu_full <- Ecu_13 |> full_join(Ecu_17) |> 
#                       full_join(Ecu_18) |> 
#                       full_join(Ecu_20) |> 
# #                      full_join(Ecu_21) |> 
#                       full_join(Ecu_22)
# 
# ###### Bolivia
# 
# Bol_full <- Bol_Madidi_1  |> 
#    full_join(Bol_Madidi_2) |> 
#    full_join(Bol_Madidi_3) |> 
#    full_join(Bol_Madidi_4) 
# # change camera Id by point. two cameras in one
# Bol_full <- Bol_full |> mutate(Camera_Id=Point.x)


# # Ecu_18$Count <- as.numeric(Ecu_18$Count)
# Per_Tahuayo_piloto$Longitude <- as.numeric(Per_Tahuayo_piloto$Longitude)
# Per_Tahuayo_piloto$Latitude <- as.numeric(Per_Tahuayo_piloto$Latitude)
# 
# 
# Per_full <- Per_Tahuayo|> 
#   full_join(Per_Tahuayo_piloto) #|> 
#                       # full_join(Ecu_18) |> 
#                       # full_join(Ecu_20) |> 
#                       # full_join(Ecu_21) |> 
#                       # full_join(Ecu_22)
# 
# # rename camera id
# # Per_full$camid <- Per_full$`Camera_Id`
# 
# Ecu_full$Count <- as.numeric(Ecu_full$Count)
# Per_full$Count <- as.numeric(Per_full$Count)


#################### Ecuador Llanganates

# Join 3 tables
# Ecu_Llanganates <- Ecu_14 |> full_join(Ecu_15) |> full_join(Ecu_16)


# make columns equal to 46
# Ecu_full <- Ecu_full[,-47]
# Col_18 <- Col_18[,-47]
# Ecu_Llanganates <- Ecu_Llanganates[,-c(50,49,48,47)]

##################################
data_full <- Ecu_Machalilla# Ecu_Llanganates # Bol_full# rbind(Ecu_full, 
                   # Per_full,
                   # Bol_full,
                   # Col_18,
                   # Ecu_Llanganates)


# fix date format
# 

data_full <- data_full |>
  mutate(start_date=`Camera Start Date and Time`) |> 
  mutate(end_date=`Camera End Date and Time`) |> 
  mutate(Date_Time_Captured=`Photo Date`)  |> 
  mutate(Camera_Id=camera_trap) 

# Formatting a Date object
data_full$start_date <- as.Date(data_full$start_date, "%Y-%m-%d")
data_full$start_date <- format(data_full$start_date, "%Y-%m-%d")

data_full$end_date <- as.Date(data_full$"end_date", "%Y-%m-%d")
data_full$end_date <- format(data_full$end_date, "%Y-%m-%d")

data_full$eventDate <- as.Date(data_full$`Photo Date`, "%Y-%m-%d")
data_full$eventDate <- format(data_full$`Photo Date`, "%Y-%m-%d")

# Per_full$eventDateTime <- ymd_hms(paste(Per_full$"photo_date", Per_full$"photo_time", sep=" "))

data_full$eventDateTime <- ymd_hms(paste(
  data_full$`Photo Date`,
  data_full$`Photo Time`))

###############################
# remove duplicated cameras
################################
# ind1 <- which(data_full$Camera_Id=="ECU-020-C0027")
# ind2 <- which(data_full$Camera_Id=="ECU-020-C0006")
# data_full <- data_full[-ind1,]
# data_full <- data_full[-ind2,]


# filter 2021 and make uniques
CToperation  <- data_full |> dplyr::group_by(Camera_Id) |> #(array_locID) |> 
                           mutate(minStart=start_date, maxEnd=end_date) |> distinct(Longitude, Latitude, minStart, maxEnd) |> dplyr::ungroup()
# remove one duplicated
# View(CToperation)
# CToperation <- CToperation[-15,]

# Duplicated Madidi
# 98 107, 97 104, 90 102, 81 87, 74 82
# M3-19: M3-21: M4-10: M4-12: M4-18:  From Madidi
# CToperation <- CToperation[-c(107, 104, 102, 87, 82),]

CToperation[7,3] <- -1.58301 #Latitude
CToperation[7,2] <- -80.710301 #Latitude
CToperation[7,1] <- "CT-PNM-1-21"

# duplicated in Pacoche
CToperation <- CToperation[-c(27,32),] 

### Check duplicated
# View(as.data.frame(sort(table(CToperation$Latitude))))
# View(as.data.frame(sort(table(CToperation$Longitude))))
# View(as.data.frame(table(CToperation$Camera_Id)))

# CToperation <- CToperation[-c(90,94),]
# Latitude -4.48283
# Latitude -0.554820969700813
# Longitude -76.4833290316164

# Generamos la matríz de operación de las cámaras

camop <- cameraOperation(CTtable= CToperation, # Tabla de operación
                         stationCol= "Camera_Id", # Columna que define la estación
                         setupCol= "minStart", #Columna fecha de colocación
                         retrievalCol= "maxEnd", #Columna fecha de retiro
                         #hasProblems= T, # Hubo fallos de cámaras
                         dateFormat= "%Y-%m-%d")#, #, # Formato de las fechas
                         #cameraCol="Camera_Id")
                         # sessionCol= "Year")

# Generar las historias de detección ---------------------------------------
## remove plroblem species

# Per_full$scientificName <- paste(Per_full$genus, Per_full$species, sep=" ")

#### remove NAs and setups
# ind <- which(is.na(data_full$scientificName))
# data_full <- data_full[-ind,]
# ind <- which(Per_full$scientificName=="NA NA")
# Per_full <- Per_full[-ind,]

# ind <- which(Per_full$scientificName=="Set up")
# Per_full <- Per_full[-ind,]
# 
# ind <- which(Per_full$scientificName=="Blank")
# Per_full <- Per_full[-ind,]
# 
# ind <- which(Per_full$scientificName=="Unidentifiable")
# Per_full <- Per_full[-ind,]
data_full$scientificName <- paste(data_full$Genus,
                                  data_full$Species)


cams <- unique(CToperation$Camera_Id)
data_full <- data_full |> filter(Camera_Id==cams)


DetHist_list <- lapply(unique(data_full$scientificName), FUN = function(x) {
  detectionHistory(
    recordTable         = data_full, # tabla de registros
    camOp                = camop, # Matriz de operación de cámaras
    stationCol           = "camera_trap",
    speciesCol           = "scientificName",
    recordDateTimeCol    = "eventDateTime",
    recordDateTimeFormat  = "%Y-%m-%d %H:%M:%S",
    species              = x,     # la función reemplaza x por cada una de las especies
    occasionLength       = 15, # Colapso de las historias a 10 ías
    day1                 = "station", # "survey" a specific date, "station", #inicie en la fecha de cada survey
    datesAsOccasionNames = FALSE,
    includeEffort        = TRUE,
    scaleEffort          = FALSE,
    #unmarkedMultFrameInput=TRUE
    timeZone             = "America/Bogota" 
    )
  }
)

# names
names(DetHist_list) <- unique(data_full$scientificName)

# Finalmente creamos una lista nueva donde estén solo las historias de detección
ylist <- lapply(DetHist_list, FUN = function(x) x$detection_history)
# otra lista con effort scaled
efort <- lapply(DetHist_list, FUN = function(x) x$effort)

# number of observetions per sp, collapsed to 7 days
# lapply(ylist, sum, na.rm = TRUE)

Arrange spatial covariates

The standard EPSG code for a Lambert Azimuthal Equal-Area projection for South America is EPSG:10603 (WGS 84 / GLANCE South America). This projection is specifically designed for the continent and has its center located around the central meridian for the region. The units are meters.

FLII scores range from 0 (lowest integrity) to 10 (highest). Grantham discretized this range to define three broad illustrative categories: low (≤6.0); medium (>6.0 and <9.6); and high integrity (≥9.6).

Code
# #transform coord data to Lambert Azimuthal Equal-Area
# AP_Tahuayo_UTM <- st_transform(AP_Tahuayo, "EPSG:10603")
# # Convert to LINESTRING
# AP_Tahuayo_UTM_line <- st_cast(AP_Tahuayo_UTM,"MULTILINESTRING")# "LINESTRING")
# #transform Yasuni to Lambert Azimuthal Equal-Area
# AP_Yasuni_UTM <- st_transform(AP_Yasuni, "EPSG:10603")
# # Convert to LINESTRING
# AP_Yasuni_UTM_line <- st_cast(AP_Yasuni_UTM, "MULTILINESTRING")

#transform Yasuni to Lambert Azimuthal Equal-Area
AP_Machalilla_UTM <- st_transform(AP_Machalilla, "EPSG:10603")
# Convert to LINESTRING
AP_Machalilla_UTM_line <- st_cast(AP_Machalilla_UTM, "MULTILINESTRING")

# # Plantas
# AP_PlantasMed_UTM <- st_transform(AP_PlantasMed, "EPSG:10603")
# 
# #Llanganates
# AP_Llanganates_UTM <- st_transform(AP_Llanganates, "EPSG:10603")


############## sf AP Union 
AP_merged_sf_UTM <- AP_Machalilla_UTM# AP_Madidi_UTM# st_union(
                             # AP_Yasuni_UTM,
                             # AP_Tahuayo_UTM,
                             # AP_Madidi_UTM,
                             # AP_PlantasMed_UTM,
                             # AP_Llanganates_UTM
                             # )

AP_merged_line <- st_cast(AP_merged_sf_UTM, to="MULTILINESTRING")


# make sf() from data table
data_full_sf <- CToperation |> 
    st_as_sf(coords = c("Longitude", "Latitude"), 
              crs = 4326)

# get the elevation point from AWS
elev_data <- elevatr::get_elev_point(locations = data_full_sf, 
                                     src = "aws",
                                     z=12)
Mosaicing & Projecting
Note: Elevation units are in meters
Code
# extract elev and paste to table
data_full_sf$elev <- elev_data$elevation
str(data_full_sf$elev)
 num [1:58] 233 530 335 650 345 660 483 483 619 548 ...
Code
# extract in AP
data_full_sf$in_AP = as.factor(st_intersects(data_full_sf, AP_Machalilla, sparse = FALSE))

in_AP <- as.numeric((st_drop_geometry(data_full_sf$in_AP)))

# extract FLII
data_full_sf$FLII <- terra::extract(FLII2016, data_full_sf)[,2]
str(data_full_sf$FLII)
 num [1:58] 9.8 9.94 9.91 9.93 9.92 ...
Code
# Replace all NAs with min flii in a numeric column
data_full_sf$FLII[is.na(data_full_sf$FLII)] <- min(data_full_sf$FLII, na.rm = TRUE)-1

# mapview(full_sites_14_15_16_sf, zcol = "in_AP", burst = TRUE)

# Transform coord to Lambert Azimuthal Equal-Area
data_full_sf_UTM <- st_transform(data_full_sf, "EPSG:10603")


coords <- st_coordinates(data_full_sf_UTM)
#str(coords)

#### fix duplicated coord
# -1840583.53296873  en x
# -1842515.36969736  en x
# 1547741.44311964  en y
# 1541202.24796904 en y

# which(coords[,1]=="-1840583.53296873")
# which(coords[,1]=="-1842515.36969736")
# which(coords[,2]=="1547741.44311964")
# which(coords[,2]=="1541202.24796904")

# make Ecu_14_15_16 an sf object
#    cam_sf <- st_as_sf(Ecu_14_15_16, coords = c("lon","lat"))   #crs="EPSG:4326")
    #--- set CRS ---#
#    st_crs(cam_sf) <- 4326




# Calculate the distance
#multiplic <- full_sites_14_15_16_sf_UTM |> mutate(multiplic= as.numeric(in_AP)) 
multiplic=ifelse(data_full_sf_UTM$in_AP=="TRUE",-1,1)
data_full_sf_UTM$border_dist <- as.numeric(st_distance(data_full_sf_UTM, AP_Machalilla_UTM_line) * multiplic )
# print(border_dist)

# convert true false to inside 1, outside 0
data_full_sf_UTM <- data_full_sf_UTM |>
  mutate(in_AP = case_when(
    str_detect(in_AP, "TRUE") ~ 1, # "inside_AP",
    str_detect(in_AP, "FALSE") ~ 0 #"outside_AP"
  )) |> mutate(in_AP=as.factor(in_AP))


hist(data_full_sf_UTM$border_dist)

Code
hist(data_full_sf_UTM$elev)

Prepare the model

TipData in a 3D array

The data must be placed in a three-dimensional array with dimensions corresponding to species, sites, and replicates in that order.

The function sfMsPGOcc

Fits multi-species spatial occupancy models with species correlations (i.e., a spatially-explicit joint species distribution model with imperfect detection). We use Polya-Gamma latent variables and a spatial factor modeling approach. Currently, models are implemented using a Nearest Neighbor Gaussian Process.

Code
# Detection-nondetection data ---------
# Species of interest, can select individually
# curr.sp <- sort(unique(Ecu_14_15_16$.id))# c('BAWW', 'BLJA', 'GCFL')
# sort(names(DetHist_list))
selected.sp <-  c(
# "Atelocynus microtis" ,
#"Coendou prehensilis" ,
"Cuniculus paca",           
#"Cuniculus taczanowskii",
"Dasyprocta punctata",      
"Dasypus novemcinctus" ,    
#"Didelphis pernigra",    
"Eira barbara",  
#"Herpailurus yagouaroundi",
#"Leopardus pardalis",    
#"Leopardus tigrinus" ,
"Leopardus wiedii",         
"Mazama americana",
#"Mazama murelia",
#"Mazama rufina" ,
#"Mazama zamora" ,
#"Mazama gouazoubira",
#"Mitu tuberosum" ,
#"Myoprocta pratti",
#"Nasuella olivacea" ,
#"Myrmecophaga tridactyla",
#"Nasua nasua" ,
# "Mazama americana",         
# "Myotis myotis",           
# "Nasua narica",             
"Odocoileus virginianus",   
#"Odocoileus ustus",
#"Panthera onca" ,
"Procyon cancrivorus" ,
#"Puma yagouaroundi"   ,
"Pecari tajacu",    
#"Sciurus stramineus",
#"Penelope jacquacu" ,
#"Priodontes maximus" ,
#"Procyon cancrivorus",      
# "Psophia leucoptera",
#"Pudu mephistophiles" ,
#"Puma concolor" ,
#"Puma yagouaroundi",        
# "Rattus rattus" ,
# "Roedor sp.",
# "Sciurus sp.",       
# "Sus scrofa",               
"Sylvilagus brasiliensis" ,
"Tamandua mexicana"  
# "Tamandua tetradactyla",   
# "Tapirus pinchaque" ,
# "Tapirus terrestris",
# "Tayassu pecari",
# "Tremarctos ornatus" 
#"Tinamus major"            
              )

# y.msom <- y[which(sp.codes %in% selected.sp), , ]
# str(y.msom)

# Use selection
y.selected <- ylist[selected.sp]   

#####################################
#### three-dimensional array with dimensions corresponding to:
#### species, sites, and replicates
#####################################

# 1. Load the abind library to make arrays easily 
library(abind)
my_array_abind <- abind(y.selected, # start from list
                        along = 3, # 3D array
                        use.first.dimnames=TRUE) # keep names

# Transpose the array to have:
# species, sites, and sampling occasions in that order
# The new order is (3rd dim, 1st dim, 2nd dim)
transposed_array <- aperm(my_array_abind, c(3, 1, 2))

#### site covs
sitecovs <- as.data.frame(st_drop_geometry(
                    data_full_sf_UTM[,5:8]))

 sitecovs[, 1] <- as.vector((sitecovs[,1]))   # scale numeric covariates
 sitecovs[, 1] <- as.numeric((sitecovs[,2]))   # scale numeric covariates
 sitecovs[, 3] <- as.vector((sitecovs[,3]))   # scale numeric covariates
 sitecovs[, 4] <- as.vector((sitecovs[,4]))   # scale numeric covariates
 # sitecovs$fact <- factor(c("A", "A", "B"))    # categorical covariate

names(sitecovs) <- c("elev", "in_AP", "FLII", "border_dist")

# check consistancy equal number of spatial covariates and rows in data
# identical(nrow(ylist[[1]]), nrow(covars)) 

# Base de datos para los análisis -----------------------------------------

# match the names to "y"  "occ.covs" "det.covs" "coords" 
data_list <- list(y = transposed_array, # Historias de detección
                  occ.covs = sitecovs, # covs de sitio
                  det.covs  = list(effort = DetHist_list[[1]]$effort),
                  coords = st_coordinates(data_full_sf_UTM)
                  )  # agregamos el esfuerzo de muestreo como covariable de observación

Running the model

We let spOccupancy set the initial values by default based on the prior distributions.

Code
# Running the model

# 3. 1 Modelo multi-especie  -----------------------------------------

# 2. Model fitting --------------------------------------------------------
# Fit a non-spatial, multi-species occupancy model. 
out.null <- msPGOcc(occ.formula = ~ scale(elev) +
                               scale(border_dist) + 
                               scale(FLII) , 
               det.formula = ~ scale(effort) , # Ordinal.day + I(Ordinal.day^2) + Year
                 data = data_list, 
                 n.samples = 6000, 
                 n.thin = 10, 
                 n.burn = 1000, 
                 n.chains = 3,
                 n.report = 1000);beep(sound = 4)
----------------------------------------
    Preparing to run the model
----------------------------------------
No prior specified for beta.comm.normal.
Setting prior mean to 0 and prior variance to 2.72
No prior specified for alpha.comm.normal.
Setting prior mean to 0 and prior variance to 2.72
No prior specified for tau.sq.beta.ig.
Setting prior shape to 0.1 and prior scale to 0.1
No prior specified for tau.sq.alpha.ig.
Setting prior shape to 0.1 and prior scale to 0.1
z is not specified in initial values.
Setting initial values based on observed data
beta.comm is not specified in initial values.
Setting initial values to random values from the prior distribution
alpha.comm is not specified in initial values.
Setting initial values to random values from the prior distribution
tau.sq.beta is not specified in initial values.
Setting initial values to random values between 0.5 and 10
tau.sq.alpha is not specified in initial values.
Setting to initial values to random values between 0.5 and 10
beta is not specified in initial values.
Setting initial values to random values from the community-level normal distribution
alpha is not specified in initial values.
Setting initial values to random values from the community-level normal distribution
----------------------------------------
    Model description
----------------------------------------
Multi-species Occupancy Model with Polya-Gamma latent
variable fit with 58 sites and 11 species.

Samples per Chain: 6000 
Burn-in: 1000 
Thinning Rate: 10 
Number of Chains: 3 
Total Posterior Samples: 1500 

Source compiled with OpenMP support and model fit using 1 thread(s).

----------------------------------------
    Chain 1
----------------------------------------
Sampling ... 
Sampled: 1000 of 6000, 16.67%
-------------------------------------------------
Sampled: 2000 of 6000, 33.33%
-------------------------------------------------
Sampled: 3000 of 6000, 50.00%
-------------------------------------------------
Sampled: 4000 of 6000, 66.67%
-------------------------------------------------
Sampled: 5000 of 6000, 83.33%
-------------------------------------------------
Sampled: 6000 of 6000, 100.00%
----------------------------------------
    Chain 2
----------------------------------------
Sampling ... 
Sampled: 1000 of 6000, 16.67%
-------------------------------------------------
Sampled: 2000 of 6000, 33.33%
-------------------------------------------------
Sampled: 3000 of 6000, 50.00%
-------------------------------------------------
Sampled: 4000 of 6000, 66.67%
-------------------------------------------------
Sampled: 5000 of 6000, 83.33%
-------------------------------------------------
Sampled: 6000 of 6000, 100.00%
----------------------------------------
    Chain 3
----------------------------------------
Sampling ... 
Sampled: 1000 of 6000, 16.67%
-------------------------------------------------
Sampled: 2000 of 6000, 33.33%
-------------------------------------------------
Sampled: 3000 of 6000, 50.00%
-------------------------------------------------
Sampled: 4000 of 6000, 66.67%
-------------------------------------------------
Sampled: 5000 of 6000, 83.33%
-------------------------------------------------
Sampled: 6000 of 6000, 100.00%
Code
summary(out.null, level = 'community')

Call:
msPGOcc(occ.formula = ~scale(elev) + scale(border_dist) + scale(FLII), 
    det.formula = ~scale(effort), data = data_list, n.samples = 6000, 
    n.report = 1000, n.burn = 1000, n.thin = 10, n.chains = 3)

Samples per Chain: 6000
Burn-in: 1000
Thinning Rate: 10
Number of Chains: 3
Total Posterior Samples: 1500
Run Time (min): 0.3158

----------------------------------------
    Community Level
----------------------------------------
Occurrence Means (logit scale): 
                      Mean     SD    2.5%     50%  97.5%   Rhat ESS
(Intercept)        -1.0138 1.7201 -3.5637 -1.3057 2.5218 2.4277  14
scale(elev)         0.6932 1.0958 -1.6690  0.7462 2.8456 1.0769 137
scale(border_dist) -0.5520 1.0644 -3.0103 -0.4512 1.5903 1.2970 117
scale(FLII)         0.8404 1.0170 -1.0706  0.7302 3.2608 1.2077 116

Occurrence Variances (logit scale): 
                      Mean       SD   2.5%    50%    97.5%   Rhat ESS
(Intercept)         7.3768  25.8404 0.0474 0.4784  89.2967 3.8140  12
scale(elev)        32.7039 104.1788 0.0653 1.3372 332.5328 4.9385   9
scale(border_dist) 38.8793 108.8917 0.0692 1.9317 343.2812 5.6718  19
scale(FLII)        23.5537  72.3137 0.0574 1.1596 179.9557 3.1027  25

Detection Means (logit scale): 
                 Mean     SD    2.5%     50%   97.5%   Rhat ESS
(Intercept)   -3.3449 0.7808 -4.5413 -3.5043 -1.6584 2.8511  31
scale(effort)  0.9024 0.4944  0.0654  0.8489  1.9954 1.0253 400

Detection Variances (logit scale): 
                Mean     SD   2.5%    50%  97.5%   Rhat ESS
(Intercept)   0.3392 0.4115 0.0364 0.2080 1.4344 1.0409 747
scale(effort) 0.4098 0.6645 0.0351 0.2168 1.9681 1.1319 787
Code
# Fit a non-spatial, Latent Factor Multi-Species Occupancy Model. 
  out.lfMs <- msPGOcc(occ.formula = ~ scale(elev) +
                               scale(border_dist) + 
                               scale(FLII) , 
               det.formula = ~ scale(effort), # Ordinal.day + I(Ordinal.day^2) + Year
                 data = data_list, 
                 n.omp.threads = 6,
                 n.samples = 6000, 
                 n.factors = 5, # balance of rare sp. and run time
                 n.thin = 10, 
                 n.burn = 1000, 
                 n.chains = 3,
                 n.report = 1000);beep(sound = 4)
----------------------------------------
    Preparing to run the model
----------------------------------------
Warning in msPGOcc(occ.formula = ~scale(elev) + scale(border_dist) +
scale(FLII), : 'n.factors' is not an argument
No prior specified for beta.comm.normal.
Setting prior mean to 0 and prior variance to 2.72
No prior specified for alpha.comm.normal.
Setting prior mean to 0 and prior variance to 2.72
No prior specified for tau.sq.beta.ig.
Setting prior shape to 0.1 and prior scale to 0.1
No prior specified for tau.sq.alpha.ig.
Setting prior shape to 0.1 and prior scale to 0.1
z is not specified in initial values.
Setting initial values based on observed data
beta.comm is not specified in initial values.
Setting initial values to random values from the prior distribution
alpha.comm is not specified in initial values.
Setting initial values to random values from the prior distribution
tau.sq.beta is not specified in initial values.
Setting initial values to random values between 0.5 and 10
tau.sq.alpha is not specified in initial values.
Setting to initial values to random values between 0.5 and 10
beta is not specified in initial values.
Setting initial values to random values from the community-level normal distribution
alpha is not specified in initial values.
Setting initial values to random values from the community-level normal distribution
----------------------------------------
    Model description
----------------------------------------
Multi-species Occupancy Model with Polya-Gamma latent
variable fit with 58 sites and 11 species.

Samples per Chain: 6000 
Burn-in: 1000 
Thinning Rate: 10 
Number of Chains: 3 
Total Posterior Samples: 1500 

Source compiled with OpenMP support and model fit using 6 thread(s).

----------------------------------------
    Chain 1
----------------------------------------
Sampling ... 
Sampled: 1000 of 6000, 16.67%
-------------------------------------------------
Sampled: 2000 of 6000, 33.33%
-------------------------------------------------
Sampled: 3000 of 6000, 50.00%
-------------------------------------------------
Sampled: 4000 of 6000, 66.67%
-------------------------------------------------
Sampled: 5000 of 6000, 83.33%
-------------------------------------------------
Sampled: 6000 of 6000, 100.00%
----------------------------------------
    Chain 2
----------------------------------------
Sampling ... 
Sampled: 1000 of 6000, 16.67%
-------------------------------------------------
Sampled: 2000 of 6000, 33.33%
-------------------------------------------------
Sampled: 3000 of 6000, 50.00%
-------------------------------------------------
Sampled: 4000 of 6000, 66.67%
-------------------------------------------------
Sampled: 5000 of 6000, 83.33%
-------------------------------------------------
Sampled: 6000 of 6000, 100.00%
----------------------------------------
    Chain 3
----------------------------------------
Sampling ... 
Sampled: 1000 of 6000, 16.67%
-------------------------------------------------
Sampled: 2000 of 6000, 33.33%
-------------------------------------------------
Sampled: 3000 of 6000, 50.00%
-------------------------------------------------
Sampled: 4000 of 6000, 66.67%
-------------------------------------------------
Sampled: 5000 of 6000, 83.33%
-------------------------------------------------
Sampled: 6000 of 6000, 100.00%
Code
summary(out.lfMs, level = 'community')

Call:
msPGOcc(occ.formula = ~scale(elev) + scale(border_dist) + scale(FLII), 
    det.formula = ~scale(effort), data = data_list, n.samples = 6000, 
    n.omp.threads = 6, n.report = 1000, n.burn = 1000, n.thin = 10, 
    n.chains = 3, n.factors = 5)

Samples per Chain: 6000
Burn-in: 1000
Thinning Rate: 10
Number of Chains: 3
Total Posterior Samples: 1500
Run Time (min): 0.3262

----------------------------------------
    Community Level
----------------------------------------
Occurrence Means (logit scale): 
                      Mean     SD    2.5%     50%  97.5%   Rhat ESS
(Intercept)        -1.0338 1.5475 -3.4934 -1.0741 2.1293 2.7807  17
scale(elev)         0.8401 1.2193 -1.6035  0.8071 3.3237 1.1145  85
scale(border_dist) -0.4947 1.1798 -2.9818 -0.4215 1.8379 1.1116 367
scale(FLII)         1.0837 1.1184 -0.6073  0.8467 3.6519 2.2383  40

Occurrence Variances (logit scale): 
                      Mean       SD   2.5%    50%    97.5%   Rhat ESS
(Intercept)         2.0833   5.1103 0.0454 0.4619  15.4509 1.5247  86
scale(elev)         4.5793  10.6065 0.0586 1.2043  31.5525 1.4030  98
scale(border_dist) 55.3490 103.0025 0.0909 9.3587 348.5054 6.6921  17
scale(FLII)         7.5921  18.7924 0.0582 0.9523  57.7578 2.3100  28

Detection Means (logit scale): 
                 Mean     SD    2.5%     50%   97.5%   Rhat ESS
(Intercept)   -3.3657 0.7064 -4.3311 -3.5753 -1.7400 2.3540  19
scale(effort)  0.8425 0.4376  0.0832  0.8164  1.8386 1.0448 425

Detection Variances (logit scale): 
                Mean     SD   2.5%    50% 97.5%   Rhat ESS
(Intercept)   0.3134 0.3883 0.0381 0.1925 1.311 1.0534 701
scale(effort) 0.3517 0.4844 0.0375 0.2078 1.550 1.0500 440
Code
# Fit a Spatial Factor Multi-Species Occupancy Model
# latent spatial factors.
tictoc::tic()
  out.sp <- sfMsPGOcc(occ.formula = ~ scale(elev) +
                               scale(border_dist) + 
                               scale(FLII) , 
               det.formula = ~ scale(effort), # Ordinal.day + I(Ordinal.day^2) + Year,            
                      data = data_list, 
                      n.omp.threads = 6,
                      n.batch = 500, 
                      batch.length = 40, # iter=600*25
                      n.thin = 10, 
                      n.burn = 10000, 
                      n.chains = 3,
                      NNGP = TRUE,
                      n.factors = 3, # balance of rare sp. and run time
                      n.neighbors = 8,
                      cov.model = 'exponential',
                      n.report = 1000);beep(sound = 4)
----------------------------------------
    Preparing to run the model
----------------------------------------
No prior specified for beta.comm.normal.
Setting prior mean to 0 and prior variance to 2.72
No prior specified for alpha.comm.normal.
Setting prior mean to 0 and prior variance to 2.72
No prior specified for tau.sq.beta.
Using an inverse-Gamma prior with prior shape 0.1 and prior scale 0.1
No prior specified for tau.sq.alpha.
Using an inverse-Gamma prior with prior shape 0.1 and prior scale 0.1
No prior specified for phi.unif.
Setting uniform bounds based on the range of observed spatial coordinates.
z is not specified in initial values.
Setting initial values based on observed data
beta.comm is not specified in initial values.
Setting initial values to random values from the prior distribution
alpha.comm is not specified in initial values.
Setting initial values to random values from the prior distribution
tau.sq.beta is not specified in initial values.
Setting initial values to random values between 0.5 and 10
tau.sq.alpha is not specified in initial values.
Setting initial values to random values between 0.5 and 10
beta is not specified in initial values.
Setting initial values to random values from the community-level normal distribution
alpha is not specified in initial values.
Setting initial values to random values from the community-level normal distribution
phi is not specified in initial values.
Setting initial value to random values from the prior distribution
lambda is not specified in initial values.
Setting initial values of the lower triangle to 0
----------------------------------------
    Building the neighbor list
----------------------------------------
----------------------------------------
Building the neighbors of neighbors list
----------------------------------------
----------------------------------------
    Model description
----------------------------------------
Spatial Factor NNGP Multi-species Occupancy Model with Polya-Gamma latent
variable fit with 58 sites and 11 species.

Samples per chain: 20000 (500 batches of length 40)
Burn-in: 10000 
Thinning Rate: 10 
Number of Chains: 3 
Total Posterior Samples: 3000 

Using the exponential spatial correlation model.

Using 3 latent spatial factors.
Using 8 nearest neighbors.

Source compiled with OpenMP support and model fit using 6 thread(s).

Adaptive Metropolis with target acceptance rate: 43.0
----------------------------------------
    Chain 1
----------------------------------------
Sampling ... 
Batch: 500 of 500, 100.00%
----------------------------------------
    Chain 2
----------------------------------------
Sampling ... 
Batch: 500 of 500, 100.00%
----------------------------------------
    Chain 3
----------------------------------------
Sampling ... 
Batch: 500 of 500, 100.00%
Code
tictoc::toc()
131.86 sec elapsed
Code
#########################
# Fit a Spatial Factor Multi-Species Occupancy Model
# latent spatial factors.
tictoc::tic()
  out.sp.int <- sfMsPGOcc(occ.formula = ~ scale(elev) +
                               scale(border_dist) * 
                               scale(FLII) , 
               det.formula = ~ scale(effort), # Ordinal.day + I(Ordinal.day^2) + Year,            
                      data = data_list, 
                      n.omp.threads = 6,
                      n.batch = 500, 
                      batch.length = 40, # iter=600*25
                      n.thin = 10, 
                      n.burn = 10000, 
                      n.chains = 3,
                      NNGP = TRUE,
                      n.factors = 3, # balance of rare sp. and run time
                      n.neighbors = 8,
                      cov.model = 'exponential',
                      n.report = 1000);beep(sound = 4)
----------------------------------------
    Preparing to run the model
----------------------------------------
No prior specified for beta.comm.normal.
Setting prior mean to 0 and prior variance to 2.72
No prior specified for alpha.comm.normal.
Setting prior mean to 0 and prior variance to 2.72
No prior specified for tau.sq.beta.
Using an inverse-Gamma prior with prior shape 0.1 and prior scale 0.1
No prior specified for tau.sq.alpha.
Using an inverse-Gamma prior with prior shape 0.1 and prior scale 0.1
No prior specified for phi.unif.
Setting uniform bounds based on the range of observed spatial coordinates.
z is not specified in initial values.
Setting initial values based on observed data
beta.comm is not specified in initial values.
Setting initial values to random values from the prior distribution
alpha.comm is not specified in initial values.
Setting initial values to random values from the prior distribution
tau.sq.beta is not specified in initial values.
Setting initial values to random values between 0.5 and 10
tau.sq.alpha is not specified in initial values.
Setting initial values to random values between 0.5 and 10
beta is not specified in initial values.
Setting initial values to random values from the community-level normal distribution
alpha is not specified in initial values.
Setting initial values to random values from the community-level normal distribution
phi is not specified in initial values.
Setting initial value to random values from the prior distribution
lambda is not specified in initial values.
Setting initial values of the lower triangle to 0
----------------------------------------
    Building the neighbor list
----------------------------------------
----------------------------------------
Building the neighbors of neighbors list
----------------------------------------
----------------------------------------
    Model description
----------------------------------------
Spatial Factor NNGP Multi-species Occupancy Model with Polya-Gamma latent
variable fit with 58 sites and 11 species.

Samples per chain: 20000 (500 batches of length 40)
Burn-in: 10000 
Thinning Rate: 10 
Number of Chains: 3 
Total Posterior Samples: 3000 

Using the exponential spatial correlation model.

Using 3 latent spatial factors.
Using 8 nearest neighbors.

Source compiled with OpenMP support and model fit using 6 thread(s).

Adaptive Metropolis with target acceptance rate: 43.0
----------------------------------------
    Chain 1
----------------------------------------
Sampling ... 
Batch: 500 of 500, 100.00%
----------------------------------------
    Chain 2
----------------------------------------
Sampling ... 
Batch: 500 of 500, 100.00%
----------------------------------------
    Chain 3
----------------------------------------
Sampling ... 
Batch: 500 of 500, 100.00%
Code
tictoc::toc()
133.03 sec elapsed
Code
#########################
#########################
# Fit a Spatial Factor Multi-Species Occupancy Model
# latent spatial factors.
tictoc::tic()
  out.int <- msPGOcc(occ.formula = ~ scale(elev) +
                               scale(border_dist) * 
                               scale(FLII) , 
               det.formula = ~ scale(effort), # Ordinal.day + I(Ordinal.day^2) + Year,            
                      data = data_list, 
                      n.omp.threads = 6,
                      #n.batch = 500, 
                      #batch.length = 40, # iter=600*25
                      n.samples = 20000, 
                      n.thin = 10, 
                      n.burn = 10000, 
                      n.chains = 3,
                      NNGP = TRUE,
                      n.factors = 3, # balance of rare sp. and run time
                      n.neighbors = 8,
                      cov.model = 'exponential',
                      n.report = 1000);beep(sound = 4)
----------------------------------------
    Preparing to run the model
----------------------------------------
Warning in msPGOcc(occ.formula = ~scale(elev) + scale(border_dist) *
scale(FLII), : 'NNGP' is not an argument
Warning in msPGOcc(occ.formula = ~scale(elev) + scale(border_dist) *
scale(FLII), : 'n.factors' is not an argument
Warning in msPGOcc(occ.formula = ~scale(elev) + scale(border_dist) *
scale(FLII), : 'n.neighbors' is not an argument
Warning in msPGOcc(occ.formula = ~scale(elev) + scale(border_dist) *
scale(FLII), : 'cov.model' is not an argument
No prior specified for beta.comm.normal.
Setting prior mean to 0 and prior variance to 2.72
No prior specified for alpha.comm.normal.
Setting prior mean to 0 and prior variance to 2.72
No prior specified for tau.sq.beta.ig.
Setting prior shape to 0.1 and prior scale to 0.1
No prior specified for tau.sq.alpha.ig.
Setting prior shape to 0.1 and prior scale to 0.1
z is not specified in initial values.
Setting initial values based on observed data
beta.comm is not specified in initial values.
Setting initial values to random values from the prior distribution
alpha.comm is not specified in initial values.
Setting initial values to random values from the prior distribution
tau.sq.beta is not specified in initial values.
Setting initial values to random values between 0.5 and 10
tau.sq.alpha is not specified in initial values.
Setting to initial values to random values between 0.5 and 10
beta is not specified in initial values.
Setting initial values to random values from the community-level normal distribution
alpha is not specified in initial values.
Setting initial values to random values from the community-level normal distribution
----------------------------------------
    Model description
----------------------------------------
Multi-species Occupancy Model with Polya-Gamma latent
variable fit with 58 sites and 11 species.

Samples per Chain: 20000 
Burn-in: 10000 
Thinning Rate: 10 
Number of Chains: 3 
Total Posterior Samples: 3000 

Source compiled with OpenMP support and model fit using 6 thread(s).

----------------------------------------
    Chain 1
----------------------------------------
Sampling ... 
Sampled: 1000 of 20000, 5.00%
-------------------------------------------------
Sampled: 2000 of 20000, 10.00%
-------------------------------------------------
Sampled: 3000 of 20000, 15.00%
-------------------------------------------------
Sampled: 4000 of 20000, 20.00%
-------------------------------------------------
Sampled: 5000 of 20000, 25.00%
-------------------------------------------------
Sampled: 6000 of 20000, 30.00%
-------------------------------------------------
Sampled: 7000 of 20000, 35.00%
-------------------------------------------------
Sampled: 8000 of 20000, 40.00%
-------------------------------------------------
Sampled: 9000 of 20000, 45.00%
-------------------------------------------------
Sampled: 10000 of 20000, 50.00%
-------------------------------------------------
Sampled: 11000 of 20000, 55.00%
-------------------------------------------------
Sampled: 12000 of 20000, 60.00%
-------------------------------------------------
Sampled: 13000 of 20000, 65.00%
-------------------------------------------------
Sampled: 14000 of 20000, 70.00%
-------------------------------------------------
Sampled: 15000 of 20000, 75.00%
-------------------------------------------------
Sampled: 16000 of 20000, 80.00%
-------------------------------------------------
Sampled: 17000 of 20000, 85.00%
-------------------------------------------------
Sampled: 18000 of 20000, 90.00%
-------------------------------------------------
Sampled: 19000 of 20000, 95.00%
-------------------------------------------------
Sampled: 20000 of 20000, 100.00%
----------------------------------------
    Chain 2
----------------------------------------
Sampling ... 
Sampled: 1000 of 20000, 5.00%
-------------------------------------------------
Sampled: 2000 of 20000, 10.00%
-------------------------------------------------
Sampled: 3000 of 20000, 15.00%
-------------------------------------------------
Sampled: 4000 of 20000, 20.00%
-------------------------------------------------
Sampled: 5000 of 20000, 25.00%
-------------------------------------------------
Sampled: 6000 of 20000, 30.00%
-------------------------------------------------
Sampled: 7000 of 20000, 35.00%
-------------------------------------------------
Sampled: 8000 of 20000, 40.00%
-------------------------------------------------
Sampled: 9000 of 20000, 45.00%
-------------------------------------------------
Sampled: 10000 of 20000, 50.00%
-------------------------------------------------
Sampled: 11000 of 20000, 55.00%
-------------------------------------------------
Sampled: 12000 of 20000, 60.00%
-------------------------------------------------
Sampled: 13000 of 20000, 65.00%
-------------------------------------------------
Sampled: 14000 of 20000, 70.00%
-------------------------------------------------
Sampled: 15000 of 20000, 75.00%
-------------------------------------------------
Sampled: 16000 of 20000, 80.00%
-------------------------------------------------
Sampled: 17000 of 20000, 85.00%
-------------------------------------------------
Sampled: 18000 of 20000, 90.00%
-------------------------------------------------
Sampled: 19000 of 20000, 95.00%
-------------------------------------------------
Sampled: 20000 of 20000, 100.00%
----------------------------------------
    Chain 3
----------------------------------------
Sampling ... 
Sampled: 1000 of 20000, 5.00%
-------------------------------------------------
Sampled: 2000 of 20000, 10.00%
-------------------------------------------------
Sampled: 3000 of 20000, 15.00%
-------------------------------------------------
Sampled: 4000 of 20000, 20.00%
-------------------------------------------------
Sampled: 5000 of 20000, 25.00%
-------------------------------------------------
Sampled: 6000 of 20000, 30.00%
-------------------------------------------------
Sampled: 7000 of 20000, 35.00%
-------------------------------------------------
Sampled: 8000 of 20000, 40.00%
-------------------------------------------------
Sampled: 9000 of 20000, 45.00%
-------------------------------------------------
Sampled: 10000 of 20000, 50.00%
-------------------------------------------------
Sampled: 11000 of 20000, 55.00%
-------------------------------------------------
Sampled: 12000 of 20000, 60.00%
-------------------------------------------------
Sampled: 13000 of 20000, 65.00%
-------------------------------------------------
Sampled: 14000 of 20000, 70.00%
-------------------------------------------------
Sampled: 15000 of 20000, 75.00%
-------------------------------------------------
Sampled: 16000 of 20000, 80.00%
-------------------------------------------------
Sampled: 17000 of 20000, 85.00%
-------------------------------------------------
Sampled: 18000 of 20000, 90.00%
-------------------------------------------------
Sampled: 19000 of 20000, 95.00%
-------------------------------------------------
Sampled: 20000 of 20000, 100.00%
Code
tictoc::toc()
69.81 sec elapsed
Code
#########################


tictoc::tic()
  out.sp.cat <- sfMsPGOcc(occ.formula = ~ scale(elev) +
                               factor(in_AP) + 
                               scale(FLII) , 
               det.formula = ~ scale(effort), # Ordinal.day + I(Ordinal.day^2) + Year,            
                      data = data_list, 
                      n.omp.threads = 6,
                      n.batch = 600, 
                      batch.length = 25, # iter=600*25
                      n.thin = 10, 
                      n.burn = 5000, 
                      n.chains = 3,
                      NNGP = TRUE,
                      n.factors = 3, # balance of rare sp. and run time
                      n.neighbors = 8,
                      cov.model = 'exponential',
                      n.report = 1000);beep(sound = 4)
----------------------------------------
    Preparing to run the model
----------------------------------------
No prior specified for beta.comm.normal.
Setting prior mean to 0 and prior variance to 2.72
No prior specified for alpha.comm.normal.
Setting prior mean to 0 and prior variance to 2.72
No prior specified for tau.sq.beta.
Using an inverse-Gamma prior with prior shape 0.1 and prior scale 0.1
No prior specified for tau.sq.alpha.
Using an inverse-Gamma prior with prior shape 0.1 and prior scale 0.1
No prior specified for phi.unif.
Setting uniform bounds based on the range of observed spatial coordinates.
z is not specified in initial values.
Setting initial values based on observed data
beta.comm is not specified in initial values.
Setting initial values to random values from the prior distribution
alpha.comm is not specified in initial values.
Setting initial values to random values from the prior distribution
tau.sq.beta is not specified in initial values.
Setting initial values to random values between 0.5 and 10
tau.sq.alpha is not specified in initial values.
Setting initial values to random values between 0.5 and 10
beta is not specified in initial values.
Setting initial values to random values from the community-level normal distribution
alpha is not specified in initial values.
Setting initial values to random values from the community-level normal distribution
phi is not specified in initial values.
Setting initial value to random values from the prior distribution
lambda is not specified in initial values.
Setting initial values of the lower triangle to 0
----------------------------------------
    Building the neighbor list
----------------------------------------
----------------------------------------
Building the neighbors of neighbors list
----------------------------------------
----------------------------------------
    Model description
----------------------------------------
Spatial Factor NNGP Multi-species Occupancy Model with Polya-Gamma latent
variable fit with 58 sites and 11 species.

Samples per chain: 15000 (600 batches of length 25)
Burn-in: 5000 
Thinning Rate: 10 
Number of Chains: 3 
Total Posterior Samples: 3000 

Using the exponential spatial correlation model.

Using 3 latent spatial factors.
Using 8 nearest neighbors.

Source compiled with OpenMP support and model fit using 6 thread(s).

Adaptive Metropolis with target acceptance rate: 43.0
----------------------------------------
    Chain 1
----------------------------------------
Sampling ... 
Batch: 600 of 600, 100.00%
----------------------------------------
    Chain 2
----------------------------------------
Sampling ... 
Batch: 600 of 600, 100.00%
----------------------------------------
    Chain 3
----------------------------------------
Sampling ... 
Batch: 600 of 600, 100.00%
Code
tictoc::toc()
84.94 sec elapsed
Code
#########################
tictoc::tic()
  out.sp.cat.int <- sfMsPGOcc(occ.formula = ~ scale(elev) +
                               factor(in_AP) * scale(FLII) + 
                               scale(FLII), 
               det.formula = ~ scale(effort), # Ordinal.day + I(Ordinal.day^2) + Year,            
                      data = data_list, 
                      n.omp.threads = 6,
                      n.batch = 600, 
                      batch.length = 25, # iter=600*25
                      n.thin = 10, 
                      n.burn = 5000, 
                      n.chains = 3,
                      NNGP = TRUE,
                      n.factors = 3, # balance of rare sp. and run time
                      n.neighbors = 8,
                      cov.model = 'exponential',
                      n.report = 1000);beep(sound = 4)
----------------------------------------
    Preparing to run the model
----------------------------------------
No prior specified for beta.comm.normal.
Setting prior mean to 0 and prior variance to 2.72
No prior specified for alpha.comm.normal.
Setting prior mean to 0 and prior variance to 2.72
No prior specified for tau.sq.beta.
Using an inverse-Gamma prior with prior shape 0.1 and prior scale 0.1
No prior specified for tau.sq.alpha.
Using an inverse-Gamma prior with prior shape 0.1 and prior scale 0.1
No prior specified for phi.unif.
Setting uniform bounds based on the range of observed spatial coordinates.
z is not specified in initial values.
Setting initial values based on observed data
beta.comm is not specified in initial values.
Setting initial values to random values from the prior distribution
alpha.comm is not specified in initial values.
Setting initial values to random values from the prior distribution
tau.sq.beta is not specified in initial values.
Setting initial values to random values between 0.5 and 10
tau.sq.alpha is not specified in initial values.
Setting initial values to random values between 0.5 and 10
beta is not specified in initial values.
Setting initial values to random values from the community-level normal distribution
alpha is not specified in initial values.
Setting initial values to random values from the community-level normal distribution
phi is not specified in initial values.
Setting initial value to random values from the prior distribution
lambda is not specified in initial values.
Setting initial values of the lower triangle to 0
----------------------------------------
    Building the neighbor list
----------------------------------------
----------------------------------------
Building the neighbors of neighbors list
----------------------------------------
----------------------------------------
    Model description
----------------------------------------
Spatial Factor NNGP Multi-species Occupancy Model with Polya-Gamma latent
variable fit with 58 sites and 11 species.

Samples per chain: 15000 (600 batches of length 25)
Burn-in: 5000 
Thinning Rate: 10 
Number of Chains: 3 
Total Posterior Samples: 3000 

Using the exponential spatial correlation model.

Using 3 latent spatial factors.
Using 8 nearest neighbors.

Source compiled with OpenMP support and model fit using 6 thread(s).

Adaptive Metropolis with target acceptance rate: 43.0
----------------------------------------
    Chain 1
----------------------------------------
Sampling ... 
Batch: 600 of 600, 100.00%
----------------------------------------
    Chain 2
----------------------------------------
Sampling ... 
Batch: 600 of 600, 100.00%
----------------------------------------
    Chain 3
----------------------------------------
Sampling ... 
Batch: 600 of 600, 100.00%
Code
tictoc::toc()
100.53 sec elapsed
Code
# tictoc::tic()
#   out.sp.gaus <- sfMsPGOcc(occ.formula = ~ scale(border_dist) , 
#                            det.formula = ~ scale(effort), # Ordinal.day + I(Ordinal.day^2) + Year,              
#                            data = data_list, 
#                            n.batch = 400, 
#                            batch.length = 25,
#                            n.thin = 5, 
#                            n.burn = 5000, 
#                            n.chains = 1,
#                            NNGP = TRUE,
#                            n.factors = 5,
#                            n.neighbors = 15,
#                            cov.model = 'gaussian',
#                            n.report = 100);beep(sound = 4)
# tictoc::toc()

# save the results to not run again
# save(out, file="C:/CodigoR/Occu_APs_all/blog/2025-10-15-analysis/result/result_2.R") # guardamos los resultados para no correr de nuevo
# save the results to not run again
# save(out.sp, file="C:/CodigoR/Occu_APs_all/blog/2025-10-15-analysis/result/sp_result_2.R") # guardamos los resultados para no correr de nuevo

# save(out.lfMs, file="C:/CodigoR/Occu_APs_all/blog/2025-10-15-analysis/result/lfms_result_2.R") # guardamos los resultados para no correr de nuevo


# load("C:/CodigoR/Occu_APs_all/blog/2025-10-15-analysis/result/sp_result_2.R")
# summary(fit.commu)

Model validation

We next perform a posterior predictive check using the Freeman-Tukey statistic grouping the data by sites. We summarize the posterior predictive check with the summary() function, which reports a Bayesian p-value. A Bayesian p-value that hovers around 0.5 indicates adequate model fit, while values less than 0.1 or greater than 0.9 suggest our model does not fit the data well (Hobbs and Hooten 2015). As always with a simulation-based analysis using MCMC, you will get numerically slightly different values.

Code
# 3. Model validation -----------------------------------------------------
# Perform a posterior predictive check to assess model fit. 
ppc.out <- ppcOcc(out.null, fit.stat = 'freeman-tukey', 
                  group = 1)
ppc.out.lfMs <- ppcOcc(out.lfMs, fit.stat = 'freeman-tukey', 
                  group = 1)
ppc.out.sp <- ppcOcc(out.sp, fit.stat = 'freeman-tukey',
                     group = 1)
ppc.out.sp.int <- ppcOcc(out.sp.int, fit.stat = 'freeman-tukey',
                     group = 1)
ppc.out.int <- ppcOcc(out.int, fit.stat = 'freeman-tukey',
                     group = 1)
# Calculate a Bayesian p-value as a simple measure of Goodness of Fit.
# Bayesian p-values between 0.1 and 0.9 indicate adequate model fit. 
summary(ppc.out)

Call:
ppcOcc(object = out.null, fit.stat = "freeman-tukey", group = 1)

Samples per Chain: 6000
Burn-in: 1000
Thinning Rate: 10
Number of Chains: 3
Total Posterior Samples: 1500

----------------------------------------
    Community Level
----------------------------------------
Bayesian p-value:  0.4251 

----------------------------------------
    Species Level
----------------------------------------
Cuniculus paca Bayesian p-value: 0.0633
Dasyprocta punctata Bayesian p-value: 0.3887
Dasypus novemcinctus Bayesian p-value: 0.5007
Eira barbara Bayesian p-value: 0.5827
Leopardus wiedii Bayesian p-value: 0.4473
Mazama americana Bayesian p-value: 0.6387
Odocoileus virginianus Bayesian p-value: 0.5787
Procyon cancrivorus Bayesian p-value: 0.494
Pecari tajacu Bayesian p-value: 0.172
Sylvilagus brasiliensis Bayesian p-value: 0.176
Tamandua mexicana Bayesian p-value: 0.634
Fit statistic:  freeman-tukey 
Code
summary(ppc.out.lfMs)

Call:
ppcOcc(object = out.lfMs, fit.stat = "freeman-tukey", group = 1)

Samples per Chain: 6000
Burn-in: 1000
Thinning Rate: 10
Number of Chains: 3
Total Posterior Samples: 1500

----------------------------------------
    Community Level
----------------------------------------
Bayesian p-value:  0.4285 

----------------------------------------
    Species Level
----------------------------------------
Cuniculus paca Bayesian p-value: 0.0693
Dasyprocta punctata Bayesian p-value: 0.4033
Dasypus novemcinctus Bayesian p-value: 0.516
Eira barbara Bayesian p-value: 0.556
Leopardus wiedii Bayesian p-value: 0.5027
Mazama americana Bayesian p-value: 0.6573
Odocoileus virginianus Bayesian p-value: 0.5293
Procyon cancrivorus Bayesian p-value: 0.482
Pecari tajacu Bayesian p-value: 0.152
Sylvilagus brasiliensis Bayesian p-value: 0.2267
Tamandua mexicana Bayesian p-value: 0.6193
Fit statistic:  freeman-tukey 
Code
summary(ppc.out.sp)

Call:
ppcOcc(object = out.sp, fit.stat = "freeman-tukey", group = 1)

Samples per Chain: 20000
Burn-in: 10000
Thinning Rate: 10
Number of Chains: 3
Total Posterior Samples: 3000

----------------------------------------
    Community Level
----------------------------------------
Bayesian p-value:  0.4288 

----------------------------------------
    Species Level
----------------------------------------
Cuniculus paca Bayesian p-value: 0.0687
Dasyprocta punctata Bayesian p-value: 0.4077
Dasypus novemcinctus Bayesian p-value: 0.5043
Eira barbara Bayesian p-value: 0.563
Leopardus wiedii Bayesian p-value: 0.4893
Mazama americana Bayesian p-value: 0.6413
Odocoileus virginianus Bayesian p-value: 0.531
Procyon cancrivorus Bayesian p-value: 0.497
Pecari tajacu Bayesian p-value: 0.1767
Sylvilagus brasiliensis Bayesian p-value: 0.2113
Tamandua mexicana Bayesian p-value: 0.6263
Fit statistic:  freeman-tukey 
Code
summary(out.sp.int)

Call:
sfMsPGOcc(occ.formula = ~scale(elev) + scale(border_dist) * scale(FLII), 
    det.formula = ~scale(effort), data = data_list, cov.model = "exponential", 
    NNGP = TRUE, n.neighbors = 8, n.factors = 3, n.batch = 500, 
    batch.length = 40, n.omp.threads = 6, n.report = 1000, n.burn = 10000, 
    n.thin = 10, n.chains = 3)

Samples per Chain: 20000
Burn-in: 10000
Thinning Rate: 10
Number of Chains: 3
Total Posterior Samples: 3000
Run Time (min): 2.2167

----------------------------------------
    Community Level
----------------------------------------
Occurrence Means (logit scale): 
                                  Mean     SD    2.5%     50%  97.5%   Rhat ESS
(Intercept)                     0.0347 1.7068 -3.2928  0.0401 3.4569 1.3078 152
scale(elev)                     0.3662 1.5609 -2.7882  0.4133 3.4141 1.2637 397
scale(border_dist)             -0.2851 1.5723 -3.2833 -0.3076 2.8422 1.1261 543
scale(FLII)                     0.6821 1.4857 -2.3254  0.7745 3.4956 1.4144 348
scale(border_dist):scale(FLII) -0.0843 1.6004 -3.2935 -0.0689 3.1070 1.1003 467

Occurrence Variances (logit scale): 
                                    Mean         SD   2.5%       50%      97.5%
(Intercept)                      67.7362   188.1779 0.0633    2.5525   577.0594
scale(elev)                     113.0832   384.8076 0.0745    3.1852  1160.6209
scale(border_dist)             3642.4007  4591.2731 0.3169 2150.7025 15213.5290
scale(FLII)                    7769.6349 16332.2163 0.0789   15.5716 55722.9373
scale(border_dist):scale(FLII) 3481.4399  6301.1538 0.0892   23.5940 19888.3211
                                  Rhat ESS
(Intercept)                     4.4640  25
scale(elev)                     1.3383  66
scale(border_dist)              2.7027  17
scale(FLII)                     9.8327   9
scale(border_dist):scale(FLII) 13.4763   9

Detection Means (logit scale): 
                 Mean     SD    2.5%     50%   97.5%   Rhat ESS
(Intercept)   -3.8228 0.3896 -4.5146 -3.8447 -2.9668 1.3545  90
scale(effort)  0.8831 0.4638  0.0992  0.8338  1.8721 1.0173 622

Detection Variances (logit scale): 
                Mean     SD   2.5%    50%  97.5%   Rhat  ESS
(Intercept)   0.2781 0.3091 0.0353 0.1827 1.0978 1.0469 2146
scale(effort) 0.3448 0.4317 0.0360 0.2100 1.5089 1.0040 1439

----------------------------------------
    Species Level
----------------------------------------
Occurrence (logit scale): 
                                                           Mean       SD
(Intercept)-Cuniculus paca                               0.1285   5.8115
(Intercept)-Dasyprocta punctata                         -0.0922   6.9140
(Intercept)-Dasypus novemcinctus                         1.4494   6.4169
(Intercept)-Eira barbara                                 0.0145   6.5150
(Intercept)-Leopardus wiedii                            -2.1737   9.6062
(Intercept)-Mazama americana                             0.4729   6.6668
(Intercept)-Odocoileus virginianus                      -0.5600   7.7680
(Intercept)-Procyon cancrivorus                          3.1057   9.0633
(Intercept)-Pecari tajacu                                0.3082   6.1464
(Intercept)-Sylvilagus brasiliensis                     -1.4300   7.1244
(Intercept)-Tamandua mexicana                            3.0219  10.0869
scale(elev)-Cuniculus paca                               0.8315   8.2113
scale(elev)-Dasyprocta punctata                         -0.0682   7.6537
scale(elev)-Dasypus novemcinctus                         0.6615   7.3394
scale(elev)-Eira barbara                                 3.1122   9.1855
scale(elev)-Leopardus wiedii                            -0.2257  10.3005
scale(elev)-Mazama americana                            -0.2060  12.6630
scale(elev)-Odocoileus virginianus                       1.8484   9.2253
scale(elev)-Procyon cancrivorus                          0.9034   9.0273
scale(elev)-Pecari tajacu                                1.4458   8.6958
scale(elev)-Sylvilagus brasiliensis                     -1.3015  11.6963
scale(elev)-Tamandua mexicana                            2.6374  11.1967
scale(border_dist)-Cuniculus paca                      -52.3480  44.7218
scale(border_dist)-Dasyprocta punctata                 -14.3995  50.2368
scale(border_dist)-Dasypus novemcinctus                -32.9495  52.6405
scale(border_dist)-Eira barbara                        -22.5165  50.6818
scale(border_dist)-Leopardus wiedii                     -2.8785  27.4295
scale(border_dist)-Mazama americana                     12.7485  36.1076
scale(border_dist)-Odocoileus virginianus               55.6519  54.7893
scale(border_dist)-Procyon cancrivorus                  -5.0082  43.0115
scale(border_dist)-Pecari tajacu                       -44.7527  49.1159
scale(border_dist)-Sylvilagus brasiliensis             -20.8111  47.4831
scale(border_dist)-Tamandua mexicana                   -16.0950  41.1418
scale(FLII)-Cuniculus paca                              10.7125  19.3686
scale(FLII)-Dasyprocta punctata                         41.2096  68.8166
scale(FLII)-Dasypus novemcinctus                        43.8993  67.9462
scale(FLII)-Eira barbara                               -21.8577  37.6872
scale(FLII)-Leopardus wiedii                           -67.0754 114.9053
scale(FLII)-Mazama americana                           -17.5959  42.0908
scale(FLII)-Odocoileus virginianus                      -5.8958  17.1950
scale(FLII)-Procyon cancrivorus                         67.5835 116.4684
scale(FLII)-Pecari tajacu                               18.9559  33.2930
scale(FLII)-Sylvilagus brasiliensis                      9.6838  27.4338
scale(FLII)-Tamandua mexicana                           69.3953 109.1034
scale(border_dist):scale(FLII)-Cuniculus paca           -5.8559  24.2163
scale(border_dist):scale(FLII)-Dasyprocta punctata     -46.2640  72.4179
scale(border_dist):scale(FLII)-Dasypus novemcinctus     13.3594  62.0041
scale(border_dist):scale(FLII)-Eira barbara            -35.0221  54.0465
scale(border_dist):scale(FLII)-Leopardus wiedii         17.8221  30.0745
scale(border_dist):scale(FLII)-Mazama americana        -41.2355  65.4718
scale(border_dist):scale(FLII)-Odocoileus virginianus   -2.4098  25.4252
scale(border_dist):scale(FLII)-Procyon cancrivorus      14.1276  34.0738
scale(border_dist):scale(FLII)-Pecari tajacu            -1.2430  29.8488
scale(border_dist):scale(FLII)-Sylvilagus brasiliensis  34.5830  50.9448
scale(border_dist):scale(FLII)-Tamandua mexicana        23.8015  45.1848
                                                            2.5%      50%
(Intercept)-Cuniculus paca                              -11.9088  -0.1150
(Intercept)-Dasyprocta punctata                         -14.1955  -0.2451
(Intercept)-Dasypus novemcinctus                         -9.0397   0.2479
(Intercept)-Eira barbara                                -15.7870   0.0342
(Intercept)-Leopardus wiedii                            -35.7549  -0.4120
(Intercept)-Mazama americana                            -11.4514  -0.1517
(Intercept)-Odocoileus virginianus                      -21.3418  -0.1130
(Intercept)-Procyon cancrivorus                          -5.9263   0.5955
(Intercept)-Pecari tajacu                               -10.4342  -0.1941
(Intercept)-Sylvilagus brasiliensis                     -17.6550  -0.4841
(Intercept)-Tamandua mexicana                            -7.1528   0.3946
scale(elev)-Cuniculus paca                              -17.0031   0.6140
scale(elev)-Dasyprocta punctata                         -20.3413   0.4618
scale(elev)-Dasypus novemcinctus                        -14.6642   0.5100
scale(elev)-Eira barbara                                 -8.1779   1.0536
scale(elev)-Leopardus wiedii                            -24.5696   0.2964
scale(elev)-Mazama americana                            -23.8180   0.0043
scale(elev)-Odocoileus virginianus                      -13.8207   0.8845
scale(elev)-Procyon cancrivorus                         -16.3197   0.6484
scale(elev)-Pecari tajacu                               -15.0998   0.7601
scale(elev)-Sylvilagus brasiliensis                     -33.6405   0.3873
scale(elev)-Tamandua mexicana                           -10.9383   0.7825
scale(border_dist)-Cuniculus paca                      -145.1732 -47.1308
scale(border_dist)-Dasyprocta punctata                 -151.6382  -2.1447
scale(border_dist)-Dasypus novemcinctus                -170.5911 -11.7926
scale(border_dist)-Eira barbara                        -147.4439  -2.9544
scale(border_dist)-Leopardus wiedii                     -68.4942  -1.7251
scale(border_dist)-Mazama americana                     -55.0639   3.5595
scale(border_dist)-Odocoileus virginianus                -2.0866  38.0990
scale(border_dist)-Procyon cancrivorus                 -105.3612  -0.3813
scale(border_dist)-Pecari tajacu                       -164.2540 -31.8151
scale(border_dist)-Sylvilagus brasiliensis             -123.3248  -9.1955
scale(border_dist)-Tamandua mexicana                   -122.6770  -3.0896
scale(FLII)-Cuniculus paca                               -6.4784   2.4671
scale(FLII)-Dasyprocta punctata                          -4.7051   2.9952
scale(FLII)-Dasypus novemcinctus                         -2.4892   3.3322
scale(FLII)-Eira barbara                               -127.7995  -0.3987
scale(FLII)-Leopardus wiedii                           -381.2833  -0.5834
scale(FLII)-Mazama americana                           -157.7090   0.1365
scale(FLII)-Odocoileus virginianus                      -62.4216   0.0729
scale(FLII)-Procyon cancrivorus                          -2.8094   3.7056
scale(FLII)-Pecari tajacu                                -9.7076   2.5501
scale(FLII)-Sylvilagus brasiliensis                     -23.7784   1.2821
scale(FLII)-Tamandua mexicana                            -3.1254   3.1130
scale(border_dist):scale(FLII)-Cuniculus paca           -77.1088  -0.3453
scale(border_dist):scale(FLII)-Dasyprocta punctata     -217.3662  -2.4035
scale(border_dist):scale(FLII)-Dasypus novemcinctus     -86.9709   0.0357
scale(border_dist):scale(FLII)-Eira barbara            -180.3671  -3.6769
scale(border_dist):scale(FLII)-Leopardus wiedii          -7.5411   2.8205
scale(border_dist):scale(FLII)-Mazama americana        -210.7712  -2.2174
scale(border_dist):scale(FLII)-Odocoileus virginianus   -76.0610  -0.0210
scale(border_dist):scale(FLII)-Procyon cancrivorus      -25.4218   0.9792
scale(border_dist):scale(FLII)-Pecari tajacu            -68.4755  -0.7185
scale(border_dist):scale(FLII)-Sylvilagus brasiliensis   -6.3895   2.7735
scale(border_dist):scale(FLII)-Tamandua mexicana        -13.8952   1.9319
                                                          97.5%    Rhat ESS
(Intercept)-Cuniculus paca                              14.2914  1.3302 120
(Intercept)-Dasyprocta punctata                         16.9317  1.2462 157
(Intercept)-Dasypus novemcinctus                        19.4727  2.0337  54
(Intercept)-Eira barbara                                13.7239  1.5479 104
(Intercept)-Leopardus wiedii                             9.8637  2.4668  32
(Intercept)-Mazama americana                            19.5926  1.6924 121
(Intercept)-Odocoileus virginianus                      14.4005  1.3688  49
(Intercept)-Procyon cancrivorus                         31.8191  3.6574  42
(Intercept)-Pecari tajacu                               15.9092  1.4216 187
(Intercept)-Sylvilagus brasiliensis                      8.4410  1.4932 123
(Intercept)-Tamandua mexicana                           34.7583  3.8334  29
scale(elev)-Cuniculus paca                              18.2074  1.1445 410
scale(elev)-Dasyprocta punctata                         14.5142  1.1984 234
scale(elev)-Dasypus novemcinctus                        19.1002  1.1257 224
scale(elev)-Eira barbara                                29.6983  1.1429 100
scale(elev)-Leopardus wiedii                            20.2121  1.2950 168
scale(elev)-Mazama americana                            28.1360  1.1780 103
scale(elev)-Odocoileus virginianus                      30.2602  1.5359  55
scale(elev)-Procyon cancrivorus                         22.0564  1.2840 176
scale(elev)-Pecari tajacu                               23.4001  1.1479 132
scale(elev)-Sylvilagus brasiliensis                     12.9862  1.6397  48
scale(elev)-Tamandua mexicana                           36.4809  1.2191  50
scale(border_dist)-Cuniculus paca                       -0.0757  4.6969  13
scale(border_dist)-Dasyprocta punctata                  59.5883  1.2450  17
scale(border_dist)-Dasypus novemcinctus                 37.4078  2.5371  13
scale(border_dist)-Eira barbara                         60.5108  5.5456  12
scale(border_dist)-Leopardus wiedii                     47.5984  1.1755  47
scale(border_dist)-Mazama americana                     95.7851  1.6744  29
scale(border_dist)-Odocoileus virginianus              179.9594  4.2405  15
scale(border_dist)-Procyon cancrivorus                  80.5566  1.4810  20
scale(border_dist)-Pecari tajacu                        12.7698  3.1100  13
scale(border_dist)-Sylvilagus brasiliensis              75.7036  5.1870  16
scale(border_dist)-Tamandua mexicana                    49.8549  2.1643  20
scale(FLII)-Cuniculus paca                              71.2619  5.0187  27
scale(FLII)-Dasyprocta punctata                        218.1066 14.6166   4
scale(FLII)-Dasypus novemcinctus                       222.2690 17.0369   5
scale(FLII)-Eira barbara                                 8.7810 14.3170   9
scale(FLII)-Leopardus wiedii                             7.5726 15.7782   6
scale(FLII)-Mazama americana                            18.9586  7.7861   8
scale(FLII)-Odocoileus virginianus                      13.5548  4.6623  36
scale(FLII)-Procyon cancrivorus                        403.2815 13.5270   8
scale(FLII)-Pecari tajacu                              118.1408  8.1458  14
scale(FLII)-Sylvilagus brasiliensis                     96.5400  4.2003  15
scale(FLII)-Tamandua mexicana                          368.4235 18.1521   3
scale(border_dist):scale(FLII)-Cuniculus paca           34.5213  3.9841  26
scale(border_dist):scale(FLII)-Dasyprocta punctata       4.5522 20.2011   7
scale(border_dist):scale(FLII)-Dasypus novemcinctus    199.8337  3.6583   7
scale(border_dist):scale(FLII)-Eira barbara              3.8675 17.9067   5
scale(border_dist):scale(FLII)-Leopardus wiedii        100.7958 12.1614  18
scale(border_dist):scale(FLII)-Mazama americana          7.7684 17.5503  10
scale(border_dist):scale(FLII)-Odocoileus virginianus   55.3728  2.0702  24
scale(border_dist):scale(FLII)-Procyon cancrivorus     118.4681  6.7018  15
scale(border_dist):scale(FLII)-Pecari tajacu            72.2252  1.3297  18
scale(border_dist):scale(FLII)-Sylvilagus brasiliensis 149.5253 21.6157  11
scale(border_dist):scale(FLII)-Tamandua mexicana       160.6895 10.5184   9

Detection (logit scale): 
                                         Mean     SD    2.5%     50%   97.5%
(Intercept)-Cuniculus paca            -3.5400 0.4995 -4.4172 -3.5714 -2.4334
(Intercept)-Dasyprocta punctata       -3.8193 0.4994 -4.7595 -3.8148 -2.7898
(Intercept)-Dasypus novemcinctus      -4.0507 0.5595 -5.2079 -4.0416 -2.9743
(Intercept)-Eira barbara              -3.8360 0.4968 -4.7793 -3.8375 -2.7811
(Intercept)-Leopardus wiedii          -3.9816 0.5532 -5.0851 -3.9709 -2.8569
(Intercept)-Mazama americana          -4.0725 0.5689 -5.2756 -4.0420 -2.9731
(Intercept)-Odocoileus virginianus    -3.7784 0.4996 -4.7633 -3.7841 -2.7348
(Intercept)-Procyon cancrivorus       -4.0626 0.5521 -5.1945 -4.0466 -2.9903
(Intercept)-Pecari tajacu             -3.5309 0.4856 -4.4167 -3.5573 -2.5106
(Intercept)-Sylvilagus brasiliensis   -3.8499 0.5324 -4.9173 -3.8562 -2.7583
(Intercept)-Tamandua mexicana         -3.8808 0.5199 -4.9453 -3.8786 -2.8111
scale(effort)-Cuniculus paca           1.0773 0.6992 -0.0495  0.9817  2.7469
scale(effort)-Dasyprocta punctata      0.8922 0.6334 -0.2040  0.8330  2.3154
scale(effort)-Dasypus novemcinctus     0.7646 0.6232 -0.3652  0.7187  2.1189
scale(effort)-Eira barbara             0.9867 0.6590 -0.1218  0.9227  2.5481
scale(effort)-Leopardus wiedii         0.8934 0.6592 -0.2148  0.8228  2.3471
scale(effort)-Mazama americana         0.8611 0.6388 -0.2520  0.7922  2.2898
scale(effort)-Odocoileus virginianus   1.0251 0.6896 -0.0764  0.9271  2.6584
scale(effort)-Procyon cancrivorus      0.7791 0.6209 -0.2675  0.7216  2.1504
scale(effort)-Pecari tajacu            0.9160 0.6460 -0.1770  0.8483  2.4082
scale(effort)-Sylvilagus brasiliensis  0.9701 0.6795 -0.1510  0.8927  2.5413
scale(effort)-Tamandua mexicana        0.6955 0.5803 -0.2932  0.6316  1.9774
                                        Rhat  ESS
(Intercept)-Cuniculus paca            1.1659  114
(Intercept)-Dasyprocta punctata       1.2688  134
(Intercept)-Dasypus novemcinctus      1.1612  159
(Intercept)-Eira barbara              1.1982  147
(Intercept)-Leopardus wiedii          1.1087  235
(Intercept)-Mazama americana          1.1953  185
(Intercept)-Odocoileus virginianus    1.1368  198
(Intercept)-Procyon cancrivorus       1.1788  152
(Intercept)-Pecari tajacu             1.1362  182
(Intercept)-Sylvilagus brasiliensis   1.1765  152
(Intercept)-Tamandua mexicana         1.1602  107
scale(effort)-Cuniculus paca          1.0194  849
scale(effort)-Dasyprocta punctata     1.0194  803
scale(effort)-Dasypus novemcinctus    1.0056  961
scale(effort)-Eira barbara            1.0207  938
scale(effort)-Leopardus wiedii        1.0175  853
scale(effort)-Mazama americana        1.0394  820
scale(effort)-Odocoileus virginianus  1.0165  830
scale(effort)-Procyon cancrivorus     1.0046 1041
scale(effort)-Pecari tajacu           1.0082  906
scale(effort)-Sylvilagus brasiliensis 1.0025  866
scale(effort)-Tamandua mexicana       1.0042 1154

----------------------------------------
    Spatial Covariance
----------------------------------------
        Mean     SD   2.5%    50%   97.5%   Rhat  ESS
phi-1 9.7113 5.6803 0.5033 9.7773 19.0473 1.0046 1793
phi-2 9.7915 5.5809 0.4915 9.7221 19.0956 0.9998 1805
phi-3 9.8820 5.6167 0.5195 9.7658 19.0940 1.0038 1518
Code
summary(ppc.out.int)

Call:
ppcOcc(object = out.int, fit.stat = "freeman-tukey", group = 1)

Samples per Chain: 20000
Burn-in: 10000
Thinning Rate: 10
Number of Chains: 3
Total Posterior Samples: 3000

----------------------------------------
    Community Level
----------------------------------------
Bayesian p-value:  0.4185 

----------------------------------------
    Species Level
----------------------------------------
Cuniculus paca Bayesian p-value: 0.049
Dasyprocta punctata Bayesian p-value: 0.3883
Dasypus novemcinctus Bayesian p-value: 0.5463
Eira barbara Bayesian p-value: 0.5547
Leopardus wiedii Bayesian p-value: 0.4737
Mazama americana Bayesian p-value: 0.6847
Odocoileus virginianus Bayesian p-value: 0.4613
Procyon cancrivorus Bayesian p-value: 0.5363
Pecari tajacu Bayesian p-value: 0.1197
Sylvilagus brasiliensis Bayesian p-value: 0.1907
Tamandua mexicana Bayesian p-value: 0.5993
Fit statistic:  freeman-tukey 
Important

A Bayesian p-value that around 0.5 indicates adequate model fit, while values less than 0.1 or greater than 0.9 suggest our model does not fit the data well.

Model comparison

Code
# 4. Model comparison -----------------------------------------------------
# Compute Widely Applicable Information Criterion (WAIC)
# Lower values indicate better model fit. 
waicOcc(out.null)
      elpd         pD       WAIC 
-121.23609   19.59305  281.65829 
Code
waicOcc(out.lfMs)
      elpd         pD       WAIC 
-121.31997   17.69835  278.03664 
Code
waicOcc(out.sp)
      elpd         pD       WAIC 
-115.10605   22.28902  274.79013 
Code
waicOcc(out.sp.cat)
      elpd         pD       WAIC 
-108.54514   30.19086  277.47201 

Model comparison as table

Code
# Here we summarize the spatial factor loadings
# summary(out.sp$lambda.samples)

# Resultados --------------------------------------------------------------
# Extraemos lo tabla de valores estimados
modresult <- cbind(as.data.frame(waicOcc(out.null)),
                  as.data.frame(waicOcc(out.sp)),
                  as.data.frame(waicOcc(out.lfMs)),
                  as.data.frame(waicOcc(out.sp.cat)),
                  as.data.frame(waicOcc(out.sp.cat.int)),
                  as.data.frame(waicOcc(out.sp.int)),
                  as.data.frame(waicOcc(out.int))
                  #as.data.frame(waicOcc(out.sp.gaus))
                  )
# View(modresult)
modresult_sorted <- as.data.frame(t(modresult)) |> 
  arrange(WAIC) # sort by
  
DT::datatable(modresult_sorted)
Important

Lower values in WAIC indicate better model fit.

WAIC is the Widely Applicable Information Criterion (Watanabe 2010).

Fit plot

Code
#### fit plot
ppc.df <- data.frame(fit = ppc.out.sp.int$fit.y, 
                     fit.rep = ppc.out.sp.int$fit.y.rep, 
                     color = 'lightskyblue1')

ppc.df$color[ppc.df$fit.rep.1 > ppc.df$fit.1] <- 'lightsalmon'
plot(ppc.df$fit.1, ppc.df$fit.rep.1, bg = ppc.df$color, pch = 21, 
     ylab = 'Fit', xlab = 'True')
lines(ppc.df$fit.1, ppc.df$fit.1, col = 'black')

The most symmetrical, better fit!

The most symmetrical, better fit!

Posterior Summary

Code
# 5. Posterior summaries --------------------------------------------------
# Concise summary of main parameter estimates
summary(out.sp.int, level = 'community')

Call:
sfMsPGOcc(occ.formula = ~scale(elev) + scale(border_dist) * scale(FLII), 
    det.formula = ~scale(effort), data = data_list, cov.model = "exponential", 
    NNGP = TRUE, n.neighbors = 8, n.factors = 3, n.batch = 500, 
    batch.length = 40, n.omp.threads = 6, n.report = 1000, n.burn = 10000, 
    n.thin = 10, n.chains = 3)

Samples per Chain: 20000
Burn-in: 10000
Thinning Rate: 10
Number of Chains: 3
Total Posterior Samples: 3000
Run Time (min): 2.2167

----------------------------------------
    Community Level
----------------------------------------
Occurrence Means (logit scale): 
                                  Mean     SD    2.5%     50%  97.5%   Rhat ESS
(Intercept)                     0.0347 1.7068 -3.2928  0.0401 3.4569 1.3078 152
scale(elev)                     0.3662 1.5609 -2.7882  0.4133 3.4141 1.2637 397
scale(border_dist)             -0.2851 1.5723 -3.2833 -0.3076 2.8422 1.1261 543
scale(FLII)                     0.6821 1.4857 -2.3254  0.7745 3.4956 1.4144 348
scale(border_dist):scale(FLII) -0.0843 1.6004 -3.2935 -0.0689 3.1070 1.1003 467

Occurrence Variances (logit scale): 
                                    Mean         SD   2.5%       50%      97.5%
(Intercept)                      67.7362   188.1779 0.0633    2.5525   577.0594
scale(elev)                     113.0832   384.8076 0.0745    3.1852  1160.6209
scale(border_dist)             3642.4007  4591.2731 0.3169 2150.7025 15213.5290
scale(FLII)                    7769.6349 16332.2163 0.0789   15.5716 55722.9373
scale(border_dist):scale(FLII) 3481.4399  6301.1538 0.0892   23.5940 19888.3211
                                  Rhat ESS
(Intercept)                     4.4640  25
scale(elev)                     1.3383  66
scale(border_dist)              2.7027  17
scale(FLII)                     9.8327   9
scale(border_dist):scale(FLII) 13.4763   9

Detection Means (logit scale): 
                 Mean     SD    2.5%     50%   97.5%   Rhat ESS
(Intercept)   -3.8228 0.3896 -4.5146 -3.8447 -2.9668 1.3545  90
scale(effort)  0.8831 0.4638  0.0992  0.8338  1.8721 1.0173 622

Detection Variances (logit scale): 
                Mean     SD   2.5%    50%  97.5%   Rhat  ESS
(Intercept)   0.2781 0.3091 0.0353 0.1827 1.0978 1.0469 2146
scale(effort) 0.3448 0.4317 0.0360 0.2100 1.5089 1.0040 1439

----------------------------------------
    Spatial Covariance
----------------------------------------
        Mean     SD   2.5%    50%   97.5%   Rhat  ESS
phi-1 9.7113 5.6803 0.5033 9.7773 19.0473 1.0046 1793
phi-2 9.7915 5.5809 0.4915 9.7221 19.0956 0.9998 1805
phi-3 9.8820 5.6167 0.5195 9.7658 19.0940 1.0038 1518
Code
summary(out.sp.int, level = 'species')

Call:
sfMsPGOcc(occ.formula = ~scale(elev) + scale(border_dist) * scale(FLII), 
    det.formula = ~scale(effort), data = data_list, cov.model = "exponential", 
    NNGP = TRUE, n.neighbors = 8, n.factors = 3, n.batch = 500, 
    batch.length = 40, n.omp.threads = 6, n.report = 1000, n.burn = 10000, 
    n.thin = 10, n.chains = 3)

Samples per Chain: 20000
Burn-in: 10000
Thinning Rate: 10
Number of Chains: 3
Total Posterior Samples: 3000
Run Time (min): 2.2167

----------------------------------------
    Species Level
----------------------------------------
Occurrence (logit scale): 
                                                           Mean       SD
(Intercept)-Cuniculus paca                               0.1285   5.8115
(Intercept)-Dasyprocta punctata                         -0.0922   6.9140
(Intercept)-Dasypus novemcinctus                         1.4494   6.4169
(Intercept)-Eira barbara                                 0.0145   6.5150
(Intercept)-Leopardus wiedii                            -2.1737   9.6062
(Intercept)-Mazama americana                             0.4729   6.6668
(Intercept)-Odocoileus virginianus                      -0.5600   7.7680
(Intercept)-Procyon cancrivorus                          3.1057   9.0633
(Intercept)-Pecari tajacu                                0.3082   6.1464
(Intercept)-Sylvilagus brasiliensis                     -1.4300   7.1244
(Intercept)-Tamandua mexicana                            3.0219  10.0869
scale(elev)-Cuniculus paca                               0.8315   8.2113
scale(elev)-Dasyprocta punctata                         -0.0682   7.6537
scale(elev)-Dasypus novemcinctus                         0.6615   7.3394
scale(elev)-Eira barbara                                 3.1122   9.1855
scale(elev)-Leopardus wiedii                            -0.2257  10.3005
scale(elev)-Mazama americana                            -0.2060  12.6630
scale(elev)-Odocoileus virginianus                       1.8484   9.2253
scale(elev)-Procyon cancrivorus                          0.9034   9.0273
scale(elev)-Pecari tajacu                                1.4458   8.6958
scale(elev)-Sylvilagus brasiliensis                     -1.3015  11.6963
scale(elev)-Tamandua mexicana                            2.6374  11.1967
scale(border_dist)-Cuniculus paca                      -52.3480  44.7218
scale(border_dist)-Dasyprocta punctata                 -14.3995  50.2368
scale(border_dist)-Dasypus novemcinctus                -32.9495  52.6405
scale(border_dist)-Eira barbara                        -22.5165  50.6818
scale(border_dist)-Leopardus wiedii                     -2.8785  27.4295
scale(border_dist)-Mazama americana                     12.7485  36.1076
scale(border_dist)-Odocoileus virginianus               55.6519  54.7893
scale(border_dist)-Procyon cancrivorus                  -5.0082  43.0115
scale(border_dist)-Pecari tajacu                       -44.7527  49.1159
scale(border_dist)-Sylvilagus brasiliensis             -20.8111  47.4831
scale(border_dist)-Tamandua mexicana                   -16.0950  41.1418
scale(FLII)-Cuniculus paca                              10.7125  19.3686
scale(FLII)-Dasyprocta punctata                         41.2096  68.8166
scale(FLII)-Dasypus novemcinctus                        43.8993  67.9462
scale(FLII)-Eira barbara                               -21.8577  37.6872
scale(FLII)-Leopardus wiedii                           -67.0754 114.9053
scale(FLII)-Mazama americana                           -17.5959  42.0908
scale(FLII)-Odocoileus virginianus                      -5.8958  17.1950
scale(FLII)-Procyon cancrivorus                         67.5835 116.4684
scale(FLII)-Pecari tajacu                               18.9559  33.2930
scale(FLII)-Sylvilagus brasiliensis                      9.6838  27.4338
scale(FLII)-Tamandua mexicana                           69.3953 109.1034
scale(border_dist):scale(FLII)-Cuniculus paca           -5.8559  24.2163
scale(border_dist):scale(FLII)-Dasyprocta punctata     -46.2640  72.4179
scale(border_dist):scale(FLII)-Dasypus novemcinctus     13.3594  62.0041
scale(border_dist):scale(FLII)-Eira barbara            -35.0221  54.0465
scale(border_dist):scale(FLII)-Leopardus wiedii         17.8221  30.0745
scale(border_dist):scale(FLII)-Mazama americana        -41.2355  65.4718
scale(border_dist):scale(FLII)-Odocoileus virginianus   -2.4098  25.4252
scale(border_dist):scale(FLII)-Procyon cancrivorus      14.1276  34.0738
scale(border_dist):scale(FLII)-Pecari tajacu            -1.2430  29.8488
scale(border_dist):scale(FLII)-Sylvilagus brasiliensis  34.5830  50.9448
scale(border_dist):scale(FLII)-Tamandua mexicana        23.8015  45.1848
                                                            2.5%      50%
(Intercept)-Cuniculus paca                              -11.9088  -0.1150
(Intercept)-Dasyprocta punctata                         -14.1955  -0.2451
(Intercept)-Dasypus novemcinctus                         -9.0397   0.2479
(Intercept)-Eira barbara                                -15.7870   0.0342
(Intercept)-Leopardus wiedii                            -35.7549  -0.4120
(Intercept)-Mazama americana                            -11.4514  -0.1517
(Intercept)-Odocoileus virginianus                      -21.3418  -0.1130
(Intercept)-Procyon cancrivorus                          -5.9263   0.5955
(Intercept)-Pecari tajacu                               -10.4342  -0.1941
(Intercept)-Sylvilagus brasiliensis                     -17.6550  -0.4841
(Intercept)-Tamandua mexicana                            -7.1528   0.3946
scale(elev)-Cuniculus paca                              -17.0031   0.6140
scale(elev)-Dasyprocta punctata                         -20.3413   0.4618
scale(elev)-Dasypus novemcinctus                        -14.6642   0.5100
scale(elev)-Eira barbara                                 -8.1779   1.0536
scale(elev)-Leopardus wiedii                            -24.5696   0.2964
scale(elev)-Mazama americana                            -23.8180   0.0043
scale(elev)-Odocoileus virginianus                      -13.8207   0.8845
scale(elev)-Procyon cancrivorus                         -16.3197   0.6484
scale(elev)-Pecari tajacu                               -15.0998   0.7601
scale(elev)-Sylvilagus brasiliensis                     -33.6405   0.3873
scale(elev)-Tamandua mexicana                           -10.9383   0.7825
scale(border_dist)-Cuniculus paca                      -145.1732 -47.1308
scale(border_dist)-Dasyprocta punctata                 -151.6382  -2.1447
scale(border_dist)-Dasypus novemcinctus                -170.5911 -11.7926
scale(border_dist)-Eira barbara                        -147.4439  -2.9544
scale(border_dist)-Leopardus wiedii                     -68.4942  -1.7251
scale(border_dist)-Mazama americana                     -55.0639   3.5595
scale(border_dist)-Odocoileus virginianus                -2.0866  38.0990
scale(border_dist)-Procyon cancrivorus                 -105.3612  -0.3813
scale(border_dist)-Pecari tajacu                       -164.2540 -31.8151
scale(border_dist)-Sylvilagus brasiliensis             -123.3248  -9.1955
scale(border_dist)-Tamandua mexicana                   -122.6770  -3.0896
scale(FLII)-Cuniculus paca                               -6.4784   2.4671
scale(FLII)-Dasyprocta punctata                          -4.7051   2.9952
scale(FLII)-Dasypus novemcinctus                         -2.4892   3.3322
scale(FLII)-Eira barbara                               -127.7995  -0.3987
scale(FLII)-Leopardus wiedii                           -381.2833  -0.5834
scale(FLII)-Mazama americana                           -157.7090   0.1365
scale(FLII)-Odocoileus virginianus                      -62.4216   0.0729
scale(FLII)-Procyon cancrivorus                          -2.8094   3.7056
scale(FLII)-Pecari tajacu                                -9.7076   2.5501
scale(FLII)-Sylvilagus brasiliensis                     -23.7784   1.2821
scale(FLII)-Tamandua mexicana                            -3.1254   3.1130
scale(border_dist):scale(FLII)-Cuniculus paca           -77.1088  -0.3453
scale(border_dist):scale(FLII)-Dasyprocta punctata     -217.3662  -2.4035
scale(border_dist):scale(FLII)-Dasypus novemcinctus     -86.9709   0.0357
scale(border_dist):scale(FLII)-Eira barbara            -180.3671  -3.6769
scale(border_dist):scale(FLII)-Leopardus wiedii          -7.5411   2.8205
scale(border_dist):scale(FLII)-Mazama americana        -210.7712  -2.2174
scale(border_dist):scale(FLII)-Odocoileus virginianus   -76.0610  -0.0210
scale(border_dist):scale(FLII)-Procyon cancrivorus      -25.4218   0.9792
scale(border_dist):scale(FLII)-Pecari tajacu            -68.4755  -0.7185
scale(border_dist):scale(FLII)-Sylvilagus brasiliensis   -6.3895   2.7735
scale(border_dist):scale(FLII)-Tamandua mexicana        -13.8952   1.9319
                                                          97.5%    Rhat ESS
(Intercept)-Cuniculus paca                              14.2914  1.3302 120
(Intercept)-Dasyprocta punctata                         16.9317  1.2462 157
(Intercept)-Dasypus novemcinctus                        19.4727  2.0337  54
(Intercept)-Eira barbara                                13.7239  1.5479 104
(Intercept)-Leopardus wiedii                             9.8637  2.4668  32
(Intercept)-Mazama americana                            19.5926  1.6924 121
(Intercept)-Odocoileus virginianus                      14.4005  1.3688  49
(Intercept)-Procyon cancrivorus                         31.8191  3.6574  42
(Intercept)-Pecari tajacu                               15.9092  1.4216 187
(Intercept)-Sylvilagus brasiliensis                      8.4410  1.4932 123
(Intercept)-Tamandua mexicana                           34.7583  3.8334  29
scale(elev)-Cuniculus paca                              18.2074  1.1445 410
scale(elev)-Dasyprocta punctata                         14.5142  1.1984 234
scale(elev)-Dasypus novemcinctus                        19.1002  1.1257 224
scale(elev)-Eira barbara                                29.6983  1.1429 100
scale(elev)-Leopardus wiedii                            20.2121  1.2950 168
scale(elev)-Mazama americana                            28.1360  1.1780 103
scale(elev)-Odocoileus virginianus                      30.2602  1.5359  55
scale(elev)-Procyon cancrivorus                         22.0564  1.2840 176
scale(elev)-Pecari tajacu                               23.4001  1.1479 132
scale(elev)-Sylvilagus brasiliensis                     12.9862  1.6397  48
scale(elev)-Tamandua mexicana                           36.4809  1.2191  50
scale(border_dist)-Cuniculus paca                       -0.0757  4.6969  13
scale(border_dist)-Dasyprocta punctata                  59.5883  1.2450  17
scale(border_dist)-Dasypus novemcinctus                 37.4078  2.5371  13
scale(border_dist)-Eira barbara                         60.5108  5.5456  12
scale(border_dist)-Leopardus wiedii                     47.5984  1.1755  47
scale(border_dist)-Mazama americana                     95.7851  1.6744  29
scale(border_dist)-Odocoileus virginianus              179.9594  4.2405  15
scale(border_dist)-Procyon cancrivorus                  80.5566  1.4810  20
scale(border_dist)-Pecari tajacu                        12.7698  3.1100  13
scale(border_dist)-Sylvilagus brasiliensis              75.7036  5.1870  16
scale(border_dist)-Tamandua mexicana                    49.8549  2.1643  20
scale(FLII)-Cuniculus paca                              71.2619  5.0187  27
scale(FLII)-Dasyprocta punctata                        218.1066 14.6166   4
scale(FLII)-Dasypus novemcinctus                       222.2690 17.0369   5
scale(FLII)-Eira barbara                                 8.7810 14.3170   9
scale(FLII)-Leopardus wiedii                             7.5726 15.7782   6
scale(FLII)-Mazama americana                            18.9586  7.7861   8
scale(FLII)-Odocoileus virginianus                      13.5548  4.6623  36
scale(FLII)-Procyon cancrivorus                        403.2815 13.5270   8
scale(FLII)-Pecari tajacu                              118.1408  8.1458  14
scale(FLII)-Sylvilagus brasiliensis                     96.5400  4.2003  15
scale(FLII)-Tamandua mexicana                          368.4235 18.1521   3
scale(border_dist):scale(FLII)-Cuniculus paca           34.5213  3.9841  26
scale(border_dist):scale(FLII)-Dasyprocta punctata       4.5522 20.2011   7
scale(border_dist):scale(FLII)-Dasypus novemcinctus    199.8337  3.6583   7
scale(border_dist):scale(FLII)-Eira barbara              3.8675 17.9067   5
scale(border_dist):scale(FLII)-Leopardus wiedii        100.7958 12.1614  18
scale(border_dist):scale(FLII)-Mazama americana          7.7684 17.5503  10
scale(border_dist):scale(FLII)-Odocoileus virginianus   55.3728  2.0702  24
scale(border_dist):scale(FLII)-Procyon cancrivorus     118.4681  6.7018  15
scale(border_dist):scale(FLII)-Pecari tajacu            72.2252  1.3297  18
scale(border_dist):scale(FLII)-Sylvilagus brasiliensis 149.5253 21.6157  11
scale(border_dist):scale(FLII)-Tamandua mexicana       160.6895 10.5184   9

Detection (logit scale): 
                                         Mean     SD    2.5%     50%   97.5%
(Intercept)-Cuniculus paca            -3.5400 0.4995 -4.4172 -3.5714 -2.4334
(Intercept)-Dasyprocta punctata       -3.8193 0.4994 -4.7595 -3.8148 -2.7898
(Intercept)-Dasypus novemcinctus      -4.0507 0.5595 -5.2079 -4.0416 -2.9743
(Intercept)-Eira barbara              -3.8360 0.4968 -4.7793 -3.8375 -2.7811
(Intercept)-Leopardus wiedii          -3.9816 0.5532 -5.0851 -3.9709 -2.8569
(Intercept)-Mazama americana          -4.0725 0.5689 -5.2756 -4.0420 -2.9731
(Intercept)-Odocoileus virginianus    -3.7784 0.4996 -4.7633 -3.7841 -2.7348
(Intercept)-Procyon cancrivorus       -4.0626 0.5521 -5.1945 -4.0466 -2.9903
(Intercept)-Pecari tajacu             -3.5309 0.4856 -4.4167 -3.5573 -2.5106
(Intercept)-Sylvilagus brasiliensis   -3.8499 0.5324 -4.9173 -3.8562 -2.7583
(Intercept)-Tamandua mexicana         -3.8808 0.5199 -4.9453 -3.8786 -2.8111
scale(effort)-Cuniculus paca           1.0773 0.6992 -0.0495  0.9817  2.7469
scale(effort)-Dasyprocta punctata      0.8922 0.6334 -0.2040  0.8330  2.3154
scale(effort)-Dasypus novemcinctus     0.7646 0.6232 -0.3652  0.7187  2.1189
scale(effort)-Eira barbara             0.9867 0.6590 -0.1218  0.9227  2.5481
scale(effort)-Leopardus wiedii         0.8934 0.6592 -0.2148  0.8228  2.3471
scale(effort)-Mazama americana         0.8611 0.6388 -0.2520  0.7922  2.2898
scale(effort)-Odocoileus virginianus   1.0251 0.6896 -0.0764  0.9271  2.6584
scale(effort)-Procyon cancrivorus      0.7791 0.6209 -0.2675  0.7216  2.1504
scale(effort)-Pecari tajacu            0.9160 0.6460 -0.1770  0.8483  2.4082
scale(effort)-Sylvilagus brasiliensis  0.9701 0.6795 -0.1510  0.8927  2.5413
scale(effort)-Tamandua mexicana        0.6955 0.5803 -0.2932  0.6316  1.9774
                                        Rhat  ESS
(Intercept)-Cuniculus paca            1.1659  114
(Intercept)-Dasyprocta punctata       1.2688  134
(Intercept)-Dasypus novemcinctus      1.1612  159
(Intercept)-Eira barbara              1.1982  147
(Intercept)-Leopardus wiedii          1.1087  235
(Intercept)-Mazama americana          1.1953  185
(Intercept)-Odocoileus virginianus    1.1368  198
(Intercept)-Procyon cancrivorus       1.1788  152
(Intercept)-Pecari tajacu             1.1362  182
(Intercept)-Sylvilagus brasiliensis   1.1765  152
(Intercept)-Tamandua mexicana         1.1602  107
scale(effort)-Cuniculus paca          1.0194  849
scale(effort)-Dasyprocta punctata     1.0194  803
scale(effort)-Dasypus novemcinctus    1.0056  961
scale(effort)-Eira barbara            1.0207  938
scale(effort)-Leopardus wiedii        1.0175  853
scale(effort)-Mazama americana        1.0394  820
scale(effort)-Odocoileus virginianus  1.0165  830
scale(effort)-Procyon cancrivorus     1.0046 1041
scale(effort)-Pecari tajacu           1.0082  906
scale(effort)-Sylvilagus brasiliensis 1.0025  866
scale(effort)-Tamandua mexicana       1.0042 1154

----------------------------------------
    Spatial Covariance
----------------------------------------
        Mean     SD   2.5%    50%   97.5%   Rhat  ESS
phi-1 9.7113 5.6803 0.5033 9.7773 19.0473 1.0046 1793
phi-2 9.7915 5.5809 0.4915 9.7221 19.0956 0.9998 1805
phi-3 9.8820 5.6167 0.5195 9.7658 19.0940 1.0038 1518
Code
summary(out.sp.int, level = 'both')

Call:
sfMsPGOcc(occ.formula = ~scale(elev) + scale(border_dist) * scale(FLII), 
    det.formula = ~scale(effort), data = data_list, cov.model = "exponential", 
    NNGP = TRUE, n.neighbors = 8, n.factors = 3, n.batch = 500, 
    batch.length = 40, n.omp.threads = 6, n.report = 1000, n.burn = 10000, 
    n.thin = 10, n.chains = 3)

Samples per Chain: 20000
Burn-in: 10000
Thinning Rate: 10
Number of Chains: 3
Total Posterior Samples: 3000
Run Time (min): 2.2167

----------------------------------------
    Community Level
----------------------------------------
Occurrence Means (logit scale): 
                                  Mean     SD    2.5%     50%  97.5%   Rhat ESS
(Intercept)                     0.0347 1.7068 -3.2928  0.0401 3.4569 1.3078 152
scale(elev)                     0.3662 1.5609 -2.7882  0.4133 3.4141 1.2637 397
scale(border_dist)             -0.2851 1.5723 -3.2833 -0.3076 2.8422 1.1261 543
scale(FLII)                     0.6821 1.4857 -2.3254  0.7745 3.4956 1.4144 348
scale(border_dist):scale(FLII) -0.0843 1.6004 -3.2935 -0.0689 3.1070 1.1003 467

Occurrence Variances (logit scale): 
                                    Mean         SD   2.5%       50%      97.5%
(Intercept)                      67.7362   188.1779 0.0633    2.5525   577.0594
scale(elev)                     113.0832   384.8076 0.0745    3.1852  1160.6209
scale(border_dist)             3642.4007  4591.2731 0.3169 2150.7025 15213.5290
scale(FLII)                    7769.6349 16332.2163 0.0789   15.5716 55722.9373
scale(border_dist):scale(FLII) 3481.4399  6301.1538 0.0892   23.5940 19888.3211
                                  Rhat ESS
(Intercept)                     4.4640  25
scale(elev)                     1.3383  66
scale(border_dist)              2.7027  17
scale(FLII)                     9.8327   9
scale(border_dist):scale(FLII) 13.4763   9

Detection Means (logit scale): 
                 Mean     SD    2.5%     50%   97.5%   Rhat ESS
(Intercept)   -3.8228 0.3896 -4.5146 -3.8447 -2.9668 1.3545  90
scale(effort)  0.8831 0.4638  0.0992  0.8338  1.8721 1.0173 622

Detection Variances (logit scale): 
                Mean     SD   2.5%    50%  97.5%   Rhat  ESS
(Intercept)   0.2781 0.3091 0.0353 0.1827 1.0978 1.0469 2146
scale(effort) 0.3448 0.4317 0.0360 0.2100 1.5089 1.0040 1439

----------------------------------------
    Species Level
----------------------------------------
Occurrence (logit scale): 
                                                           Mean       SD
(Intercept)-Cuniculus paca                               0.1285   5.8115
(Intercept)-Dasyprocta punctata                         -0.0922   6.9140
(Intercept)-Dasypus novemcinctus                         1.4494   6.4169
(Intercept)-Eira barbara                                 0.0145   6.5150
(Intercept)-Leopardus wiedii                            -2.1737   9.6062
(Intercept)-Mazama americana                             0.4729   6.6668
(Intercept)-Odocoileus virginianus                      -0.5600   7.7680
(Intercept)-Procyon cancrivorus                          3.1057   9.0633
(Intercept)-Pecari tajacu                                0.3082   6.1464
(Intercept)-Sylvilagus brasiliensis                     -1.4300   7.1244
(Intercept)-Tamandua mexicana                            3.0219  10.0869
scale(elev)-Cuniculus paca                               0.8315   8.2113
scale(elev)-Dasyprocta punctata                         -0.0682   7.6537
scale(elev)-Dasypus novemcinctus                         0.6615   7.3394
scale(elev)-Eira barbara                                 3.1122   9.1855
scale(elev)-Leopardus wiedii                            -0.2257  10.3005
scale(elev)-Mazama americana                            -0.2060  12.6630
scale(elev)-Odocoileus virginianus                       1.8484   9.2253
scale(elev)-Procyon cancrivorus                          0.9034   9.0273
scale(elev)-Pecari tajacu                                1.4458   8.6958
scale(elev)-Sylvilagus brasiliensis                     -1.3015  11.6963
scale(elev)-Tamandua mexicana                            2.6374  11.1967
scale(border_dist)-Cuniculus paca                      -52.3480  44.7218
scale(border_dist)-Dasyprocta punctata                 -14.3995  50.2368
scale(border_dist)-Dasypus novemcinctus                -32.9495  52.6405
scale(border_dist)-Eira barbara                        -22.5165  50.6818
scale(border_dist)-Leopardus wiedii                     -2.8785  27.4295
scale(border_dist)-Mazama americana                     12.7485  36.1076
scale(border_dist)-Odocoileus virginianus               55.6519  54.7893
scale(border_dist)-Procyon cancrivorus                  -5.0082  43.0115
scale(border_dist)-Pecari tajacu                       -44.7527  49.1159
scale(border_dist)-Sylvilagus brasiliensis             -20.8111  47.4831
scale(border_dist)-Tamandua mexicana                   -16.0950  41.1418
scale(FLII)-Cuniculus paca                              10.7125  19.3686
scale(FLII)-Dasyprocta punctata                         41.2096  68.8166
scale(FLII)-Dasypus novemcinctus                        43.8993  67.9462
scale(FLII)-Eira barbara                               -21.8577  37.6872
scale(FLII)-Leopardus wiedii                           -67.0754 114.9053
scale(FLII)-Mazama americana                           -17.5959  42.0908
scale(FLII)-Odocoileus virginianus                      -5.8958  17.1950
scale(FLII)-Procyon cancrivorus                         67.5835 116.4684
scale(FLII)-Pecari tajacu                               18.9559  33.2930
scale(FLII)-Sylvilagus brasiliensis                      9.6838  27.4338
scale(FLII)-Tamandua mexicana                           69.3953 109.1034
scale(border_dist):scale(FLII)-Cuniculus paca           -5.8559  24.2163
scale(border_dist):scale(FLII)-Dasyprocta punctata     -46.2640  72.4179
scale(border_dist):scale(FLII)-Dasypus novemcinctus     13.3594  62.0041
scale(border_dist):scale(FLII)-Eira barbara            -35.0221  54.0465
scale(border_dist):scale(FLII)-Leopardus wiedii         17.8221  30.0745
scale(border_dist):scale(FLII)-Mazama americana        -41.2355  65.4718
scale(border_dist):scale(FLII)-Odocoileus virginianus   -2.4098  25.4252
scale(border_dist):scale(FLII)-Procyon cancrivorus      14.1276  34.0738
scale(border_dist):scale(FLII)-Pecari tajacu            -1.2430  29.8488
scale(border_dist):scale(FLII)-Sylvilagus brasiliensis  34.5830  50.9448
scale(border_dist):scale(FLII)-Tamandua mexicana        23.8015  45.1848
                                                            2.5%      50%
(Intercept)-Cuniculus paca                              -11.9088  -0.1150
(Intercept)-Dasyprocta punctata                         -14.1955  -0.2451
(Intercept)-Dasypus novemcinctus                         -9.0397   0.2479
(Intercept)-Eira barbara                                -15.7870   0.0342
(Intercept)-Leopardus wiedii                            -35.7549  -0.4120
(Intercept)-Mazama americana                            -11.4514  -0.1517
(Intercept)-Odocoileus virginianus                      -21.3418  -0.1130
(Intercept)-Procyon cancrivorus                          -5.9263   0.5955
(Intercept)-Pecari tajacu                               -10.4342  -0.1941
(Intercept)-Sylvilagus brasiliensis                     -17.6550  -0.4841
(Intercept)-Tamandua mexicana                            -7.1528   0.3946
scale(elev)-Cuniculus paca                              -17.0031   0.6140
scale(elev)-Dasyprocta punctata                         -20.3413   0.4618
scale(elev)-Dasypus novemcinctus                        -14.6642   0.5100
scale(elev)-Eira barbara                                 -8.1779   1.0536
scale(elev)-Leopardus wiedii                            -24.5696   0.2964
scale(elev)-Mazama americana                            -23.8180   0.0043
scale(elev)-Odocoileus virginianus                      -13.8207   0.8845
scale(elev)-Procyon cancrivorus                         -16.3197   0.6484
scale(elev)-Pecari tajacu                               -15.0998   0.7601
scale(elev)-Sylvilagus brasiliensis                     -33.6405   0.3873
scale(elev)-Tamandua mexicana                           -10.9383   0.7825
scale(border_dist)-Cuniculus paca                      -145.1732 -47.1308
scale(border_dist)-Dasyprocta punctata                 -151.6382  -2.1447
scale(border_dist)-Dasypus novemcinctus                -170.5911 -11.7926
scale(border_dist)-Eira barbara                        -147.4439  -2.9544
scale(border_dist)-Leopardus wiedii                     -68.4942  -1.7251
scale(border_dist)-Mazama americana                     -55.0639   3.5595
scale(border_dist)-Odocoileus virginianus                -2.0866  38.0990
scale(border_dist)-Procyon cancrivorus                 -105.3612  -0.3813
scale(border_dist)-Pecari tajacu                       -164.2540 -31.8151
scale(border_dist)-Sylvilagus brasiliensis             -123.3248  -9.1955
scale(border_dist)-Tamandua mexicana                   -122.6770  -3.0896
scale(FLII)-Cuniculus paca                               -6.4784   2.4671
scale(FLII)-Dasyprocta punctata                          -4.7051   2.9952
scale(FLII)-Dasypus novemcinctus                         -2.4892   3.3322
scale(FLII)-Eira barbara                               -127.7995  -0.3987
scale(FLII)-Leopardus wiedii                           -381.2833  -0.5834
scale(FLII)-Mazama americana                           -157.7090   0.1365
scale(FLII)-Odocoileus virginianus                      -62.4216   0.0729
scale(FLII)-Procyon cancrivorus                          -2.8094   3.7056
scale(FLII)-Pecari tajacu                                -9.7076   2.5501
scale(FLII)-Sylvilagus brasiliensis                     -23.7784   1.2821
scale(FLII)-Tamandua mexicana                            -3.1254   3.1130
scale(border_dist):scale(FLII)-Cuniculus paca           -77.1088  -0.3453
scale(border_dist):scale(FLII)-Dasyprocta punctata     -217.3662  -2.4035
scale(border_dist):scale(FLII)-Dasypus novemcinctus     -86.9709   0.0357
scale(border_dist):scale(FLII)-Eira barbara            -180.3671  -3.6769
scale(border_dist):scale(FLII)-Leopardus wiedii          -7.5411   2.8205
scale(border_dist):scale(FLII)-Mazama americana        -210.7712  -2.2174
scale(border_dist):scale(FLII)-Odocoileus virginianus   -76.0610  -0.0210
scale(border_dist):scale(FLII)-Procyon cancrivorus      -25.4218   0.9792
scale(border_dist):scale(FLII)-Pecari tajacu            -68.4755  -0.7185
scale(border_dist):scale(FLII)-Sylvilagus brasiliensis   -6.3895   2.7735
scale(border_dist):scale(FLII)-Tamandua mexicana        -13.8952   1.9319
                                                          97.5%    Rhat ESS
(Intercept)-Cuniculus paca                              14.2914  1.3302 120
(Intercept)-Dasyprocta punctata                         16.9317  1.2462 157
(Intercept)-Dasypus novemcinctus                        19.4727  2.0337  54
(Intercept)-Eira barbara                                13.7239  1.5479 104
(Intercept)-Leopardus wiedii                             9.8637  2.4668  32
(Intercept)-Mazama americana                            19.5926  1.6924 121
(Intercept)-Odocoileus virginianus                      14.4005  1.3688  49
(Intercept)-Procyon cancrivorus                         31.8191  3.6574  42
(Intercept)-Pecari tajacu                               15.9092  1.4216 187
(Intercept)-Sylvilagus brasiliensis                      8.4410  1.4932 123
(Intercept)-Tamandua mexicana                           34.7583  3.8334  29
scale(elev)-Cuniculus paca                              18.2074  1.1445 410
scale(elev)-Dasyprocta punctata                         14.5142  1.1984 234
scale(elev)-Dasypus novemcinctus                        19.1002  1.1257 224
scale(elev)-Eira barbara                                29.6983  1.1429 100
scale(elev)-Leopardus wiedii                            20.2121  1.2950 168
scale(elev)-Mazama americana                            28.1360  1.1780 103
scale(elev)-Odocoileus virginianus                      30.2602  1.5359  55
scale(elev)-Procyon cancrivorus                         22.0564  1.2840 176
scale(elev)-Pecari tajacu                               23.4001  1.1479 132
scale(elev)-Sylvilagus brasiliensis                     12.9862  1.6397  48
scale(elev)-Tamandua mexicana                           36.4809  1.2191  50
scale(border_dist)-Cuniculus paca                       -0.0757  4.6969  13
scale(border_dist)-Dasyprocta punctata                  59.5883  1.2450  17
scale(border_dist)-Dasypus novemcinctus                 37.4078  2.5371  13
scale(border_dist)-Eira barbara                         60.5108  5.5456  12
scale(border_dist)-Leopardus wiedii                     47.5984  1.1755  47
scale(border_dist)-Mazama americana                     95.7851  1.6744  29
scale(border_dist)-Odocoileus virginianus              179.9594  4.2405  15
scale(border_dist)-Procyon cancrivorus                  80.5566  1.4810  20
scale(border_dist)-Pecari tajacu                        12.7698  3.1100  13
scale(border_dist)-Sylvilagus brasiliensis              75.7036  5.1870  16
scale(border_dist)-Tamandua mexicana                    49.8549  2.1643  20
scale(FLII)-Cuniculus paca                              71.2619  5.0187  27
scale(FLII)-Dasyprocta punctata                        218.1066 14.6166   4
scale(FLII)-Dasypus novemcinctus                       222.2690 17.0369   5
scale(FLII)-Eira barbara                                 8.7810 14.3170   9
scale(FLII)-Leopardus wiedii                             7.5726 15.7782   6
scale(FLII)-Mazama americana                            18.9586  7.7861   8
scale(FLII)-Odocoileus virginianus                      13.5548  4.6623  36
scale(FLII)-Procyon cancrivorus                        403.2815 13.5270   8
scale(FLII)-Pecari tajacu                              118.1408  8.1458  14
scale(FLII)-Sylvilagus brasiliensis                     96.5400  4.2003  15
scale(FLII)-Tamandua mexicana                          368.4235 18.1521   3
scale(border_dist):scale(FLII)-Cuniculus paca           34.5213  3.9841  26
scale(border_dist):scale(FLII)-Dasyprocta punctata       4.5522 20.2011   7
scale(border_dist):scale(FLII)-Dasypus novemcinctus    199.8337  3.6583   7
scale(border_dist):scale(FLII)-Eira barbara              3.8675 17.9067   5
scale(border_dist):scale(FLII)-Leopardus wiedii        100.7958 12.1614  18
scale(border_dist):scale(FLII)-Mazama americana          7.7684 17.5503  10
scale(border_dist):scale(FLII)-Odocoileus virginianus   55.3728  2.0702  24
scale(border_dist):scale(FLII)-Procyon cancrivorus     118.4681  6.7018  15
scale(border_dist):scale(FLII)-Pecari tajacu            72.2252  1.3297  18
scale(border_dist):scale(FLII)-Sylvilagus brasiliensis 149.5253 21.6157  11
scale(border_dist):scale(FLII)-Tamandua mexicana       160.6895 10.5184   9

Detection (logit scale): 
                                         Mean     SD    2.5%     50%   97.5%
(Intercept)-Cuniculus paca            -3.5400 0.4995 -4.4172 -3.5714 -2.4334
(Intercept)-Dasyprocta punctata       -3.8193 0.4994 -4.7595 -3.8148 -2.7898
(Intercept)-Dasypus novemcinctus      -4.0507 0.5595 -5.2079 -4.0416 -2.9743
(Intercept)-Eira barbara              -3.8360 0.4968 -4.7793 -3.8375 -2.7811
(Intercept)-Leopardus wiedii          -3.9816 0.5532 -5.0851 -3.9709 -2.8569
(Intercept)-Mazama americana          -4.0725 0.5689 -5.2756 -4.0420 -2.9731
(Intercept)-Odocoileus virginianus    -3.7784 0.4996 -4.7633 -3.7841 -2.7348
(Intercept)-Procyon cancrivorus       -4.0626 0.5521 -5.1945 -4.0466 -2.9903
(Intercept)-Pecari tajacu             -3.5309 0.4856 -4.4167 -3.5573 -2.5106
(Intercept)-Sylvilagus brasiliensis   -3.8499 0.5324 -4.9173 -3.8562 -2.7583
(Intercept)-Tamandua mexicana         -3.8808 0.5199 -4.9453 -3.8786 -2.8111
scale(effort)-Cuniculus paca           1.0773 0.6992 -0.0495  0.9817  2.7469
scale(effort)-Dasyprocta punctata      0.8922 0.6334 -0.2040  0.8330  2.3154
scale(effort)-Dasypus novemcinctus     0.7646 0.6232 -0.3652  0.7187  2.1189
scale(effort)-Eira barbara             0.9867 0.6590 -0.1218  0.9227  2.5481
scale(effort)-Leopardus wiedii         0.8934 0.6592 -0.2148  0.8228  2.3471
scale(effort)-Mazama americana         0.8611 0.6388 -0.2520  0.7922  2.2898
scale(effort)-Odocoileus virginianus   1.0251 0.6896 -0.0764  0.9271  2.6584
scale(effort)-Procyon cancrivorus      0.7791 0.6209 -0.2675  0.7216  2.1504
scale(effort)-Pecari tajacu            0.9160 0.6460 -0.1770  0.8483  2.4082
scale(effort)-Sylvilagus brasiliensis  0.9701 0.6795 -0.1510  0.8927  2.5413
scale(effort)-Tamandua mexicana        0.6955 0.5803 -0.2932  0.6316  1.9774
                                        Rhat  ESS
(Intercept)-Cuniculus paca            1.1659  114
(Intercept)-Dasyprocta punctata       1.2688  134
(Intercept)-Dasypus novemcinctus      1.1612  159
(Intercept)-Eira barbara              1.1982  147
(Intercept)-Leopardus wiedii          1.1087  235
(Intercept)-Mazama americana          1.1953  185
(Intercept)-Odocoileus virginianus    1.1368  198
(Intercept)-Procyon cancrivorus       1.1788  152
(Intercept)-Pecari tajacu             1.1362  182
(Intercept)-Sylvilagus brasiliensis   1.1765  152
(Intercept)-Tamandua mexicana         1.1602  107
scale(effort)-Cuniculus paca          1.0194  849
scale(effort)-Dasyprocta punctata     1.0194  803
scale(effort)-Dasypus novemcinctus    1.0056  961
scale(effort)-Eira barbara            1.0207  938
scale(effort)-Leopardus wiedii        1.0175  853
scale(effort)-Mazama americana        1.0394  820
scale(effort)-Odocoileus virginianus  1.0165  830
scale(effort)-Procyon cancrivorus     1.0046 1041
scale(effort)-Pecari tajacu           1.0082  906
scale(effort)-Sylvilagus brasiliensis 1.0025  866
scale(effort)-Tamandua mexicana       1.0042 1154

----------------------------------------
    Spatial Covariance
----------------------------------------
        Mean     SD   2.5%    50%   97.5%   Rhat  ESS
phi-1 9.7113 5.6803 0.5033 9.7773 19.0473 1.0046 1793
phi-2 9.7915 5.5809 0.4915 9.7221 19.0956 0.9998 1805
phi-3 9.8820 5.6167 0.5195 9.7658 19.0940 1.0038 1518

Bayesian p-values can be inspected to check for lack of fit (overall or by species). Lack of fit at significance level = 0.05 is indicated by Bayesian p-values below 0.025 or greater than 0.975. The overall Bayesian p-value (Bpvalue) indicates no problems with lack of fit. Likewise, species-level Bayesian p-values (Bpvalue_species) indicate no lack of fit for any species.

Gelman and Rubin’s convergence diagnostic: Approximate convergence is diagnosed when the upper limit is close to 1.

Convergence is diagnosed when the chains have ‘forgotten’ their initial values, and the output from all chains is indistinguishable. The gelman.diag diagnostic is applied to a single variable from the chain. It is based a comparison of within-chain and between-chain variances, and is similar to a classical analysis of variance.

Values substantially above 1 indicate lack of convergence.

Model Diagnostics

Code
#| eval: true
#| echo: true
#| code-fold: true
#| warning: false
#| message: false
# Extract posterior draws for later use
posterior1 <- as.array(out.sp)

# Trace plots to check chain mixing. Extract posterior samples and bind in a single matrix.
POSTERIOR.MATRIX <- cbind(out.sp$alpha.comm.samples, 
                          out.sp$beta.comm.samples,  
                          out.sp$alpha.samples, 
                          out.sp$beta.samples)

# Matrix output is all chains combined, split into 3 chains.
CHAIN.1 <- as.mcmc(POSTERIOR.MATRIX[1:1000,])
CHAIN.2 <- as.mcmc(POSTERIOR.MATRIX[1001:2000,])
CHAIN.3 <- as.mcmc(POSTERIOR.MATRIX[2001:3000,])
# CHAIN.4 <- as.mcmc(POSTERIOR.MATRIX[8001:10000,])

# Bind four chains as coda mcmc.list object.
POSTERIOR.CHAINS <- mcmc.list(CHAIN.1, CHAIN.2, CHAIN.3)#, CHAIN.4)

# Create an empty folder.
# dir.create ("Beetle_plots")

# Plot chain mixing of each parameter to a multi-panel plot and save to the new folder. ART 5 mins

######################################
#### SAVE Diagnostics at PDF
# MCMCtrace(POSTERIOR.CHAINS, params = "all", Rhat = TRUE, n.eff = TRUE)#, pdf = TRUE, filename = "Beetle_240909_traceplots.pdf", wd = "Beetle_plots")



#mcmc_trace(fit.commu, parms = c("beta.ranef.cont.border_dist.mean"))

#posterior2 <- extract(fit.commu, inc_warmup = TRUE, permuted = FALSE)

#color_scheme_set("mix-blue-pink")
#p <- mcmc_trace(posterior1,  pars = c("mu", "tau"), n_warmup = 300,
#                facet_args = list(nrow = 2, labeller = label_parsed))
#p + facet_text(size = 15)



#outMCMC <- fit.commu #Convert output to MCMC object
#diagnostics chains 

# all as pdf
# MCMCtrace(outMCMC)

# MCMCtrace(outMCMC, params = c("alpha0"), type = 'trace', Rhat = TRUE, n.eff = TRUE)

# MCMCtrace(outMCMC, params = c("beta0"), type = 'trace', Rhat = TRUE, n.eff = TRUE)

# MCMCtrace(outMCMC, params = c("beta.ranef.cont.border_dist"), type = 'trace', Rhat = TRUE, n.eff = TRUE)

# MCMCtrace(out.sp, params = c("beta.ranef.cont.border_dist.mean"), type = 'trace', pdf = F, Rhat = TRUE, n.eff = TRUE)

# MCMCtrace(outMCMC, params = c("beta.ranef.cont.elev"), type = 'trace', Rhat = TRUE, n.eff = TRUE)

# MCMCtrace(outMCMC, params = c("beta.ranef.cont.elev.mean"), type = 'trace', pdf = F, Rhat = TRUE, n.eff = TRUE)


### density
# MCMCtrace(outMCMC, params = c("Nspecies"), ISB = FALSE, pdf = F, exact = TRUE, post_zm = TRUE, type = 'density', Rhat = TRUE, n.eff = TRUE, ind = TRUE)

### density
# MCMCtrace(outMCMC, params = c("beta.ranef.cont.elev.mean"), ISB = FALSE, pdf = F, exact = TRUE, post_zm = TRUE, type = 'density', Rhat = TRUE, n.eff = TRUE, ind = TRUE)

### density
#MCMCtrace(outMCMC, params = c("beta.ranef.cont.border_dist.mean"), ISB = FALSE, pdf = F, exact = TRUE, post_zm = TRUE, type = 'density', Rhat = TRUE, n.eff = TRUE, ind = TRUE)

#coda::gelman.diag(outMCMC,  multivariate = FALSE, transform=FALSE)
                    
# coda::gelman.plot(outMCMC,  multivariate = FALSE)



# 
# mcmc_intervals(outMCMC, pars = c("Nspecies_in_AP[1]",
#                                  "Nspecies_in_AP[2]"),
#                point_est = "mean",
#                prob = 0.75, prob_outer = 0.95) +
#   ggtitle("Number of species") + 
#   scale_y_discrete(labels = c("Nspecies_in_AP[1]"=levels(sitecovs$in_AP)[1],
#              "Nspecies_in_AP[2]"=levels(sitecovs$in_AP)[2]))
# 
# #Continuous
# p <- mcmc_intervals(outMCMC, 
#                pars = c("beta.ranef.cont.border_dist.mean",
#                          #"beta.ranef.cont.elev.mean",
#                         "beta.ranef.categ.in_AP.mean[2]"))
# 
# # relabel parameters
# p + scale_y_discrete(
#   labels = c("beta.ranef.cont.border_dist.mean"="Dist_border",
#                          #"beta.ranef.cont.elev.mean"="Elevation",
#                         "beta.ranef.categ.in_AP.mean[2]"="in_AP")
# ) +
#   ggtitle("Treatment effect on all species")
# 

Posterior Summary (effect)

Community effects

Code
# Create simple plot summaries using MCMCvis package.
# Detection covariate effects --------- 
MCMCplot(out.int$alpha.comm.samples, ref_ovl = TRUE, ci = c(50, 95))
# Occupancy community-level effects 
MCMCplot(out.int$beta.comm.samples, ref_ovl = TRUE, ci = c(50, 95))
(a) Detection
(b) Occupancy
Figure 1: Community effects

Species effects

Code
# Occupancy species-level effects 
MCMCplot(out.int$beta.samples[,12:22], ref_ovl = TRUE, ci = c(50, 95))

# Occupancy species-level effects 
MCMCplot(out.int$beta.samples[,23:33], ref_ovl = TRUE, ci = c(50, 95))

# Occupancy species-level effects 
MCMCplot(out.int$beta.samples[,34:44], ref_ovl = TRUE, ci = c(50, 95))
(a) elevation
(b) distance border
(c) FLII
Figure 2: Species effects

Species effects using bayesplot

Code
library(bayesplot)
#mcmc_areas(outMCMC, regex_pars = "Nspecies_in_AP")
# mcmc_areas(outMCMC, regex_pars = "Nspecies_in_AP")

mcmc_intervals(out.int$beta.samples[,12:22] , point_est = "mean",
               prob = 0.75, prob_outer = 0.95) + 
  geom_vline(xintercept = 0, color = "red", linetype = "dashed", size = 0.5)
Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
ℹ Please use `linewidth` instead.

Code
mcmc_intervals(out.int$beta.samples[,23:33] , point_est = "mean",
               prob = 0.75, prob_outer = 0.95) + 
  geom_vline(xintercept = 0, color = "red", linetype = "dashed", size = 0.5)

Code
mcmc_intervals(out.int$beta.samples[,34:44] , point_est = "mean",
               prob = 0.75, prob_outer = 0.95) + 
  geom_vline(xintercept = 0, color = "red", linetype = "dashed", size = 0.5)

Prediction as graph

This prediction uses the non spatial model

Code
# 6. Prediction -----------------------------------------------------------
# Predict occupancy along a gradient of elev   
# Create a set of values across the range of observed elev values
elev.pred.vals <- seq(min(data_list$occ.covs$elev), 
                              max(data_list$occ.covs$elev), 
                              length.out = 100)
# Scale predicted values by mean and standard deviation used to fit the model
elev.pred.vals.scale <- (elev.pred.vals - mean(data_list$occ.covs$elev)) / 
                             sd(data_list$occ.covs$elev)
# Create a set of values across the range of observed elev values
border_dist.pred.vals <- seq(min(data_list$occ.covs$border_dist), 
                              max(data_list$occ.covs$border_dist), 
                              length.out = 100)
# Scale predicted values by mean and standard deviation used to fit the model
border_dist.pred.vals.scale <- (border_dist.pred.vals -
                                  mean(data_list$occ.covs$border_dist)) /
                                  sd(data_list$occ.covs$border_dist)

# Create a set of values across the range of observed FLII values
FLII.pred.vals <- seq(min(data_list$occ.covs$FLII), 
                              max(data_list$occ.covs$FLII), 
                              length.out = 100)
# Scale predicted values by mean and standard deviation used to fit the model
FLII.pred.vals.scale <- (FLII.pred.vals -
                                  mean(data_list$occ.covs$FLII)) /
                                  sd(data_list$occ.covs$FLII)

# Predict occupancy across elev  values at mean values of all other variables
pred.df1 <- as.matrix(data.frame(intercept = 1, 
                                 elev = elev.pred.vals.scale, 
                                 border_dist = 0,
                                 FLII=0))#, catchment = 0, density = 0, 
                         # slope = 0))
# Predict occupancy across elev  values at mean values of all other variables
pred.df2 <- as.matrix(data.frame(intercept = 1, elev = 0, 
                         border_dist = border_dist.pred.vals.scale,
                         FLII= 0 ))#, catchment = 0, density = 0, 
                         # slope = 0))
# Predict occupancy across elev  values at mean values of all other variables
pred.df3 <- as.matrix(data.frame(intercept = 1, elev = 0, 
                         border_dist = 0,
                         FLII= FLII.pred.vals.scale ))#, catchment = 0, density = 0, 
                         # slope = 0))

out.pred1 <- predict(out.null, pred.df1) # using non spatial
str(out.pred1)
List of 3
 $ psi.0.samples: num [1:1500, 1:11, 1:100] 0.011057 0.000118 0.001325 0.003053 0.133451 ...
 $ z.0.samples  : int [1:1500, 1:11, 1:100] 0 0 0 0 0 0 0 0 0 0 ...
 $ call         : language predict.msPGOcc(object = out.null, X.0 = pred.df1)
 - attr(*, "class")= chr "predict.msPGOcc"
Code
psi.0.quants <- apply(out.pred1$psi.0.samples, c(2, 3), quantile, 
                          prob = c(0.025, 0.5, 0.975))
sp.codes <- attr(data_list$y, "dimnames")[[1]]
psi.plot.dat <- data.frame(psi.med = c(t(psi.0.quants[2, , ])), 
                                 psi.low = c(t(psi.0.quants[1, , ])), 
                                 psi.high = c(t(psi.0.quants[3, , ])), 
                           elev = elev.pred.vals, 
                                 sp.codes = rep(sp.codes, 
                                                each = length(elev.pred.vals)))

ggplot(psi.plot.dat, aes(x = elev, y = psi.med)) + 
  geom_ribbon(aes(ymin = psi.low, ymax = psi.high), fill = 'grey70') +
  geom_line() + 
  facet_wrap(vars(sp.codes)) + 
  theme_bw() + 
  labs(x = 'elevation (m)', y = 'Occupancy Probability') 

Code
out.pred2 <- predict(out.null, pred.df2) # using non spatial
str(out.pred2)
List of 3
 $ psi.0.samples: num [1:1500, 1:11, 1:100] 0.0482 0.0247 0.1353 0.0377 0.4753 ...
 $ z.0.samples  : int [1:1500, 1:11, 1:100] 0 0 0 0 1 0 0 0 0 1 ...
 $ call         : language predict.msPGOcc(object = out.null, X.0 = pred.df2)
 - attr(*, "class")= chr "predict.msPGOcc"
Code
psi.0.quants <- apply(out.pred2$psi.0.samples, c(2, 3), quantile, 
                          prob = c(0.025, 0.5, 0.975))
sp.codes <- attr(data_list$y, "dimnames")[[1]]
psi.plot.dat <- data.frame(psi.med = c(t(psi.0.quants[2, , ])), 
                                 psi.low = c(t(psi.0.quants[1, , ])), 
                                 psi.high = c(t(psi.0.quants[3, , ])), 
                           border_dist = border_dist.pred.vals, 
                                 sp.codes = rep(sp.codes, 
                                                each = length(border_dist.pred.vals)))

ggplot(psi.plot.dat, aes(x = border_dist/1000, y = psi.med)) + 
  geom_ribbon(aes(ymin = psi.low, ymax = psi.high), fill = 'grey70') +
  geom_line() + 
  facet_wrap(vars(sp.codes)) + 
  theme_bw() + 
  labs(x = 'border_dist (Km)', y = 'Occupancy Probability') 

Code
out.pred3 <- predict(out.null, pred.df3) # using non spatial
str(out.pred3)
List of 3
 $ psi.0.samples: num [1:1500, 1:11, 1:100] 0.05316 0.0031 0.00968 0.01705 0.05886 ...
 $ z.0.samples  : int [1:1500, 1:11, 1:100] 0 0 0 0 0 0 0 0 0 0 ...
 $ call         : language predict.msPGOcc(object = out.null, X.0 = pred.df3)
 - attr(*, "class")= chr "predict.msPGOcc"
Code
psi.0.quants <- apply(out.pred3$psi.0.samples, c(2, 3), quantile, 
                          prob = c(0.025, 0.5, 0.975))
sp.codes <- attr(data_list$y, "dimnames")[[1]]
psi.plot.dat <- data.frame(psi.med = c(t(psi.0.quants[2, , ])), 
                                 psi.low = c(t(psi.0.quants[1, , ])), 
                                 psi.high = c(t(psi.0.quants[3, , ])), 
                           FLII = FLII.pred.vals, 
                                 sp.codes = rep(sp.codes, 
                                                each = length(FLII.pred.vals)))

ggplot(psi.plot.dat, aes(x = FLII/1000, y = psi.med)) + 
  geom_ribbon(aes(ymin = psi.low, ymax = psi.high), fill = 'grey70') +
  geom_line() + 
  facet_wrap(vars(sp.codes)) + 
  theme_bw() + 
  labs(x = 'FLII', y = 'Occupancy Probability') 

Spatial Prediction in FLII

Code
#aggregate  resolution to (factor = 3)
#transform coord data to UTM
elevation_UTM <- project(elevation_16, "EPSG:10603")
elevation_17.aggregate <- aggregate(elevation_UTM, fact=10)
res(elevation_17.aggregate)

FLII_UTM <- project(FLII2016, "EPSG:10603") |> crop(elevation_UTM)
# Calculate the min of non-NA values
# na.rm = TRUE is essential to ignore NAs when calculating the mean
min_val <- global(FLII_UTM, "min", na.rm = TRUE, na.policy = "only")[1, 1]
# Replace NA values with the calculated min
FLII_UTM[is.na(FLII_UTM)] <- min_val

FLII_UTM.aggregate <- aggregate(FLII_UTM, fact=10)
res(FLII_UTM.aggregate)

# Convert the SpatRaster to a data frame with coordinates
df_coords <- as.data.frame(FLII_UTM.aggregate, xy = TRUE)
names(df_coords) <-c("X","Y","FLII")

FLII.pred <- (df_coords$FLII - mean(data_list$occ.covs$FLII)) / sd(data_list$occ.covs$FLII)


############### Predict new data ############### 
# we predict at one covariate varing and others at mean value = 0
# intercept = 1, elev = 0, border_dist = 0, FLII= 0
# in that order
################ ################ ################ 
predict_data <- cbind(1, 0, 0, FLII.pred)
colnames(predict_data) <- c("intercept",
                            "elev",
                            "border_dist",
                            "FLII" )

# X.0 <- cbind(1, 1, elev.pred)#, elev.pred^2)

# coords.0 <- as.matrix(hbefElev[, c('Easting', 'Northing')])
out.sp.ms.pred <- predict(out.sp, 
                          X.0=predict_data, 
                          df_coords[,1:2],
                          threads=4) #Warning :'threads' is not an argument

# extract the array of interest= occupancy
predicted_array <- out.sp.ms.pred$psi.0.samples



dim(predicted_array)
# df_plot <- NA # empty column
predicted_raster_list <- list() # rast(nrows = 52, ncols = 103,
                         #ext(elevation_17.aggregate), 
                         # crs = "EPSG:32717")

###################################################
# simpler way to make mean in the array by species
# array order: itera=3000, sp=22, pixels=5202
# we wan to keep index 2 and 3
library(plyr)
aresult = (plyr::aaply(predicted_array, # mean fo all iterations
                       c(2,3), 
                       mean))

##############################################
#### Loop to make rasters and put in a list
# array order: itera=3000, sp=22, pixels=5202
for (i in 1:dim(predicted_array)[2]){
 # Convert array slice to data frame
 # df_plot[i] <- as.data.frame(predicted_array[1, i, ]) # sp_i
 # df_plot[i] <- as.vector(aresult[i,]) # Extract sp
 # Producing an SDM for all (posterior mean)
 plot.dat <- data.frame(x = df_coords$X, 
                        y = df_coords$Y, 
                        psi.sp = as.vector(aresult[i,]))
 pred_rast <- rast(plot.dat, 
                   type = "xyz", 
                   crs = "EPSG:10603") # Replace EPSG:4326 with your CRS
 predicted_raster_list[[i]] <- pred_rast
}

# Convert the list to a SpatRaster stack
predictad_raster_stack <- rast(predicted_raster_list)
# put species names
names(predictad_raster_stack) <- selected.sp

plot(predictad_raster_stack)

# get the mean
predicted_mean <- mean(predictad_raster_stack)

plot(predicted_mean, main="mean occupancy")

mapview(predicted_mean) + mapview(AP_Machalilla_UTM_line)
# 

Package Citation

Code
pkgs <- cite_packages(output = "paragraph", pkgs="Session", out.dir = ".")
# knitr::kable(pkgs)
pkgs

We used R v. 4.4.2 (R Core Team 2024) and the following R packages: abind v. 1.4.8 (Plate and Heiberger 2024), bayesplot v. 1.14.0 (Gabry et al. 2019; Gabry and Mahr 2025), beepr v. 2.0 (Bååth 2024), camtrapR v. 3.0.0 (Niedballa et al. 2016), coda v. 0.19.4.1 (Plummer et al. 2006), DT v. 0.34.0 (Xie et al. 2025), elevatr v. 0.99.0 (Hollister et al. 2023), maps v. 3.4.3 (Becker et al. 2025), mapview v. 2.11.4 (Appelhans et al. 2025), MCMCvis v. 0.16.3 (Youngflesh 2018), sf v. 1.0.21 (Pebesma 2018; Pebesma and Bivand 2023), snow v. 0.4.4 (Tierney et al. 2021), snowfall v. 1.84.6.3 (Knaus 2023), spOccupancy v. 0.8.0 (Doser et al. 2022, 2024; Doser, Finley, and Banerjee 2023), terra v. 1.8.70 (Hijmans 2025), tictoc v. 1.2.1 (Izrailev 2024), tidyverse v. 2.0.0 (Wickham et al. 2019), tmap v. 4.2 (Tennekes 2018).

Sesion info

Code
print(sessionInfo(), locale = FALSE)
R version 4.4.2 (2024-10-31 ucrt)
Platform: x86_64-w64-mingw32/x64
Running under: Windows 10 x64 (build 19045)

Matrix products: internal


attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
 [1] abind_1.4-8       lubridate_1.9.4   forcats_1.0.0     stringr_1.5.2    
 [5] dplyr_1.1.4       purrr_1.1.0       readr_2.1.5       tidyr_1.3.1      
 [9] tibble_3.2.1      ggplot2_4.0.0     tidyverse_2.0.0   spOccupancy_0.8.0
[13] camtrapR_3.0.0    snowfall_1.84-6.3 snow_0.4-4        beepr_2.0        
[17] coda_0.19-4.1     MCMCvis_0.16.3    tictoc_1.2.1      bayesplot_1.14.0 
[21] elevatr_0.99.0    terra_1.8-70      tmap_4.2          maps_3.4.3       
[25] mapview_2.11.4    sf_1.0-21         DT_0.34.0         readxl_1.4.3     
[29] grateful_0.3.0   

loaded via a namespace (and not attached):
  [1] RColorBrewer_1.1-3      tensorA_0.36.2.1        rstudioapi_0.17.1      
  [4] audio_0.1-11            jsonlite_2.0.0          wk_0.9.4               
  [7] magrittr_2.0.3          farver_2.1.2            nloptr_2.1.1           
 [10] rmarkdown_2.30          vctrs_0.6.5             minqa_1.2.8            
 [13] base64enc_0.1-3         RcppNumerical_0.6-0     progress_1.2.3         
 [16] htmltools_0.5.8.1       leafsync_0.1.0          distributional_0.5.0   
 [19] curl_7.0.0              raster_3.6-32           cellranger_1.1.0       
 [22] s2_1.1.9                sass_0.4.10             bslib_0.9.0            
 [25] slippymath_0.3.1        KernSmooth_2.23-24      htmlwidgets_1.6.4      
 [28] plyr_1.8.9              cachem_1.1.0            stars_0.6-8            
 [31] uuid_1.2-1              mime_0.13               lifecycle_1.0.4        
 [34] iterators_1.0.14        pkgconfig_2.0.3         cols4all_0.8-1         
 [37] Matrix_1.7-1            R6_2.6.1                fastmap_1.2.0          
 [40] shiny_1.9.1             digest_0.6.37           colorspace_2.1-1       
 [43] leafem_0.2.4            crosstalk_1.2.1         labeling_0.4.3         
 [46] lwgeom_0.2-14           progressr_0.15.0        spacesXYZ_1.6-0        
 [49] timechange_0.3.0        httr_1.4.7              mgcv_1.9-1             
 [52] compiler_4.4.2          microbenchmark_1.5.0    proxy_0.4-27           
 [55] bit64_4.5.2             withr_3.0.2             doParallel_1.0.17      
 [58] backports_1.5.0         brew_1.0-10             S7_0.2.1               
 [61] DBI_1.2.3               logger_0.4.0            MASS_7.3-61            
 [64] maptiles_0.10.0         tmaptools_3.3           leaflet_2.2.3          
 [67] classInt_0.4-11         tools_4.4.2             units_0.8-7            
 [70] leaflegend_1.2.1        httpuv_1.6.16           glue_1.8.0             
 [73] satellite_1.0.5         nlme_3.1-166            promises_1.3.3         
 [76] grid_4.4.2              checkmate_2.3.2         reshape2_1.4.4         
 [79] generics_0.1.3          leaflet.providers_2.0.0 gtable_0.3.6           
 [82] tzdb_0.4.0              shinyBS_0.61.1          class_7.3-22           
 [85] data.table_1.17.8       hms_1.1.3               sp_2.2-0               
 [88] RANN_2.6.2              foreach_1.5.2           pillar_1.11.1          
 [91] vroom_1.6.5             posterior_1.6.1         later_1.4.2            
 [94] splines_4.4.2           lattice_0.22-6          bit_4.5.0.1            
 [97] tidyselect_1.2.1        knitr_1.50              svglite_2.1.3          
[100] stats4_4.4.2            xfun_0.52               shinydashboard_0.7.3   
[103] leafpop_0.1.0           stringi_1.8.4           yaml_2.3.10            
[106] boot_1.3-31             evaluate_1.0.4          codetools_0.2-20       
[109] archive_1.1.12          cli_3.6.5               RcppParallel_5.1.9     
[112] systemfonts_1.1.0       xtable_1.8-4            jquerylib_0.1.4        
[115] secr_5.1.0              dichromat_2.0-0.1       Rcpp_1.1.0             
[118] spAbundance_0.2.1       png_0.1-8               XML_3.99-0.18          
[121] parallel_4.4.2          prettyunits_1.2.0       lme4_1.1-35.5          
[124] mvtnorm_1.3-2           scales_1.4.0            e1071_1.7-16           
[127] crayon_1.5.3            rlang_1.1.6            

References

Appelhans, Tim, Florian Detsch, Christoph Reudenbach, and Stefan Woellauer. 2025. mapview: Interactive Viewing of Spatial Data in r. https://CRAN.R-project.org/package=mapview.
Bååth, Rasmus. 2024. beepr: Easily Play Notification Sounds on Any Platform. https://CRAN.R-project.org/package=beepr.
Becker, Richard A., Allan R. Wilks, Ray Brownrigg, Thomas P. Minka, and Alex Deckmyn. 2025. maps: Draw Geographical Maps. https://CRAN.R-project.org/package=maps.
Doser, Jeffrey W., Andrew O. Finley, and Sudipto Banerjee. 2023. “Joint Species Distribution Models with Imperfect Detection for High-Dimensional Spatial Data.” Ecology, e4137. https://doi.org/10.1002/ecy.4137.
Doser, Jeffrey W., Andrew O. Finley, Marc Kéry, and Elise F. Zipkin. 2022. spOccupancy: An r Package for Single-Species, Multi-Species, and Integrated Spatial Occupancy Models.” Methods in Ecology and Evolution 13: 1670–78. https://doi.org/10.1111/2041-210X.13897.
Doser, Jeffrey W., Andrew O. Finley, Sarah P. Saunders, Marc Kéry, Aaron S. Weed, and Elise F. Zipkin. 2024. “Modeling Complex Species-Environment Relationships Through Spatially-Varying Coefficient Occupancy Models.” Journal of Agricultural, Biological, and Environmental Statistics. https://doi.org/10.1007/s13253-023-00595-6.
Gabry, Jonah, and Tristan Mahr. 2025. bayesplot: Plotting for Bayesian Models.” https://mc-stan.org/bayesplot/.
Gabry, Jonah, Daniel Simpson, Aki Vehtari, Michael Betancourt, and Andrew Gelman. 2019. “Visualization in Bayesian Workflow.” J. R. Stat. Soc. A 182: 389–402. https://doi.org/10.1111/rssa.12378.
Hijmans, Robert J. 2025. terra: Spatial Data Analysis. https://CRAN.R-project.org/package=terra.
Hollister, Jeffrey, Tarak Shah, Jakub Nowosad, Alec L. Robitaille, Marcus W. Beck, and Mike Johnson. 2023. elevatr: Access Elevation Data from Various APIs. https://doi.org/10.5281/zenodo.8335450.
Izrailev, Sergei. 2024. tictoc: Functions for Timing r Scripts, as Well as Implementations of Stack and StackList Structures. https://CRAN.R-project.org/package=tictoc.
Knaus, Jochen. 2023. snowfall: Easier Cluster Computing (Based on snow). https://CRAN.R-project.org/package=snowfall.
Niedballa, Jürgen, Rahel Sollmann, Alexandre Courtiol, and Andreas Wilting. 2016. camtrapR: An r Package for Efficient Camera Trap Data Management.” Methods in Ecology and Evolution 7 (12): 1457–62. https://doi.org/10.1111/2041-210X.12600.
Pebesma, Edzer. 2018. Simple Features for R: Standardized Support for Spatial Vector Data.” The R Journal 10 (1): 439–46. https://doi.org/10.32614/RJ-2018-009.
Pebesma, Edzer, and Roger Bivand. 2023. Spatial Data Science: With applications in R. Chapman and Hall/CRC. https://doi.org/10.1201/9780429459016.
Plate, Tony, and Richard Heiberger. 2024. abind: Combine Multidimensional Arrays. https://CRAN.R-project.org/package=abind.
Plummer, Martyn, Nicky Best, Kate Cowles, and Karen Vines. 2006. CODA: Convergence Diagnosis and Output Analysis for MCMC.” R News 6 (1): 7–11. https://journal.r-project.org/archive/.
R Core Team. 2024. R: A Language and Environment for Statistical Computing. Vienna, Austria: R Foundation for Statistical Computing. https://www.R-project.org/.
Tennekes, Martijn. 2018. tmap: Thematic Maps in R.” Journal of Statistical Software 84 (6): 1–39. https://doi.org/10.18637/jss.v084.i06.
Tierney, Luke, A. J. Rossini, Na Li, and H. Sevcikova. 2021. snow: Simple Network of Workstations. https://CRAN.R-project.org/package=snow.
Wickham, Hadley, Mara Averick, Jennifer Bryan, Winston Chang, Lucy D’Agostino McGowan, Romain François, Garrett Grolemund, et al. 2019. “Welcome to the tidyverse.” Journal of Open Source Software 4 (43): 1686. https://doi.org/10.21105/joss.01686.
Xie, Yihui, Joe Cheng, Xianying Tan, and Garrick Aden-Buie. 2025. DT: A Wrapper of the JavaScript Library DataTables. https://CRAN.R-project.org/package=DT.
Youngflesh, Casey. 2018. MCMCvis: Tools to Visualize, Manipulate, and Summarize MCMC Output.” Journal of Open Source Software 3 (24): 640. https://doi.org/10.21105/joss.00640.

Reuse

Citation

BibTeX citation:
@online{forero2025,
  author = {Forero, German and Wallace, Robert and Zapara-Rios, Galo and
    Isasi-Catalá, Emiliana and J. Lizcano, Diego},
  title = {Machalilla {Spatial} {Factor} {Multi-Species} {Occupancy}
    {Model}},
  date = {2025-08-16},
  url = {https://dlizcano.github.io/Occu_APs_all/blog/2025-11-06-Machalilla/},
  langid = {en}
}
For attribution, please cite this work as:
Forero, German, Robert Wallace, Galo Zapara-Rios, Emiliana Isasi-Catalá, and Diego J. Lizcano. 2025. “Machalilla Spatial Factor Multi-Species Occupancy Model.” August 16, 2025. https://dlizcano.github.io/Occu_APs_all/blog/2025-11-06-Machalilla/.