Fitting a Spatial Factor Multi-Species Occupancy Model

Data from: Yasuni, Tamshiyacu-Tahuayo, Madidi, Plantas-Putumayo, Llanganates

model
code
analysis
453 sites, 24 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="_"))
60 cameras in Cameras. 
 60 cameras in Deployment. 
 60 deployments in Deployment. 
 60 points in Deployment. 
 51 cameras in Images. 
 51 points in Images. 
[1] "dates ok"
year: 2024 
 Jaguar_Design: no year: 2023 
 Jaguar_Design: no 
Code
# 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) 
Code
  # 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 = "-")))
65 cameras in Cameras. 
 61 cameras in Deployment. 
 61 deployments in Deployment. 
 31 points in Deployment. 
 61 cameras in Images. 
 31 points in Images. 
[1] "dates ok"
year: 2005 
 Jaguar_Design: yes 
Code
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 = "-")))
60 cameras in Cameras. 
 52 cameras in Deployment. 
 52 deployments in Deployment. 
 30 points in Deployment. 
 51 cameras in Images. 
 30 points in Images. 
[1] "dates ok"
year: 2005 
 Jaguar_Design: yes 
Code
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 = "-")))
47 cameras in Cameras. 
 44 cameras in Deployment. 
 44 deployments in Deployment. 
 26 points in Deployment. 
 44 cameras in Images. 
 26 points in Images. 
[1] "dates ok"
year: 2009 
 Jaguar_Design: yes 
Code
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 = "-")))
29 cameras in Cameras. 
 22 cameras in Deployment. 
 22 deployments in Deployment. 
 15 points in Deployment. 
 22 cameras in Images. 
 15 points in Images. 
[1] "dates ok"
year: 2009 
 Jaguar_Design: yes 
Code
# 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")
50 cameras in Cameras. 
 50 cameras in Deployment. 
 50 deployments in Deployment. 
 50 points in Deployment. 
 50 cameras in Images. 
 50 points in Images. 
[1] "dates ok"
year: 2015 
 Jaguar_Design: no 
Code
Per_Tahuayo <- loadproject("F:/WCS-CameraTrap/data/BDcorregidas/Peru/PER-003_BD_ACRCTT_T0.xlsx")
85 cameras in Cameras. 
 84 cameras in Deployment. 
 84 deployments in Deployment. 
 84 points in Deployment. 
 84 cameras in Images. 
 84 points in Images. 
[1] "dates ok"
year: 2016 
 Jaguar_Design: no 
Code
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="_"))
28 cameras in Cameras. 
 28 cameras in Deployment. 
 28 deployments in Deployment. 
 28 points in Deployment. 
 28 cameras in Images. 
 28 points in Images. 
[1] "dates ok"
year: 2015 
 Jaguar_Design: no 
Code
Ecu_17 <- loadproject("F:/WCS-CameraTrap/data/BDcorregidas/Ecuador/ECU-017.xlsx") |> mutate(array_locID=paste("Ecu_17", locationID, sep="_"))
30 cameras in Cameras. 
 30 cameras in Deployment. 
 30 deployments in Deployment. 
 30 points in Deployment. 
 30 cameras in Images. 
 30 points in Images. 
[1] "dates ok"
year: 2015 
 Jaguar_Design: no 
Code
Ecu_18 <- loadproject("F:/WCS-CameraTrap/data/BDcorregidas/Ecuador/ECU-018.xlsx")|> mutate(array_locID=paste("Ecu_18", locationID, sep="_"))
30 cameras in Cameras. 
 30 cameras in Deployment. 
 30 deployments in Deployment. 
 30 points in Deployment. 
 30 cameras in Images. 
 30 points in Images. 
[1] "dates ok"
year: 2016 
 Jaguar_Design: no 
Code
Ecu_20 <- loadproject("F:/WCS-CameraTrap/data/BDcorregidas/Ecuador/ECU-020_Fix.xlsx")|> mutate(array_locID=paste("Ecu_20", locationID, sep="_"))
30 cameras in Cameras. 
 25 cameras in Deployment. 
 25 deployments in Deployment. 
 25 points in Deployment. 
 25 cameras in Images. 
 25 points in Images. 
[1] "dates ok"
year: 2018 
 Jaguar_Design: no 
Code
# 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="_"))
30 cameras in Cameras. 
 30 cameras in Deployment. 
 30 deployments in Deployment. 
 30 points in Deployment. 
 30 cameras in Images. 
 30 points in Images. 
[1] "dates ok"
year: 2018 
 Jaguar_Design: no 
Code
# 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") ) #+
Code
  # 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
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="_"))
29 cameras in Cameras. 
 29 cameras in Deployment. 
 29 deployments in Deployment. 
 29 points in Deployment. 
 29 cameras in Images. 
 29 points in Images. 
[1] "dates ok"
year: 2015 
 Jaguar_Design: no 
Code
Ecu_15 <- loadproject("F:/WCS-CameraTrap/data/BDcorregidas/Ecuador/ECU-015.xlsx")|> mutate(array_locID=paste("Ecu_15", locationID, sep="_"))
29 cameras in Cameras. 
 29 cameras in Deployment. 
 30 deployments in Deployment. 
 30 points in Deployment. 
 30 cameras in Images. 
 30 points in Images. 
[1] "dates ok"
year: 2016 
 Jaguar_Design: no 
Code
Ecu_16 <- loadproject("F:/WCS-CameraTrap/data/BDcorregidas/Ecuador/ECU-016.xlsx")|> mutate(array_locID=paste("Ecu_16", locationID, sep="_"))
29 cameras in Cameras. 
 28 cameras in Deployment. 
 28 deployments in Deployment. 
 28 points in Deployment. 
 28 cameras in Images. 
 28 points in Images. 
[1] "dates ok"
year: 2016 
 Jaguar_Design: no 
Code
# 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 = 7)) #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")) 

Pacoche 2014 data

Here we use the tables Pacoche_DL_CT-RVP-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 <- rbind(Ecu_full, 
                   Per_full,
                   Bol_full,
                   Col_18,
                   Ecu_Llanganates)


# fix date format
# 
# 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$"Date_Time_Captured", "%Y/%m/%d")
data_full$eventDate <- format(data_full$eventDate, "%Y-%m-%d")

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

###############################
# 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,]

# M3-19: M3-21: M4-10: M4-12: M4-18:  From Madidi
CToperation <- CToperation[-c(379, 373, 365, 362, 357),]

CToperation[231,3] <- "-4.482831" #Latitude
CToperation[93,3] <- "-0.5548211" #Latitude
CToperation[93,2] <- "-76.48333"

# duplicated in llanganates
CToperation <- CToperation[-464,] 

### 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,]


DetHist_list <- lapply(unique(data_full$scientificName), FUN = function(x) {
  detectionHistory(
    recordTable         = data_full, # abla de registros
    camOp                = camop, # Matriz de operación de cámaras
    stationCol           = "Camera_Id",
    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       = 7, # 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_Madidi_UTM <- st_transform(Madidi_NP, "EPSG:10603")
# Convert to LINESTRING
AP_Madidi_UTM_line <- st_cast(AP_Madidi_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 <- st_union(
                             AP_Yasuni_UTM,
                             AP_Tahuayo_UTM,
                             AP_Madidi_UTM,
                             AP_PlantasMed_UTM,
                             AP_Llanganates_UTM
                             )
Warning: attribute variables are assumed to be spatially constant throughout
all geometries
Code
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")
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:514] 443 387 592 543 498 396 521 498 451 498 ...
Code
# extract in AP
data_full_sf$in_AP = as.factor(st_intersects(data_full_sf, AP_Tahuayo, 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:514] 9.57 9.65 9.69 9.66 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)

# 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_Tahuayo_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",           
"Dasyprocta fuliginosa",      
"Dasypus sp." ,    
"Didelphis marsupialis",    
"Eira barbara",  
"Herpailurus yagouaroundi",
"Leopardus pardalis",    
"Leopardus tigrinus" ,
"Leopardus wiedii",         
"Mazama americana",
"Mazama nemorivaga",
#"Mitu tuberosum" ,
"Myoprocta pratti",
"Myrmecophaga tridactyla",
"Nasua nasua" ,
# "Mazama americana",         
# "Myotis myotis",           
# "Nasua narica",             
# "Odocoileus virginianus",   
"Panthera onca" ,
# "Procyon cancrivorus" ,
"Pecari tajacu",    
#"Penelope jacquacu" ,
"Priodontes maximus" ,
"Procyon cancrivorous",      
# "Psophia leucoptera",
"Puma concolor" ,
"Puma yagouaroundi",        
# "Rattus rattus" ,
# "Roedor sp.",
# "Sciurus sp.",       
# "Sus scrofa",               
# "Sylvilagus brasiliensis",  
"Tamandua tetradactyla",   
"Tapirus pinchaque" ,
"Tapirus terrestris",
"Tayassu pecari"
#"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 514 sites and 26 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): 8.0132

----------------------------------------
    Community Level
----------------------------------------
Occurrence Means (logit scale): 
                      Mean     SD    2.5%     50%   97.5%   Rhat  ESS
(Intercept)        -2.2596 0.3276 -2.8779 -2.2661 -1.6074 1.0130  466
scale(elev)        -0.1377 0.1258 -0.3947 -0.1316  0.1005 1.0003 1119
scale(border_dist) -0.3171 0.2006 -0.7093 -0.3166  0.0903 0.9997 1108
scale(FLII)         0.5788 0.1486  0.3138  0.5704  0.8834 1.0000  798

Occurrence Variances (logit scale): 
                     Mean     SD   2.5%    50%  97.5%   Rhat ESS
(Intercept)        2.3858 0.9118 1.1155 2.2242 4.5899 1.0137 365
scale(elev)        0.2647 0.1250 0.1061 0.2383 0.5825 1.0095 852
scale(border_dist) 0.9089 0.3700 0.4169 0.8401 1.8540 1.0059 404
scale(FLII)        0.3373 0.1719 0.1159 0.3000 0.7606 1.0242 599

Detection Means (logit scale): 
                 Mean     SD    2.5%     50%   97.5%   Rhat  ESS
(Intercept)   -2.2066 0.2451 -2.7153 -2.1947 -1.7512 1.0244  391
scale(effort)  0.3968 0.0618  0.2790  0.3962  0.5237 1.0083 1043

Detection Variances (logit scale): 
                Mean     SD   2.5%    50%  97.5%   Rhat  ESS
(Intercept)   1.2408 0.5145 0.5317 1.1353 2.5814 1.0159  114
scale(effort) 0.0438 0.0231 0.0167 0.0386 0.1077 1.0009 1265
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 514 sites and 26 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): 8.0493

----------------------------------------
    Community Level
----------------------------------------
Occurrence Means (logit scale): 
                      Mean     SD    2.5%     50%   97.5%   Rhat  ESS
(Intercept)        -2.2145 0.3258 -2.8672 -2.2070 -1.6044 1.0080  277
scale(elev)        -0.1452 0.1262 -0.3880 -0.1422  0.0951 1.0028 1166
scale(border_dist) -0.2996 0.1987 -0.7043 -0.3019  0.0874 1.0050  932
scale(FLII)         0.5892 0.1446  0.3137  0.5857  0.8809 1.0262  783

Occurrence Variances (logit scale): 
                     Mean     SD   2.5%    50%  97.5%   Rhat  ESS
(Intercept)        2.2033 0.7936 1.0753 2.0716 4.1523 1.0029  288
scale(elev)        0.2625 0.1223 0.1007 0.2388 0.5752 1.0115 1052
scale(border_dist) 0.8658 0.3467 0.3951 0.7970 1.7400 1.0121  668
scale(FLII)        0.3336 0.1603 0.1146 0.2980 0.6974 1.0017  820

Detection Means (logit scale): 
                 Mean     SD    2.5%     50%   97.5%   Rhat  ESS
(Intercept)   -2.2273 0.2644 -2.8186 -2.2186 -1.7652 1.0113  229
scale(effort)  0.3946 0.0632  0.2735  0.3946  0.5236 1.0002 1225

Detection Variances (logit scale): 
                Mean     SD   2.5%    50%  97.5%   Rhat  ESS
(Intercept)   1.4133 0.6534 0.5698 1.2546 3.0496 1.0315   81
scale(effort) 0.0451 0.0256 0.0163 0.0389 0.1130 1.0256 1207
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 = 600, 
                      batch.length = 25, # iter=600*25
                      n.thin = 10, 
                      n.burn = 5000, 
                      n.chains = 3,
                      NNGP = TRUE,
                      n.factors = 5, # balance of rare sp. and run time
                      n.neighbors = 15,
                      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 514 sites and 26 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 5 latent spatial factors.
Using 15 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()
2026.45 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 = 5, # balance of rare sp. and run time
                      n.neighbors = 15,
                      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 514 sites and 26 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 5 latent spatial factors.
Using 15 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()
2165.27 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)

# 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.3503 

----------------------------------------
    Species Level
----------------------------------------
Atelocynus microtis Bayesian p-value: 0.3393
Coendou prehensilis Bayesian p-value: 0.5927
Cuniculus paca Bayesian p-value: 0
Dasyprocta fuliginosa Bayesian p-value: 0.004
Dasypus sp. Bayesian p-value: 0.1447
Didelphis marsupialis Bayesian p-value: 0.4413
Eira barbara Bayesian p-value: 0.83
Herpailurus yagouaroundi Bayesian p-value: 0.484
Leopardus pardalis Bayesian p-value: 0.3373
Leopardus tigrinus Bayesian p-value: 0.1767
Leopardus wiedii Bayesian p-value: 0.3773
Mazama americana Bayesian p-value: 0.0667
Mazama nemorivaga Bayesian p-value: 0.508
Myoprocta pratti Bayesian p-value: 0.1567
Myrmecophaga tridactyla Bayesian p-value: 0.36
Nasua nasua Bayesian p-value: 0.4233
Panthera onca Bayesian p-value: 0.4273
Pecari tajacu Bayesian p-value: 0.1787
Priodontes maximus Bayesian p-value: 0.4893
Procyon cancrivorous Bayesian p-value: 0.5093
Puma concolor Bayesian p-value: 0.3
Puma yagouaroundi Bayesian p-value: 0.6573
Tamandua tetradactyla Bayesian p-value: 0.6213
Tapirus pinchaque Bayesian p-value: 0.326
Tapirus terrestris Bayesian p-value: 0.0773
Tayassu pecari Bayesian p-value: 0.278
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.3578 

----------------------------------------
    Species Level
----------------------------------------
Atelocynus microtis Bayesian p-value: 0.3407
Coendou prehensilis Bayesian p-value: 0.654
Cuniculus paca Bayesian p-value: 7e-04
Dasyprocta fuliginosa Bayesian p-value: 0.0033
Dasypus sp. Bayesian p-value: 0.1667
Didelphis marsupialis Bayesian p-value: 0.4733
Eira barbara Bayesian p-value: 0.8233
Herpailurus yagouaroundi Bayesian p-value: 0.5153
Leopardus pardalis Bayesian p-value: 0.3613
Leopardus tigrinus Bayesian p-value: 0.1807
Leopardus wiedii Bayesian p-value: 0.3487
Mazama americana Bayesian p-value: 0.0607
Mazama nemorivaga Bayesian p-value: 0.4507
Myoprocta pratti Bayesian p-value: 0.1567
Myrmecophaga tridactyla Bayesian p-value: 0.346
Nasua nasua Bayesian p-value: 0.4873
Panthera onca Bayesian p-value: 0.4173
Pecari tajacu Bayesian p-value: 0.1773
Priodontes maximus Bayesian p-value: 0.4773
Procyon cancrivorous Bayesian p-value: 0.5133
Puma concolor Bayesian p-value: 0.32
Puma yagouaroundi Bayesian p-value: 0.6973
Tamandua tetradactyla Bayesian p-value: 0.6353
Tapirus pinchaque Bayesian p-value: 0.332
Tapirus terrestris Bayesian p-value: 0.0847
Tayassu pecari Bayesian p-value: 0.2787
Fit statistic:  freeman-tukey 
Code
summary(ppc.out.sp)

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

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

----------------------------------------
    Community Level
----------------------------------------
Bayesian p-value:  0.3551 

----------------------------------------
    Species Level
----------------------------------------
Atelocynus microtis Bayesian p-value: 0.3693
Coendou prehensilis Bayesian p-value: 0.606
Cuniculus paca Bayesian p-value: 3e-04
Dasyprocta fuliginosa Bayesian p-value: 0.004
Dasypus sp. Bayesian p-value: 0.1583
Didelphis marsupialis Bayesian p-value: 0.4627
Eira barbara Bayesian p-value: 0.9203
Herpailurus yagouaroundi Bayesian p-value: 0.5553
Leopardus pardalis Bayesian p-value: 0.2847
Leopardus tigrinus Bayesian p-value: 0.211
Leopardus wiedii Bayesian p-value: 0.3317
Mazama americana Bayesian p-value: 0.056
Mazama nemorivaga Bayesian p-value: 0.6297
Myoprocta pratti Bayesian p-value: 0.1477
Myrmecophaga tridactyla Bayesian p-value: 0.2463
Nasua nasua Bayesian p-value: 0.4297
Panthera onca Bayesian p-value: 0.43
Pecari tajacu Bayesian p-value: 0.1147
Priodontes maximus Bayesian p-value: 0.5587
Procyon cancrivorous Bayesian p-value: 0.4907
Puma concolor Bayesian p-value: 0.2887
Puma yagouaroundi Bayesian p-value: 0.6723
Tamandua tetradactyla Bayesian p-value: 0.54
Tapirus pinchaque Bayesian p-value: 0.3977
Tapirus terrestris Bayesian p-value: 0.052
Tayassu pecari Bayesian p-value: 0.2737
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.

Fit plot

Code
#### fit plot
ppc.df <- data.frame(fit = ppc.out.sp$fit.y, 
                     fit.rep = ppc.out.sp$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!

Model comparison

Code
# 4. Model comparison -----------------------------------------------------
# Compute Widely Applicable Information Criterion (WAIC)
# Lower values indicate better model fit. 
waicOcc(out.null)
      elpd         pD       WAIC 
-8844.8371   121.7868 17933.2478 
Code
waicOcc(out.lfMs)
      elpd         pD       WAIC 
-8845.1613   121.8714 17934.0653 
Code
waicOcc(out.sp)
      elpd         pD       WAIC 
-7730.6252   762.8295 16986.9094 
Code
waicOcc(out.sp.cat)
      elpd         pD       WAIC 
-7829.5783   685.8486 17030.8539 

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.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).

Posterior Summary

Code
# 5. Posterior summaries --------------------------------------------------
# Concise summary of main parameter estimates
summary(out.sp, 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 = 15, n.factors = 5, n.batch = 600, 
    batch.length = 25, n.omp.threads = 6, n.report = 1000, n.burn = 5000, 
    n.thin = 10, n.chains = 3)

Samples per Chain: 15000
Burn-in: 5000
Thinning Rate: 10
Number of Chains: 3
Total Posterior Samples: 3000
Run Time (min): 33.773

----------------------------------------
    Community Level
----------------------------------------
Occurrence Means (logit scale): 
                      Mean     SD    2.5%     50%   97.5%   Rhat ESS
(Intercept)        -3.3512 0.5172 -4.3451 -3.3633 -2.2810 1.3609 108
scale(elev)         0.0410 0.1946 -0.3539  0.0423  0.4210 1.0034 916
scale(border_dist) -0.4007 0.3306 -1.0530 -0.3989  0.2415 1.0241 162
scale(FLII)         0.5362 0.1954  0.1900  0.5189  0.9595 1.0970 378

Occurrence Variances (logit scale): 
                     Mean     SD   2.5%    50%  97.5%   Rhat ESS
(Intercept)        4.8073 2.0122 2.0616 4.4592 9.8684 1.1503 198
scale(elev)        0.4687 0.2148 0.1806 0.4279 0.9848 1.0168 896
scale(border_dist) 1.7411 0.7518 0.6891 1.6120 3.5528 1.2501 355
scale(FLII)        0.3741 0.2958 0.0556 0.2882 1.1499 1.4718  41

Detection Means (logit scale): 
                 Mean     SD    2.5%     50%   97.5%   Rhat  ESS
(Intercept)   -2.1962 0.2459 -2.7175 -2.1767 -1.7465 1.0463  667
scale(effort)  0.3951 0.0644  0.2744  0.3940  0.5308 1.0083 2492

Detection Variances (logit scale): 
                Mean     SD   2.5%    50%  97.5%   Rhat  ESS
(Intercept)   1.2338 0.5259 0.5379 1.1232 2.5106 1.1066  241
scale(effort) 0.0442 0.0242 0.0161 0.0384 0.1058 0.9998 2352

----------------------------------------
    Spatial Covariance
----------------------------------------
         Mean     SD   2.5%     50%   97.5%   Rhat  ESS
phi-1  0.0000 0.0000 0.0000  0.0000  0.0001 3.0865   60
phi-2 10.6668 9.0147 0.0000  9.6311 26.4623 1.7523   18
phi-3  8.8243 9.0798 0.0000  6.1605 26.2962 3.9425   11
phi-4 11.9030 8.6764 0.0001 11.6079 26.7145 1.2123   45
phi-5 13.4894 7.9590 0.6382 13.2441 26.7722 0.9996 3000
Code
summary(out.sp, 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 = 15, n.factors = 5, n.batch = 600, 
    batch.length = 25, n.omp.threads = 6, n.report = 1000, n.burn = 5000, 
    n.thin = 10, n.chains = 3)

Samples per Chain: 15000
Burn-in: 5000
Thinning Rate: 10
Number of Chains: 3
Total Posterior Samples: 3000
Run Time (min): 33.773

----------------------------------------
    Species Level
----------------------------------------
Occurrence (logit scale): 
                                               Mean     SD    2.5%     50%
(Intercept)-Atelocynus microtis             -3.1224 0.6922 -4.3749 -3.1507
(Intercept)-Coendou prehensilis             -5.9645 1.3670 -8.7370 -5.9546
(Intercept)-Cuniculus paca                  -0.4578 0.5211 -1.5274 -0.4610
(Intercept)-Dasyprocta fuliginosa           -2.6906 1.2639 -5.2474 -2.7481
(Intercept)-Dasypus sp.                     -5.8874 0.8777 -7.7805 -5.8116
(Intercept)-Didelphis marsupialis           -4.0029 0.7408 -5.6355 -3.9374
(Intercept)-Eira barbara                    -2.3124 0.8357 -4.0634 -2.2874
(Intercept)-Herpailurus yagouaroundi        -4.6705 1.2642 -7.0490 -4.7278
(Intercept)-Leopardus pardalis              -1.9768 0.4807 -3.0594 -1.9370
(Intercept)-Leopardus tigrinus              -6.3087 1.1012 -8.5639 -6.2238
(Intercept)-Leopardus wiedii                -3.0943 1.0284 -4.9278 -3.2085
(Intercept)-Mazama americana                -2.6261 0.4552 -3.6355 -2.5728
(Intercept)-Mazama nemorivaga               -6.2566 1.0489 -8.4092 -6.1878
(Intercept)-Myoprocta pratti                -5.1482 0.8499 -7.0050 -5.0795
(Intercept)-Myrmecophaga tridactyla         -2.4573 0.8884 -4.2124 -2.4449
(Intercept)-Nasua nasua                     -2.5429 0.8068 -4.0873 -2.5389
(Intercept)-Panthera onca                   -2.2762 0.7404 -3.8574 -2.2552
(Intercept)-Pecari tajacu                   -0.3718 0.6422 -1.6504 -0.3484
(Intercept)-Priodontes maximus              -2.4892 1.0435 -4.5226 -2.4935
(Intercept)-Procyon cancrivorous            -5.4237 1.3006 -8.2205 -5.3741
(Intercept)-Puma concolor                   -2.7531 0.5703 -4.0769 -2.6831
(Intercept)-Puma yagouaroundi               -5.7444 1.3849 -8.5177 -5.7111
(Intercept)-Tamandua tetradactyla           -3.6848 1.0723 -5.7856 -3.6928
(Intercept)-Tapirus pinchaque               -7.1762 1.1847 -9.8897 -7.0382
(Intercept)-Tapirus terrestris              -1.1661 0.5363 -2.3521 -1.1284
(Intercept)-Tayassu pecari                  -2.4582 0.6856 -3.9193 -2.4290
scale(elev)-Atelocynus microtis             -0.5564 0.4149 -1.4134 -0.5423
scale(elev)-Coendou prehensilis              0.2855 0.5778 -0.7933  0.2673
scale(elev)-Cuniculus paca                  -0.0738 0.2363 -0.5616 -0.0701
scale(elev)-Dasyprocta fuliginosa            0.7140 0.4642 -0.1291  0.6958
scale(elev)-Dasypus sp.                     -0.1471 0.2998 -0.7491 -0.1501
scale(elev)-Didelphis marsupialis            0.6066 0.4794 -0.2962  0.5834
scale(elev)-Eira barbara                    -0.7174 0.4163 -1.5339 -0.7157
scale(elev)-Herpailurus yagouaroundi        -0.4606 0.5831 -1.7054 -0.4430
scale(elev)-Leopardus pardalis               0.4050 0.3471 -0.2714  0.4094
scale(elev)-Leopardus tigrinus              -0.3221 0.5845 -1.5229 -0.3104
scale(elev)-Leopardus wiedii                -0.0066 0.4528 -0.8992 -0.0026
scale(elev)-Mazama americana                 1.5632 0.3916  0.8203  1.5540
scale(elev)-Mazama nemorivaga                0.5685 0.3515 -0.0963  0.5530
scale(elev)-Myoprocta pratti                 0.0664 0.4472 -0.7949  0.0579
scale(elev)-Myrmecophaga tridactyla         -0.2445 0.4049 -1.0493 -0.2318
scale(elev)-Nasua nasua                      0.1789 0.4107 -0.6151  0.1675
scale(elev)-Panthera onca                    0.1856 0.3843 -0.5617  0.1747
scale(elev)-Pecari tajacu                    0.3793 0.2838 -0.1525  0.3731
scale(elev)-Priodontes maximus              -0.2099 0.4867 -1.1726 -0.2040
scale(elev)-Procyon cancrivorous            -0.0894 0.4626 -0.9529 -0.0923
scale(elev)-Puma concolor                   -0.5919 0.3418 -1.2996 -0.5885
scale(elev)-Puma yagouaroundi               -0.2841 0.5268 -1.3176 -0.2929
scale(elev)-Tamandua tetradactyla            0.2440 0.5265 -0.7298  0.2193
scale(elev)-Tapirus pinchaque               -0.3083 0.5875 -1.5192 -0.2989
scale(elev)-Tapirus terrestris               0.2795 0.2804 -0.2686  0.2704
scale(elev)-Tayassu pecari                  -0.3228 0.3199 -0.9632 -0.3226
scale(border_dist)-Atelocynus microtis      -0.0981 0.4527 -1.0023 -0.1028
scale(border_dist)-Coendou prehensilis      -0.5568 0.8924 -2.4253 -0.5356
scale(border_dist)-Cuniculus paca           -1.0348 0.3750 -1.7539 -1.0445
scale(border_dist)-Dasyprocta fuliginosa    -0.5908 0.8906 -2.2001 -0.6371
scale(border_dist)-Dasypus sp.              -3.5458 0.9084 -5.2100 -3.5868
scale(border_dist)-Didelphis marsupialis     1.3850 0.5009  0.4035  1.3670
scale(border_dist)-Eira barbara             -1.6871 0.6177 -2.9735 -1.6600
scale(border_dist)-Herpailurus yagouaroundi  0.1441 0.8302 -1.4892  0.1297
scale(border_dist)-Leopardus pardalis        1.0440 0.4175  0.2367  1.0371
scale(border_dist)-Leopardus tigrinus        0.1620 0.7481 -1.2877  0.1473
scale(border_dist)-Leopardus wiedii          0.3998 0.5489 -0.6433  0.3751
scale(border_dist)-Mazama americana          1.0248 0.3850  0.2981  1.0130
scale(border_dist)-Mazama nemorivaga        -2.7072 0.8772 -4.4897 -2.6860
scale(border_dist)-Myoprocta pratti         -0.3178 0.6893 -1.7554 -0.2916
scale(border_dist)-Myrmecophaga tridactyla  -0.2840 0.5169 -1.3428 -0.2763
scale(border_dist)-Nasua nasua              -0.7887 0.5165 -1.8555 -0.7652
scale(border_dist)-Panthera onca             0.4966 0.4984 -0.4425  0.4828
scale(border_dist)-Pecari tajacu            -0.4161 0.4474 -1.2948 -0.4315
scale(border_dist)-Priodontes maximus        0.1113 0.6053 -1.0314  0.0889
scale(border_dist)-Procyon cancrivorous     -1.6218 0.8301 -3.4501 -1.5676
scale(border_dist)-Puma concolor            -0.2378 0.3538 -0.9538 -0.2297
scale(border_dist)-Puma yagouaroundi        -1.3519 0.8421 -3.1627 -1.3209
scale(border_dist)-Tamandua tetradactyla    -0.3045 0.7773 -1.9238 -0.2739
scale(border_dist)-Tapirus pinchaque         0.3632 0.7821 -1.0721  0.3296
scale(border_dist)-Tapirus terrestris       -0.2910 0.3828 -1.0873 -0.2775
scale(border_dist)-Tayassu pecari            0.1189 0.4761 -0.8840  0.1258
scale(FLII)-Atelocynus microtis              0.3916 0.4223 -0.3833  0.3629
scale(FLII)-Coendou prehensilis              0.5401 0.5958 -0.5664  0.5303
scale(FLII)-Cuniculus paca                   0.0542 0.2559 -0.4534  0.0600
scale(FLII)-Dasyprocta fuliginosa           -0.2974 0.4576 -1.2175 -0.2820
scale(FLII)-Dasypus sp.                      0.5669 0.5674 -0.4885  0.5357
scale(FLII)-Didelphis marsupialis            0.9931 0.4843  0.1980  0.9348
scale(FLII)-Eira barbara                     0.3092 0.4290 -0.6333  0.3279
scale(FLII)-Herpailurus yagouaroundi         0.2748 0.5286 -0.8199  0.2836
scale(FLII)-Leopardus pardalis               0.9934 0.4253  0.3043  0.9435
scale(FLII)-Leopardus tigrinus               0.1776 0.3515 -0.5396  0.1928
scale(FLII)-Leopardus wiedii                 0.9454 0.5521  0.0747  0.8535
scale(FLII)-Mazama americana                 0.4822 0.2767 -0.0281  0.4685
scale(FLII)-Mazama nemorivaga                0.5906 0.6020 -0.5097  0.5439
scale(FLII)-Myoprocta pratti                 0.8182 0.5138 -0.0733  0.7699
scale(FLII)-Myrmecophaga tridactyla          0.4890 0.4125 -0.2583  0.4596
scale(FLII)-Nasua nasua                      0.4043 0.4111 -0.3997  0.4149
scale(FLII)-Panthera onca                    0.9606 0.4990  0.1358  0.9081
scale(FLII)-Pecari tajacu                    0.5261 0.3348 -0.0716  0.5047
scale(FLII)-Priodontes maximus               0.3564 0.4539 -0.5174  0.3443
scale(FLII)-Procyon cancrivorous             0.6709 0.5869 -0.3926  0.6113
scale(FLII)-Puma concolor                    0.1144 0.2552 -0.3812  0.1121
scale(FLII)-Puma yagouaroundi                0.6249 0.5932 -0.4335  0.5855
scale(FLII)-Tamandua tetradactyla            0.2364 0.4835 -0.7689  0.2500
scale(FLII)-Tapirus pinchaque                0.5021 0.2890 -0.0274  0.4932
scale(FLII)-Tapirus terrestris               1.0050 0.4376  0.2710  0.9565
scale(FLII)-Tayassu pecari                   1.3216 0.6688  0.3084  1.2092
                                              97.5%   Rhat  ESS
(Intercept)-Atelocynus microtis             -1.7199 1.3528  137
(Intercept)-Coendou prehensilis             -3.2626 1.1786  149
(Intercept)-Cuniculus paca                   0.4903 2.5439   15
(Intercept)-Dasyprocta fuliginosa           -0.4438 2.7416   13
(Intercept)-Dasypus sp.                     -4.3966 1.0653  335
(Intercept)-Didelphis marsupialis           -2.7655 1.2800  273
(Intercept)-Eira barbara                    -0.6952 1.4478  140
(Intercept)-Herpailurus yagouaroundi        -2.2135 1.2906  135
(Intercept)-Leopardus pardalis              -1.1788 1.1229   72
(Intercept)-Leopardus tigrinus              -4.3454 1.1074  248
(Intercept)-Leopardus wiedii                -0.8076 1.1006  140
(Intercept)-Mazama americana                -1.9058 1.3716  103
(Intercept)-Mazama nemorivaga               -4.4031 1.1048  255
(Intercept)-Myoprocta pratti                -3.6921 1.3584  221
(Intercept)-Myrmecophaga tridactyla         -0.7059 1.3169  130
(Intercept)-Nasua nasua                     -0.9459 1.2726  118
(Intercept)-Panthera onca                   -0.8763 1.5550  157
(Intercept)-Pecari tajacu                    0.7561 2.0615   26
(Intercept)-Priodontes maximus              -0.4945 1.3866  136
(Intercept)-Procyon cancrivorous            -2.9945 1.0208  184
(Intercept)-Puma concolor                   -1.8622 1.1143  271
(Intercept)-Puma yagouaroundi               -2.8186 1.1437  168
(Intercept)-Tamandua tetradactyla           -1.3725 1.0853  159
(Intercept)-Tapirus pinchaque               -5.2220 1.1573  208
(Intercept)-Tapirus terrestris              -0.2482 1.7238   29
(Intercept)-Tayassu pecari                  -1.2741 1.6444   32
scale(elev)-Atelocynus microtis              0.2182 1.0016 1236
scale(elev)-Coendou prehensilis              1.5049 1.0019 1571
scale(elev)-Cuniculus paca                   0.3750 1.0818  748
scale(elev)-Dasyprocta fuliginosa            1.7025 2.0675   90
scale(elev)-Dasypus sp.                      0.4364 1.2017  314
scale(elev)-Didelphis marsupialis            1.5789 1.4518  118
scale(elev)-Eira barbara                     0.0699 1.0953 1025
scale(elev)-Herpailurus yagouaroundi         0.6054 1.0595 1244
scale(elev)-Leopardus pardalis               1.1038 1.7394   73
scale(elev)-Leopardus tigrinus               0.8052 1.0113 1387
scale(elev)-Leopardus wiedii                 0.8912 1.0307 1134
scale(elev)-Mazama americana                 2.3514 1.3444   92
scale(elev)-Mazama nemorivaga                1.3052 1.0536  870
scale(elev)-Myoprocta pratti                 0.9749 1.2384  311
scale(elev)-Myrmecophaga tridactyla          0.5254 1.0622  686
scale(elev)-Nasua nasua                      0.9994 1.0218 1021
scale(elev)-Panthera onca                    0.9556 1.0019 1776
scale(elev)-Pecari tajacu                    0.9483 1.0301  656
scale(elev)-Priodontes maximus               0.7639 1.0003 1213
scale(elev)-Procyon cancrivorous             0.8553 1.0080 1148
scale(elev)-Puma concolor                    0.0822 1.1761  305
scale(elev)-Puma yagouaroundi                0.7227 1.0068 1067
scale(elev)-Tamandua tetradactyla            1.3146 1.0947  985
scale(elev)-Tapirus pinchaque                0.8336 1.0007 1492
scale(elev)-Tapirus terrestris               0.8561 1.0669  454
scale(elev)-Tayassu pecari                   0.3148 1.1647  334
scale(border_dist)-Atelocynus microtis       0.7986 1.0338  231
scale(border_dist)-Coendou prehensilis       1.1526 1.0226  503
scale(border_dist)-Cuniculus paca           -0.2531 1.2348   90
scale(border_dist)-Dasyprocta fuliginosa     1.3486 1.6343   30
scale(border_dist)-Dasypus sp.              -1.5847 2.0607   52
scale(border_dist)-Didelphis marsupialis     2.4354 1.1362  166
scale(border_dist)-Eira barbara             -0.5639 1.1818  355
scale(border_dist)-Herpailurus yagouaroundi  1.7841 1.1048  499
scale(border_dist)-Leopardus pardalis        1.8996 1.0025  145
scale(border_dist)-Leopardus tigrinus        1.6803 0.9998  942
scale(border_dist)-Leopardus wiedii          1.5584 1.0186  630
scale(border_dist)-Mazama americana          1.8116 1.2145  142
scale(border_dist)-Mazama nemorivaga        -1.1508 1.3271  157
scale(border_dist)-Myoprocta pratti          1.0141 1.3205  131
scale(border_dist)-Myrmecophaga tridactyla   0.7678 1.1902  380
scale(border_dist)-Nasua nasua               0.1900 1.0490  283
scale(border_dist)-Panthera onca             1.5728 1.0336  230
scale(border_dist)-Pecari tajacu             0.4681 1.0723   88
scale(border_dist)-Priodontes maximus        1.3517 1.0123  523
scale(border_dist)-Procyon cancrivorous     -0.1098 1.1439  456
scale(border_dist)-Puma concolor             0.4592 1.0319 1320
scale(border_dist)-Puma yagouaroundi         0.2582 1.0541  475
scale(border_dist)-Tamandua tetradactyla     1.1124 1.3059  214
scale(border_dist)-Tapirus pinchaque         2.0346 1.0205  530
scale(border_dist)-Tapirus terrestris        0.4346 1.0311  118
scale(border_dist)-Tayassu pecari            1.0006 1.0180   76
scale(FLII)-Atelocynus microtis              1.3069 1.0771 1254
scale(FLII)-Coendou prehensilis              1.8239 1.0268 1018
scale(FLII)-Cuniculus paca                   0.5549 1.2770  264
scale(FLII)-Dasyprocta fuliginosa            0.5011 1.2473   69
scale(FLII)-Dasypus sp.                      1.7944 1.0159 1141
scale(FLII)-Didelphis marsupialis            2.1123 1.2544  110
scale(FLII)-Eira barbara                     1.1005 1.1460  188
scale(FLII)-Herpailurus yagouaroundi         1.3561 1.0131  916
scale(FLII)-Leopardus pardalis               1.9818 1.2514   81
scale(FLII)-Leopardus tigrinus               0.8264 1.0177 1240
scale(FLII)-Leopardus wiedii                 2.2901 1.3234  131
scale(FLII)-Mazama americana                 1.0602 1.0076 1192
scale(FLII)-Mazama nemorivaga                1.9055 1.0753  945
scale(FLII)-Myoprocta pratti                 1.9615 1.0569  923
scale(FLII)-Myrmecophaga tridactyla          1.3906 1.0483  527
scale(FLII)-Nasua nasua                      1.2033 1.1621  103
scale(FLII)-Panthera onca                    2.0743 1.1265  260
scale(FLII)-Pecari tajacu                    1.2627 1.1698   58
scale(FLII)-Priodontes maximus               1.2866 1.0122  995
scale(FLII)-Procyon cancrivorous             2.0067 1.0391  884
scale(FLII)-Puma concolor                    0.6216 1.0033 1500
scale(FLII)-Puma yagouaroundi                1.9642 1.0430 1033
scale(FLII)-Tamandua tetradactyla            1.2126 1.1560  372
scale(FLII)-Tapirus pinchaque                1.0941 1.0380 1559
scale(FLII)-Tapirus terrestris               1.9714 1.2558  101
scale(FLII)-Tayassu pecari                   2.8633 1.4218   40

Detection (logit scale): 
                                          Mean     SD    2.5%     50%   97.5%
(Intercept)-Atelocynus microtis        -2.6743 0.5351 -3.8252 -2.6408 -1.7359
(Intercept)-Coendou prehensilis        -3.3453 1.0281 -5.7531 -3.2444 -1.5835
(Intercept)-Cuniculus paca             -0.6952 0.0580 -0.8076 -0.6960 -0.5826
(Intercept)-Dasyprocta fuliginosa      -0.4522 0.0688 -0.5889 -0.4532 -0.3149
(Intercept)-Dasypus sp.                -1.5173 0.1218 -1.7562 -1.5168 -1.2895
(Intercept)-Didelphis marsupialis      -2.1330 0.3416 -2.8277 -2.1198 -1.5107
(Intercept)-Eira barbara               -3.0251 0.2515 -3.5451 -3.0252 -2.5365
(Intercept)-Herpailurus yagouaroundi   -3.3452 0.7829 -4.8981 -3.3333 -1.8451
(Intercept)-Leopardus pardalis         -1.7805 0.1560 -2.1023 -1.7764 -1.4843
(Intercept)-Leopardus tigrinus         -2.1083 0.5758 -3.3441 -2.0668 -1.0822
(Intercept)-Leopardus wiedii           -3.1792 0.6916 -4.6135 -3.1100 -1.9689
(Intercept)-Mazama americana           -1.1770 0.1128 -1.4049 -1.1755 -0.9618
(Intercept)-Mazama nemorivaga          -2.0047 0.1828 -2.3783 -2.0024 -1.6531
(Intercept)-Myoprocta pratti           -1.3673 0.2396 -1.8578 -1.3634 -0.9139
(Intercept)-Myrmecophaga tridactyla    -2.9391 0.4432 -3.8466 -2.9102 -2.1469
(Intercept)-Nasua nasua                -2.9475 0.2877 -3.5400 -2.9426 -2.4032
(Intercept)-Panthera onca              -2.4681 0.2296 -2.9309 -2.4598 -2.0442
(Intercept)-Pecari tajacu              -1.2017 0.0699 -1.3401 -1.2012 -1.0725
(Intercept)-Priodontes maximus         -3.4626 0.4749 -4.3238 -3.4792 -2.5143
(Intercept)-Procyon cancrivorous       -3.3776 0.7784 -4.9916 -3.3094 -2.0134
(Intercept)-Puma concolor              -1.7118 0.1837 -2.0896 -1.7053 -1.3807
(Intercept)-Puma yagouaroundi          -3.5405 0.8884 -5.4282 -3.4740 -1.9973
(Intercept)-Tamandua tetradactyla      -3.4819 0.6150 -4.7506 -3.4647 -2.3539
(Intercept)-Tapirus pinchaque          -1.4118 0.2778 -1.9989 -1.4059 -0.9052
(Intercept)-Tapirus terrestris         -1.1007 0.0769 -1.2533 -1.0995 -0.9541
(Intercept)-Tayassu pecari             -1.6461 0.1378 -1.9192 -1.6454 -1.3878
scale(effort)-Atelocynus microtis       0.3384 0.1807 -0.0140  0.3358  0.7005
scale(effort)-Coendou prehensilis       0.3942 0.2180 -0.0322  0.3938  0.8332
scale(effort)-Cuniculus paca            0.3428 0.0667  0.2139  0.3418  0.4729
scale(effort)-Dasyprocta fuliginosa     0.4115 0.0857  0.2559  0.4082  0.5918
scale(effort)-Dasypus sp.               0.4312 0.1349  0.1806  0.4254  0.7158
scale(effort)-Didelphis marsupialis     0.5339 0.1892  0.2046  0.5174  0.9594
scale(effort)-Eira barbara              0.5083 0.1834  0.1830  0.4937  0.9130
scale(effort)-Herpailurus yagouaroundi  0.2855 0.2009 -0.1345  0.2924  0.6699
scale(effort)-Leopardus pardalis        0.4133 0.1161  0.2087  0.4082  0.6566
scale(effort)-Leopardus tigrinus        0.4339 0.2037  0.0411  0.4278  0.8532
scale(effort)-Leopardus wiedii          0.4482 0.1968  0.0934  0.4367  0.8690
scale(effort)-Mazama americana          0.5129 0.1317  0.2774  0.5050  0.7873
scale(effort)-Mazama nemorivaga         0.2820 0.1427  0.0129  0.2768  0.5722
scale(effort)-Myoprocta pratti          0.3494 0.1784  0.0073  0.3435  0.7057
scale(effort)-Myrmecophaga tridactyla   0.3838 0.1716  0.0576  0.3756  0.7478
scale(effort)-Nasua nasua               0.4963 0.1852  0.1758  0.4821  0.8841
scale(effort)-Panthera onca             0.3184 0.1366  0.0514  0.3143  0.5817
scale(effort)-Pecari tajacu             0.3564 0.0765  0.2107  0.3544  0.5081
scale(effort)-Priodontes maximus        0.2281 0.1679 -0.1010  0.2303  0.5517
scale(effort)-Procyon cancrivorous      0.4190 0.2079  0.0391  0.4112  0.8528
scale(effort)-Puma concolor             0.3127 0.1314  0.0683  0.3096  0.5739
scale(effort)-Puma yagouaroundi         0.3995 0.2093 -0.0095  0.4002  0.8294
scale(effort)-Tamandua tetradactyla     0.2691 0.1945 -0.1263  0.2682  0.6431
scale(effort)-Tapirus pinchaque         0.4913 0.1941  0.1445  0.4792  0.9340
scale(effort)-Tapirus terrestris        0.3786 0.0816  0.2220  0.3763  0.5438
scale(effort)-Tayassu pecari            0.5475 0.1308  0.3128  0.5441  0.8162
                                         Rhat  ESS
(Intercept)-Atelocynus microtis        1.0034  416
(Intercept)-Coendou prehensilis        1.1180  230
(Intercept)-Cuniculus paca             1.0073 2784
(Intercept)-Dasyprocta fuliginosa      1.0010 3000
(Intercept)-Dasypus sp.                1.0006 2743
(Intercept)-Didelphis marsupialis      1.0050 1246
(Intercept)-Eira barbara               1.0339  407
(Intercept)-Herpailurus yagouaroundi   1.0257  290
(Intercept)-Leopardus pardalis         1.0621 1576
(Intercept)-Leopardus tigrinus         1.0038  950
(Intercept)-Leopardus wiedii           1.1703  151
(Intercept)-Mazama americana           1.0003 3000
(Intercept)-Mazama nemorivaga          1.0003 2850
(Intercept)-Myoprocta pratti           1.0027 2529
(Intercept)-Myrmecophaga tridactyla    1.4129  190
(Intercept)-Nasua nasua                1.1365  186
(Intercept)-Panthera onca              1.0310  744
(Intercept)-Pecari tajacu              1.0487 2196
(Intercept)-Priodontes maximus         1.1517  186
(Intercept)-Procyon cancrivorous       1.0180  259
(Intercept)-Puma concolor              1.0004 2394
(Intercept)-Puma yagouaroundi          1.1648  249
(Intercept)-Tamandua tetradactyla      1.0191  180
(Intercept)-Tapirus pinchaque          1.0011 2767
(Intercept)-Tapirus terrestris         1.0005 3000
(Intercept)-Tayassu pecari             1.0156 1698
scale(effort)-Atelocynus microtis      0.9996 3000
scale(effort)-Coendou prehensilis      1.0007 3000
scale(effort)-Cuniculus paca           1.0027 3000
scale(effort)-Dasyprocta fuliginosa    1.0011 2777
scale(effort)-Dasypus sp.              1.0012 2851
scale(effort)-Didelphis marsupialis    1.0032 2622
scale(effort)-Eira barbara             1.0057 2601
scale(effort)-Herpailurus yagouaroundi 1.0055 2763
scale(effort)-Leopardus pardalis       1.0060 2712
scale(effort)-Leopardus tigrinus       1.0024 3000
scale(effort)-Leopardus wiedii         1.0038 2097
scale(effort)-Mazama americana         1.0032 2758
scale(effort)-Mazama nemorivaga        1.0012 3000
scale(effort)-Myoprocta pratti         1.0023 3000
scale(effort)-Myrmecophaga tridactyla  1.0009 3000
scale(effort)-Nasua nasua              1.0056 2292
scale(effort)-Panthera onca            1.0006 3000
scale(effort)-Pecari tajacu            1.0035 2792
scale(effort)-Priodontes maximus       1.0000 2640
scale(effort)-Procyon cancrivorous     1.0007 2807
scale(effort)-Puma concolor            1.0002 3000
scale(effort)-Puma yagouaroundi        1.0003 3000
scale(effort)-Tamandua tetradactyla    1.0029 2749
scale(effort)-Tapirus pinchaque        1.0042 2713
scale(effort)-Tapirus terrestris       0.9999 3000
scale(effort)-Tayassu pecari           1.0036 2745

----------------------------------------
    Spatial Covariance
----------------------------------------
         Mean     SD   2.5%     50%   97.5%   Rhat  ESS
phi-1  0.0000 0.0000 0.0000  0.0000  0.0001 3.0865   60
phi-2 10.6668 9.0147 0.0000  9.6311 26.4623 1.7523   18
phi-3  8.8243 9.0798 0.0000  6.1605 26.2962 3.9425   11
phi-4 11.9030 8.6764 0.0001 11.6079 26.7145 1.2123   45
phi-5 13.4894 7.9590 0.6382 13.2441 26.7722 0.9996 3000
Code
summary(out.sp, 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 = 15, n.factors = 5, n.batch = 600, 
    batch.length = 25, n.omp.threads = 6, n.report = 1000, n.burn = 5000, 
    n.thin = 10, n.chains = 3)

Samples per Chain: 15000
Burn-in: 5000
Thinning Rate: 10
Number of Chains: 3
Total Posterior Samples: 3000
Run Time (min): 33.773

----------------------------------------
    Community Level
----------------------------------------
Occurrence Means (logit scale): 
                      Mean     SD    2.5%     50%   97.5%   Rhat ESS
(Intercept)        -3.3512 0.5172 -4.3451 -3.3633 -2.2810 1.3609 108
scale(elev)         0.0410 0.1946 -0.3539  0.0423  0.4210 1.0034 916
scale(border_dist) -0.4007 0.3306 -1.0530 -0.3989  0.2415 1.0241 162
scale(FLII)         0.5362 0.1954  0.1900  0.5189  0.9595 1.0970 378

Occurrence Variances (logit scale): 
                     Mean     SD   2.5%    50%  97.5%   Rhat ESS
(Intercept)        4.8073 2.0122 2.0616 4.4592 9.8684 1.1503 198
scale(elev)        0.4687 0.2148 0.1806 0.4279 0.9848 1.0168 896
scale(border_dist) 1.7411 0.7518 0.6891 1.6120 3.5528 1.2501 355
scale(FLII)        0.3741 0.2958 0.0556 0.2882 1.1499 1.4718  41

Detection Means (logit scale): 
                 Mean     SD    2.5%     50%   97.5%   Rhat  ESS
(Intercept)   -2.1962 0.2459 -2.7175 -2.1767 -1.7465 1.0463  667
scale(effort)  0.3951 0.0644  0.2744  0.3940  0.5308 1.0083 2492

Detection Variances (logit scale): 
                Mean     SD   2.5%    50%  97.5%   Rhat  ESS
(Intercept)   1.2338 0.5259 0.5379 1.1232 2.5106 1.1066  241
scale(effort) 0.0442 0.0242 0.0161 0.0384 0.1058 0.9998 2352

----------------------------------------
    Species Level
----------------------------------------
Occurrence (logit scale): 
                                               Mean     SD    2.5%     50%
(Intercept)-Atelocynus microtis             -3.1224 0.6922 -4.3749 -3.1507
(Intercept)-Coendou prehensilis             -5.9645 1.3670 -8.7370 -5.9546
(Intercept)-Cuniculus paca                  -0.4578 0.5211 -1.5274 -0.4610
(Intercept)-Dasyprocta fuliginosa           -2.6906 1.2639 -5.2474 -2.7481
(Intercept)-Dasypus sp.                     -5.8874 0.8777 -7.7805 -5.8116
(Intercept)-Didelphis marsupialis           -4.0029 0.7408 -5.6355 -3.9374
(Intercept)-Eira barbara                    -2.3124 0.8357 -4.0634 -2.2874
(Intercept)-Herpailurus yagouaroundi        -4.6705 1.2642 -7.0490 -4.7278
(Intercept)-Leopardus pardalis              -1.9768 0.4807 -3.0594 -1.9370
(Intercept)-Leopardus tigrinus              -6.3087 1.1012 -8.5639 -6.2238
(Intercept)-Leopardus wiedii                -3.0943 1.0284 -4.9278 -3.2085
(Intercept)-Mazama americana                -2.6261 0.4552 -3.6355 -2.5728
(Intercept)-Mazama nemorivaga               -6.2566 1.0489 -8.4092 -6.1878
(Intercept)-Myoprocta pratti                -5.1482 0.8499 -7.0050 -5.0795
(Intercept)-Myrmecophaga tridactyla         -2.4573 0.8884 -4.2124 -2.4449
(Intercept)-Nasua nasua                     -2.5429 0.8068 -4.0873 -2.5389
(Intercept)-Panthera onca                   -2.2762 0.7404 -3.8574 -2.2552
(Intercept)-Pecari tajacu                   -0.3718 0.6422 -1.6504 -0.3484
(Intercept)-Priodontes maximus              -2.4892 1.0435 -4.5226 -2.4935
(Intercept)-Procyon cancrivorous            -5.4237 1.3006 -8.2205 -5.3741
(Intercept)-Puma concolor                   -2.7531 0.5703 -4.0769 -2.6831
(Intercept)-Puma yagouaroundi               -5.7444 1.3849 -8.5177 -5.7111
(Intercept)-Tamandua tetradactyla           -3.6848 1.0723 -5.7856 -3.6928
(Intercept)-Tapirus pinchaque               -7.1762 1.1847 -9.8897 -7.0382
(Intercept)-Tapirus terrestris              -1.1661 0.5363 -2.3521 -1.1284
(Intercept)-Tayassu pecari                  -2.4582 0.6856 -3.9193 -2.4290
scale(elev)-Atelocynus microtis             -0.5564 0.4149 -1.4134 -0.5423
scale(elev)-Coendou prehensilis              0.2855 0.5778 -0.7933  0.2673
scale(elev)-Cuniculus paca                  -0.0738 0.2363 -0.5616 -0.0701
scale(elev)-Dasyprocta fuliginosa            0.7140 0.4642 -0.1291  0.6958
scale(elev)-Dasypus sp.                     -0.1471 0.2998 -0.7491 -0.1501
scale(elev)-Didelphis marsupialis            0.6066 0.4794 -0.2962  0.5834
scale(elev)-Eira barbara                    -0.7174 0.4163 -1.5339 -0.7157
scale(elev)-Herpailurus yagouaroundi        -0.4606 0.5831 -1.7054 -0.4430
scale(elev)-Leopardus pardalis               0.4050 0.3471 -0.2714  0.4094
scale(elev)-Leopardus tigrinus              -0.3221 0.5845 -1.5229 -0.3104
scale(elev)-Leopardus wiedii                -0.0066 0.4528 -0.8992 -0.0026
scale(elev)-Mazama americana                 1.5632 0.3916  0.8203  1.5540
scale(elev)-Mazama nemorivaga                0.5685 0.3515 -0.0963  0.5530
scale(elev)-Myoprocta pratti                 0.0664 0.4472 -0.7949  0.0579
scale(elev)-Myrmecophaga tridactyla         -0.2445 0.4049 -1.0493 -0.2318
scale(elev)-Nasua nasua                      0.1789 0.4107 -0.6151  0.1675
scale(elev)-Panthera onca                    0.1856 0.3843 -0.5617  0.1747
scale(elev)-Pecari tajacu                    0.3793 0.2838 -0.1525  0.3731
scale(elev)-Priodontes maximus              -0.2099 0.4867 -1.1726 -0.2040
scale(elev)-Procyon cancrivorous            -0.0894 0.4626 -0.9529 -0.0923
scale(elev)-Puma concolor                   -0.5919 0.3418 -1.2996 -0.5885
scale(elev)-Puma yagouaroundi               -0.2841 0.5268 -1.3176 -0.2929
scale(elev)-Tamandua tetradactyla            0.2440 0.5265 -0.7298  0.2193
scale(elev)-Tapirus pinchaque               -0.3083 0.5875 -1.5192 -0.2989
scale(elev)-Tapirus terrestris               0.2795 0.2804 -0.2686  0.2704
scale(elev)-Tayassu pecari                  -0.3228 0.3199 -0.9632 -0.3226
scale(border_dist)-Atelocynus microtis      -0.0981 0.4527 -1.0023 -0.1028
scale(border_dist)-Coendou prehensilis      -0.5568 0.8924 -2.4253 -0.5356
scale(border_dist)-Cuniculus paca           -1.0348 0.3750 -1.7539 -1.0445
scale(border_dist)-Dasyprocta fuliginosa    -0.5908 0.8906 -2.2001 -0.6371
scale(border_dist)-Dasypus sp.              -3.5458 0.9084 -5.2100 -3.5868
scale(border_dist)-Didelphis marsupialis     1.3850 0.5009  0.4035  1.3670
scale(border_dist)-Eira barbara             -1.6871 0.6177 -2.9735 -1.6600
scale(border_dist)-Herpailurus yagouaroundi  0.1441 0.8302 -1.4892  0.1297
scale(border_dist)-Leopardus pardalis        1.0440 0.4175  0.2367  1.0371
scale(border_dist)-Leopardus tigrinus        0.1620 0.7481 -1.2877  0.1473
scale(border_dist)-Leopardus wiedii          0.3998 0.5489 -0.6433  0.3751
scale(border_dist)-Mazama americana          1.0248 0.3850  0.2981  1.0130
scale(border_dist)-Mazama nemorivaga        -2.7072 0.8772 -4.4897 -2.6860
scale(border_dist)-Myoprocta pratti         -0.3178 0.6893 -1.7554 -0.2916
scale(border_dist)-Myrmecophaga tridactyla  -0.2840 0.5169 -1.3428 -0.2763
scale(border_dist)-Nasua nasua              -0.7887 0.5165 -1.8555 -0.7652
scale(border_dist)-Panthera onca             0.4966 0.4984 -0.4425  0.4828
scale(border_dist)-Pecari tajacu            -0.4161 0.4474 -1.2948 -0.4315
scale(border_dist)-Priodontes maximus        0.1113 0.6053 -1.0314  0.0889
scale(border_dist)-Procyon cancrivorous     -1.6218 0.8301 -3.4501 -1.5676
scale(border_dist)-Puma concolor            -0.2378 0.3538 -0.9538 -0.2297
scale(border_dist)-Puma yagouaroundi        -1.3519 0.8421 -3.1627 -1.3209
scale(border_dist)-Tamandua tetradactyla    -0.3045 0.7773 -1.9238 -0.2739
scale(border_dist)-Tapirus pinchaque         0.3632 0.7821 -1.0721  0.3296
scale(border_dist)-Tapirus terrestris       -0.2910 0.3828 -1.0873 -0.2775
scale(border_dist)-Tayassu pecari            0.1189 0.4761 -0.8840  0.1258
scale(FLII)-Atelocynus microtis              0.3916 0.4223 -0.3833  0.3629
scale(FLII)-Coendou prehensilis              0.5401 0.5958 -0.5664  0.5303
scale(FLII)-Cuniculus paca                   0.0542 0.2559 -0.4534  0.0600
scale(FLII)-Dasyprocta fuliginosa           -0.2974 0.4576 -1.2175 -0.2820
scale(FLII)-Dasypus sp.                      0.5669 0.5674 -0.4885  0.5357
scale(FLII)-Didelphis marsupialis            0.9931 0.4843  0.1980  0.9348
scale(FLII)-Eira barbara                     0.3092 0.4290 -0.6333  0.3279
scale(FLII)-Herpailurus yagouaroundi         0.2748 0.5286 -0.8199  0.2836
scale(FLII)-Leopardus pardalis               0.9934 0.4253  0.3043  0.9435
scale(FLII)-Leopardus tigrinus               0.1776 0.3515 -0.5396  0.1928
scale(FLII)-Leopardus wiedii                 0.9454 0.5521  0.0747  0.8535
scale(FLII)-Mazama americana                 0.4822 0.2767 -0.0281  0.4685
scale(FLII)-Mazama nemorivaga                0.5906 0.6020 -0.5097  0.5439
scale(FLII)-Myoprocta pratti                 0.8182 0.5138 -0.0733  0.7699
scale(FLII)-Myrmecophaga tridactyla          0.4890 0.4125 -0.2583  0.4596
scale(FLII)-Nasua nasua                      0.4043 0.4111 -0.3997  0.4149
scale(FLII)-Panthera onca                    0.9606 0.4990  0.1358  0.9081
scale(FLII)-Pecari tajacu                    0.5261 0.3348 -0.0716  0.5047
scale(FLII)-Priodontes maximus               0.3564 0.4539 -0.5174  0.3443
scale(FLII)-Procyon cancrivorous             0.6709 0.5869 -0.3926  0.6113
scale(FLII)-Puma concolor                    0.1144 0.2552 -0.3812  0.1121
scale(FLII)-Puma yagouaroundi                0.6249 0.5932 -0.4335  0.5855
scale(FLII)-Tamandua tetradactyla            0.2364 0.4835 -0.7689  0.2500
scale(FLII)-Tapirus pinchaque                0.5021 0.2890 -0.0274  0.4932
scale(FLII)-Tapirus terrestris               1.0050 0.4376  0.2710  0.9565
scale(FLII)-Tayassu pecari                   1.3216 0.6688  0.3084  1.2092
                                              97.5%   Rhat  ESS
(Intercept)-Atelocynus microtis             -1.7199 1.3528  137
(Intercept)-Coendou prehensilis             -3.2626 1.1786  149
(Intercept)-Cuniculus paca                   0.4903 2.5439   15
(Intercept)-Dasyprocta fuliginosa           -0.4438 2.7416   13
(Intercept)-Dasypus sp.                     -4.3966 1.0653  335
(Intercept)-Didelphis marsupialis           -2.7655 1.2800  273
(Intercept)-Eira barbara                    -0.6952 1.4478  140
(Intercept)-Herpailurus yagouaroundi        -2.2135 1.2906  135
(Intercept)-Leopardus pardalis              -1.1788 1.1229   72
(Intercept)-Leopardus tigrinus              -4.3454 1.1074  248
(Intercept)-Leopardus wiedii                -0.8076 1.1006  140
(Intercept)-Mazama americana                -1.9058 1.3716  103
(Intercept)-Mazama nemorivaga               -4.4031 1.1048  255
(Intercept)-Myoprocta pratti                -3.6921 1.3584  221
(Intercept)-Myrmecophaga tridactyla         -0.7059 1.3169  130
(Intercept)-Nasua nasua                     -0.9459 1.2726  118
(Intercept)-Panthera onca                   -0.8763 1.5550  157
(Intercept)-Pecari tajacu                    0.7561 2.0615   26
(Intercept)-Priodontes maximus              -0.4945 1.3866  136
(Intercept)-Procyon cancrivorous            -2.9945 1.0208  184
(Intercept)-Puma concolor                   -1.8622 1.1143  271
(Intercept)-Puma yagouaroundi               -2.8186 1.1437  168
(Intercept)-Tamandua tetradactyla           -1.3725 1.0853  159
(Intercept)-Tapirus pinchaque               -5.2220 1.1573  208
(Intercept)-Tapirus terrestris              -0.2482 1.7238   29
(Intercept)-Tayassu pecari                  -1.2741 1.6444   32
scale(elev)-Atelocynus microtis              0.2182 1.0016 1236
scale(elev)-Coendou prehensilis              1.5049 1.0019 1571
scale(elev)-Cuniculus paca                   0.3750 1.0818  748
scale(elev)-Dasyprocta fuliginosa            1.7025 2.0675   90
scale(elev)-Dasypus sp.                      0.4364 1.2017  314
scale(elev)-Didelphis marsupialis            1.5789 1.4518  118
scale(elev)-Eira barbara                     0.0699 1.0953 1025
scale(elev)-Herpailurus yagouaroundi         0.6054 1.0595 1244
scale(elev)-Leopardus pardalis               1.1038 1.7394   73
scale(elev)-Leopardus tigrinus               0.8052 1.0113 1387
scale(elev)-Leopardus wiedii                 0.8912 1.0307 1134
scale(elev)-Mazama americana                 2.3514 1.3444   92
scale(elev)-Mazama nemorivaga                1.3052 1.0536  870
scale(elev)-Myoprocta pratti                 0.9749 1.2384  311
scale(elev)-Myrmecophaga tridactyla          0.5254 1.0622  686
scale(elev)-Nasua nasua                      0.9994 1.0218 1021
scale(elev)-Panthera onca                    0.9556 1.0019 1776
scale(elev)-Pecari tajacu                    0.9483 1.0301  656
scale(elev)-Priodontes maximus               0.7639 1.0003 1213
scale(elev)-Procyon cancrivorous             0.8553 1.0080 1148
scale(elev)-Puma concolor                    0.0822 1.1761  305
scale(elev)-Puma yagouaroundi                0.7227 1.0068 1067
scale(elev)-Tamandua tetradactyla            1.3146 1.0947  985
scale(elev)-Tapirus pinchaque                0.8336 1.0007 1492
scale(elev)-Tapirus terrestris               0.8561 1.0669  454
scale(elev)-Tayassu pecari                   0.3148 1.1647  334
scale(border_dist)-Atelocynus microtis       0.7986 1.0338  231
scale(border_dist)-Coendou prehensilis       1.1526 1.0226  503
scale(border_dist)-Cuniculus paca           -0.2531 1.2348   90
scale(border_dist)-Dasyprocta fuliginosa     1.3486 1.6343   30
scale(border_dist)-Dasypus sp.              -1.5847 2.0607   52
scale(border_dist)-Didelphis marsupialis     2.4354 1.1362  166
scale(border_dist)-Eira barbara             -0.5639 1.1818  355
scale(border_dist)-Herpailurus yagouaroundi  1.7841 1.1048  499
scale(border_dist)-Leopardus pardalis        1.8996 1.0025  145
scale(border_dist)-Leopardus tigrinus        1.6803 0.9998  942
scale(border_dist)-Leopardus wiedii          1.5584 1.0186  630
scale(border_dist)-Mazama americana          1.8116 1.2145  142
scale(border_dist)-Mazama nemorivaga        -1.1508 1.3271  157
scale(border_dist)-Myoprocta pratti          1.0141 1.3205  131
scale(border_dist)-Myrmecophaga tridactyla   0.7678 1.1902  380
scale(border_dist)-Nasua nasua               0.1900 1.0490  283
scale(border_dist)-Panthera onca             1.5728 1.0336  230
scale(border_dist)-Pecari tajacu             0.4681 1.0723   88
scale(border_dist)-Priodontes maximus        1.3517 1.0123  523
scale(border_dist)-Procyon cancrivorous     -0.1098 1.1439  456
scale(border_dist)-Puma concolor             0.4592 1.0319 1320
scale(border_dist)-Puma yagouaroundi         0.2582 1.0541  475
scale(border_dist)-Tamandua tetradactyla     1.1124 1.3059  214
scale(border_dist)-Tapirus pinchaque         2.0346 1.0205  530
scale(border_dist)-Tapirus terrestris        0.4346 1.0311  118
scale(border_dist)-Tayassu pecari            1.0006 1.0180   76
scale(FLII)-Atelocynus microtis              1.3069 1.0771 1254
scale(FLII)-Coendou prehensilis              1.8239 1.0268 1018
scale(FLII)-Cuniculus paca                   0.5549 1.2770  264
scale(FLII)-Dasyprocta fuliginosa            0.5011 1.2473   69
scale(FLII)-Dasypus sp.                      1.7944 1.0159 1141
scale(FLII)-Didelphis marsupialis            2.1123 1.2544  110
scale(FLII)-Eira barbara                     1.1005 1.1460  188
scale(FLII)-Herpailurus yagouaroundi         1.3561 1.0131  916
scale(FLII)-Leopardus pardalis               1.9818 1.2514   81
scale(FLII)-Leopardus tigrinus               0.8264 1.0177 1240
scale(FLII)-Leopardus wiedii                 2.2901 1.3234  131
scale(FLII)-Mazama americana                 1.0602 1.0076 1192
scale(FLII)-Mazama nemorivaga                1.9055 1.0753  945
scale(FLII)-Myoprocta pratti                 1.9615 1.0569  923
scale(FLII)-Myrmecophaga tridactyla          1.3906 1.0483  527
scale(FLII)-Nasua nasua                      1.2033 1.1621  103
scale(FLII)-Panthera onca                    2.0743 1.1265  260
scale(FLII)-Pecari tajacu                    1.2627 1.1698   58
scale(FLII)-Priodontes maximus               1.2866 1.0122  995
scale(FLII)-Procyon cancrivorous             2.0067 1.0391  884
scale(FLII)-Puma concolor                    0.6216 1.0033 1500
scale(FLII)-Puma yagouaroundi                1.9642 1.0430 1033
scale(FLII)-Tamandua tetradactyla            1.2126 1.1560  372
scale(FLII)-Tapirus pinchaque                1.0941 1.0380 1559
scale(FLII)-Tapirus terrestris               1.9714 1.2558  101
scale(FLII)-Tayassu pecari                   2.8633 1.4218   40

Detection (logit scale): 
                                          Mean     SD    2.5%     50%   97.5%
(Intercept)-Atelocynus microtis        -2.6743 0.5351 -3.8252 -2.6408 -1.7359
(Intercept)-Coendou prehensilis        -3.3453 1.0281 -5.7531 -3.2444 -1.5835
(Intercept)-Cuniculus paca             -0.6952 0.0580 -0.8076 -0.6960 -0.5826
(Intercept)-Dasyprocta fuliginosa      -0.4522 0.0688 -0.5889 -0.4532 -0.3149
(Intercept)-Dasypus sp.                -1.5173 0.1218 -1.7562 -1.5168 -1.2895
(Intercept)-Didelphis marsupialis      -2.1330 0.3416 -2.8277 -2.1198 -1.5107
(Intercept)-Eira barbara               -3.0251 0.2515 -3.5451 -3.0252 -2.5365
(Intercept)-Herpailurus yagouaroundi   -3.3452 0.7829 -4.8981 -3.3333 -1.8451
(Intercept)-Leopardus pardalis         -1.7805 0.1560 -2.1023 -1.7764 -1.4843
(Intercept)-Leopardus tigrinus         -2.1083 0.5758 -3.3441 -2.0668 -1.0822
(Intercept)-Leopardus wiedii           -3.1792 0.6916 -4.6135 -3.1100 -1.9689
(Intercept)-Mazama americana           -1.1770 0.1128 -1.4049 -1.1755 -0.9618
(Intercept)-Mazama nemorivaga          -2.0047 0.1828 -2.3783 -2.0024 -1.6531
(Intercept)-Myoprocta pratti           -1.3673 0.2396 -1.8578 -1.3634 -0.9139
(Intercept)-Myrmecophaga tridactyla    -2.9391 0.4432 -3.8466 -2.9102 -2.1469
(Intercept)-Nasua nasua                -2.9475 0.2877 -3.5400 -2.9426 -2.4032
(Intercept)-Panthera onca              -2.4681 0.2296 -2.9309 -2.4598 -2.0442
(Intercept)-Pecari tajacu              -1.2017 0.0699 -1.3401 -1.2012 -1.0725
(Intercept)-Priodontes maximus         -3.4626 0.4749 -4.3238 -3.4792 -2.5143
(Intercept)-Procyon cancrivorous       -3.3776 0.7784 -4.9916 -3.3094 -2.0134
(Intercept)-Puma concolor              -1.7118 0.1837 -2.0896 -1.7053 -1.3807
(Intercept)-Puma yagouaroundi          -3.5405 0.8884 -5.4282 -3.4740 -1.9973
(Intercept)-Tamandua tetradactyla      -3.4819 0.6150 -4.7506 -3.4647 -2.3539
(Intercept)-Tapirus pinchaque          -1.4118 0.2778 -1.9989 -1.4059 -0.9052
(Intercept)-Tapirus terrestris         -1.1007 0.0769 -1.2533 -1.0995 -0.9541
(Intercept)-Tayassu pecari             -1.6461 0.1378 -1.9192 -1.6454 -1.3878
scale(effort)-Atelocynus microtis       0.3384 0.1807 -0.0140  0.3358  0.7005
scale(effort)-Coendou prehensilis       0.3942 0.2180 -0.0322  0.3938  0.8332
scale(effort)-Cuniculus paca            0.3428 0.0667  0.2139  0.3418  0.4729
scale(effort)-Dasyprocta fuliginosa     0.4115 0.0857  0.2559  0.4082  0.5918
scale(effort)-Dasypus sp.               0.4312 0.1349  0.1806  0.4254  0.7158
scale(effort)-Didelphis marsupialis     0.5339 0.1892  0.2046  0.5174  0.9594
scale(effort)-Eira barbara              0.5083 0.1834  0.1830  0.4937  0.9130
scale(effort)-Herpailurus yagouaroundi  0.2855 0.2009 -0.1345  0.2924  0.6699
scale(effort)-Leopardus pardalis        0.4133 0.1161  0.2087  0.4082  0.6566
scale(effort)-Leopardus tigrinus        0.4339 0.2037  0.0411  0.4278  0.8532
scale(effort)-Leopardus wiedii          0.4482 0.1968  0.0934  0.4367  0.8690
scale(effort)-Mazama americana          0.5129 0.1317  0.2774  0.5050  0.7873
scale(effort)-Mazama nemorivaga         0.2820 0.1427  0.0129  0.2768  0.5722
scale(effort)-Myoprocta pratti          0.3494 0.1784  0.0073  0.3435  0.7057
scale(effort)-Myrmecophaga tridactyla   0.3838 0.1716  0.0576  0.3756  0.7478
scale(effort)-Nasua nasua               0.4963 0.1852  0.1758  0.4821  0.8841
scale(effort)-Panthera onca             0.3184 0.1366  0.0514  0.3143  0.5817
scale(effort)-Pecari tajacu             0.3564 0.0765  0.2107  0.3544  0.5081
scale(effort)-Priodontes maximus        0.2281 0.1679 -0.1010  0.2303  0.5517
scale(effort)-Procyon cancrivorous      0.4190 0.2079  0.0391  0.4112  0.8528
scale(effort)-Puma concolor             0.3127 0.1314  0.0683  0.3096  0.5739
scale(effort)-Puma yagouaroundi         0.3995 0.2093 -0.0095  0.4002  0.8294
scale(effort)-Tamandua tetradactyla     0.2691 0.1945 -0.1263  0.2682  0.6431
scale(effort)-Tapirus pinchaque         0.4913 0.1941  0.1445  0.4792  0.9340
scale(effort)-Tapirus terrestris        0.3786 0.0816  0.2220  0.3763  0.5438
scale(effort)-Tayassu pecari            0.5475 0.1308  0.3128  0.5441  0.8162
                                         Rhat  ESS
(Intercept)-Atelocynus microtis        1.0034  416
(Intercept)-Coendou prehensilis        1.1180  230
(Intercept)-Cuniculus paca             1.0073 2784
(Intercept)-Dasyprocta fuliginosa      1.0010 3000
(Intercept)-Dasypus sp.                1.0006 2743
(Intercept)-Didelphis marsupialis      1.0050 1246
(Intercept)-Eira barbara               1.0339  407
(Intercept)-Herpailurus yagouaroundi   1.0257  290
(Intercept)-Leopardus pardalis         1.0621 1576
(Intercept)-Leopardus tigrinus         1.0038  950
(Intercept)-Leopardus wiedii           1.1703  151
(Intercept)-Mazama americana           1.0003 3000
(Intercept)-Mazama nemorivaga          1.0003 2850
(Intercept)-Myoprocta pratti           1.0027 2529
(Intercept)-Myrmecophaga tridactyla    1.4129  190
(Intercept)-Nasua nasua                1.1365  186
(Intercept)-Panthera onca              1.0310  744
(Intercept)-Pecari tajacu              1.0487 2196
(Intercept)-Priodontes maximus         1.1517  186
(Intercept)-Procyon cancrivorous       1.0180  259
(Intercept)-Puma concolor              1.0004 2394
(Intercept)-Puma yagouaroundi          1.1648  249
(Intercept)-Tamandua tetradactyla      1.0191  180
(Intercept)-Tapirus pinchaque          1.0011 2767
(Intercept)-Tapirus terrestris         1.0005 3000
(Intercept)-Tayassu pecari             1.0156 1698
scale(effort)-Atelocynus microtis      0.9996 3000
scale(effort)-Coendou prehensilis      1.0007 3000
scale(effort)-Cuniculus paca           1.0027 3000
scale(effort)-Dasyprocta fuliginosa    1.0011 2777
scale(effort)-Dasypus sp.              1.0012 2851
scale(effort)-Didelphis marsupialis    1.0032 2622
scale(effort)-Eira barbara             1.0057 2601
scale(effort)-Herpailurus yagouaroundi 1.0055 2763
scale(effort)-Leopardus pardalis       1.0060 2712
scale(effort)-Leopardus tigrinus       1.0024 3000
scale(effort)-Leopardus wiedii         1.0038 2097
scale(effort)-Mazama americana         1.0032 2758
scale(effort)-Mazama nemorivaga        1.0012 3000
scale(effort)-Myoprocta pratti         1.0023 3000
scale(effort)-Myrmecophaga tridactyla  1.0009 3000
scale(effort)-Nasua nasua              1.0056 2292
scale(effort)-Panthera onca            1.0006 3000
scale(effort)-Pecari tajacu            1.0035 2792
scale(effort)-Priodontes maximus       1.0000 2640
scale(effort)-Procyon cancrivorous     1.0007 2807
scale(effort)-Puma concolor            1.0002 3000
scale(effort)-Puma yagouaroundi        1.0003 3000
scale(effort)-Tamandua tetradactyla    1.0029 2749
scale(effort)-Tapirus pinchaque        1.0042 2713
scale(effort)-Tapirus terrestris       0.9999 3000
scale(effort)-Tayassu pecari           1.0036 2745

----------------------------------------
    Spatial Covariance
----------------------------------------
         Mean     SD   2.5%     50%   97.5%   Rhat  ESS
phi-1  0.0000 0.0000 0.0000  0.0000  0.0001 3.0865   60
phi-2 10.6668 9.0147 0.0000  9.6311 26.4623 1.7523   18
phi-3  8.8243 9.0798 0.0000  6.1605 26.2962 3.9425   11
phi-4 11.9030 8.6764 0.0001 11.6079 26.7145 1.2123   45
phi-5 13.4894 7.9590 0.6382 13.2441 26.7722 0.9996 3000

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.sp$alpha.comm.samples, ref_ovl = TRUE, ci = c(50, 95))
# Occupancy community-level effects 
MCMCplot(out.sp$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.sp$beta.samples[,27:52], ref_ovl = TRUE, ci = c(50, 95))

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

# Occupancy species-level effects 
MCMCplot(out.sp$beta.samples[,79:104], 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.sp$beta.samples[,27:52] , 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.sp$beta.samples[,53:78] , 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.sp$beta.samples[,79:104] , 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:26, 1:100] 0.0331 0.0329 0.052 0.0469 0.0381 ...
 $ z.0.samples  : int [1:1500, 1:26, 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:26, 1:100] 0.0271 0.0287 0.1033 0.0633 0.0257 ...
 $ z.0.samples  : int [1:1500, 1:26, 1:100] 0 0 0 0 0 0 0 0 0 0 ...
 $ 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:26, 1:100] 0.00265 0.00346 0.00313 0.01032 0.00231 ...
 $ z.0.samples  : int [1:1500, 1:26, 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 elevation_EC

Code
#aggregate  resolution to (factor = 3)
#transform coord data to UTM
elevation_UTM <- project(elevation_EC, "EPSG:10603")
elevation_17.aggregate <- aggregate(elevation_UTM, fact=10)
res(elevation_17.aggregate)
[1] 5984.313 5984.313
Code
# Convert the SpatRaster to a data frame with coordinates
df_coords <- as.data.frame(elevation_17.aggregate, xy = TRUE)
names(df_coords) <-c("X","Y","elev")

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


############### 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, elev.pred, 0, 0)
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
Warning in predict.sfMsPGOcc(out.sp, X.0 = predict_data, df_coords[, 1:2], :
'threads' is not an argument
----------------------------------------
    Prediction description
----------------------------------------
Spatial Factor NNGP Multispecies Occupancy model with Polya-Gamma latent
variable fit with 514 observations.

Number of covariates 4 (including intercept if specified).

Using the exponential spatial correlation model.

Using 15 nearest neighbors.
Using 5 latent spatial factors.

Number of MCMC samples 3000.

Predicting at 2618 non-sampled locations.


Source compiled with OpenMP support and model fit using 1 threads.
-------------------------------------------------
        Predicting
-------------------------------------------------
Location: 100 of 2618, 3.82%
Location: 200 of 2618, 7.64%
Location: 300 of 2618, 11.46%
Location: 400 of 2618, 15.28%
Location: 500 of 2618, 19.10%
Location: 600 of 2618, 22.92%
Location: 700 of 2618, 26.74%
Location: 800 of 2618, 30.56%
Location: 900 of 2618, 34.38%
Location: 1000 of 2618, 38.20%
Location: 1100 of 2618, 42.02%
Location: 1200 of 2618, 45.84%
Location: 1300 of 2618, 49.66%
Location: 1400 of 2618, 53.48%
Location: 1500 of 2618, 57.30%
Location: 1600 of 2618, 61.12%
Location: 1700 of 2618, 64.94%
Location: 1800 of 2618, 68.75%
Location: 1900 of 2618, 72.57%
Location: 2000 of 2618, 76.39%
Location: 2100 of 2618, 80.21%
Location: 2200 of 2618, 84.03%
Location: 2300 of 2618, 87.85%
Location: 2400 of 2618, 91.67%
Location: 2500 of 2618, 95.49%
Location: 2600 of 2618, 99.31%
Location: 2618 of 2618, 100.00%
Generating latent occupancy state
Code
# extract the array of interest= occupancy
predicted_array <- out.sp.ms.pred$psi.0.samples



dim(predicted_array)
[1] 3000   26 2618
Code
# 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)
------------------------------------------------------------------------------
You have loaded plyr after dplyr - this is likely to cause problems.
If you need functions from both plyr and dplyr, please load plyr first, then dplyr:
library(plyr); library(dplyr)
------------------------------------------------------------------------------

Adjuntando el paquete: 'plyr'
The following objects are masked from 'package:dplyr':

    arrange, count, desc, failwith, id, mutate, rename, summarise,
    summarize
The following object is masked from 'package:purrr':

    compact
The following object is masked from 'package:maps':

    ozone
Code
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)

Code
# get the mean
predicted_mean <- mean(predictad_raster_stack)

plot(predicted_mean, main="mean occupancy")

Code
mapview(predicted_mean) + mapview(AP_Yasuni_UTM_line)
Code
# 

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), plyr v. 1.8.9 (Wickham 2011), 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] plyr_1.8.9        abind_1.4-8       lubridate_1.9.4   forcats_1.0.0    
 [5] stringr_1.5.2     dplyr_1.1.4       purrr_1.1.0       readr_2.1.5      
 [9] tidyr_1.3.1       tibble_3.2.1      ggplot2_4.0.0     tidyverse_2.0.0  
[13] spOccupancy_0.8.0 camtrapR_3.0.0    snowfall_1.84-6.3 snow_0.4-4       
[17] beepr_2.0         coda_0.19-4.1     MCMCvis_0.16.3    tictoc_1.2.1     
[21] bayesplot_1.14.0  elevatr_0.99.0    terra_1.8-70      tmap_4.2         
[25] maps_3.4.3        mapview_2.11.4    sf_1.0-21         DT_0.34.0        
[29] readxl_1.4.3      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] cachem_1.1.0            stars_0.6-8             uuid_1.2-1             
 [31] mime_0.13               lifecycle_1.0.4         iterators_1.0.14       
 [34] pkgconfig_2.0.3         cols4all_0.8-1          Matrix_1.7-1           
 [37] R6_2.6.1                fastmap_1.2.0           shiny_1.9.1            
 [40] digest_0.6.37           colorspace_2.1-1        leafem_0.2.4           
 [43] crosstalk_1.2.1         labeling_0.4.3          lwgeom_0.2-14          
 [46] progressr_0.15.0        spacesXYZ_1.6-0         timechange_0.3.0       
 [49] httr_1.4.7              mgcv_1.9-1              compiler_4.4.2         
 [52] microbenchmark_1.5.0    proxy_0.4-27            withr_3.0.2            
 [55] doParallel_1.0.17       backports_1.5.0         brew_1.0-10            
 [58] S7_0.2.0                DBI_1.2.3               logger_0.4.0           
 [61] MASS_7.3-61             maptiles_0.10.0         tmaptools_3.3          
 [64] leaflet_2.2.3           classInt_0.4-11         tools_4.4.2            
 [67] units_0.8-7             leaflegend_1.2.1        httpuv_1.6.16          
 [70] glue_1.8.0              satellite_1.0.5         nlme_3.1-166           
 [73] promises_1.3.3          grid_4.4.2              checkmate_2.3.2        
 [76] reshape2_1.4.4          generics_0.1.3          leaflet.providers_2.0.0
 [79] gtable_0.3.6            tzdb_0.4.0              shinyBS_0.61.1         
 [82] class_7.3-22            data.table_1.17.8       hms_1.1.3              
 [85] sp_2.2-0                RANN_2.6.2              foreach_1.5.2          
 [88] pillar_1.11.1           posterior_1.6.1         later_1.4.2            
 [91] splines_4.4.2           lattice_0.22-6          tidyselect_1.2.1       
 [94] knitr_1.50              svglite_2.1.3           stats4_4.4.2           
 [97] xfun_0.52               shinydashboard_0.7.3    leafpop_0.1.0          
[100] stringi_1.8.4           rematch_2.0.0           yaml_2.3.10            
[103] boot_1.3-31             evaluate_1.0.4          codetools_0.2-20       
[106] cli_3.6.5               RcppParallel_5.1.9      systemfonts_1.1.0      
[109] xtable_1.8-4            jquerylib_0.1.4         secr_5.1.0             
[112] dichromat_2.0-0.1       Rcpp_1.1.0              spAbundance_0.2.1      
[115] png_0.1-8               XML_3.99-0.18           parallel_4.4.2         
[118] prettyunits_1.2.0       lme4_1.1-35.5           mvtnorm_1.3-2          
[121] scales_1.4.0            e1071_1.7-16            crayon_1.5.3           
[124] 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. 2011. “The Split-Apply-Combine Strategy for Data Analysis.” Journal of Statistical Software 40 (1): 1–29. https://www.jstatsoft.org/v40/i01/.
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 = {Fitting a {Spatial} {Factor} {Multi-Species} {Occupancy}
    {Model}},
  date = {2025-08-16},
  url = {https://dlizcano.github.io/Occu_APs_all/blog/2025-10-15-analysis/},
  langid = {en}
}
For attribution, please cite this work as:
Forero, German, Robert Wallace, Galo Zapara-Rios, Emiliana Isasi-Catalá, and Diego J. Lizcano. 2025. “Fitting a Spatial Factor Multi-Species Occupancy Model.” August 16, 2025. https://dlizcano.github.io/Occu_APs_all/blog/2025-10-15-analysis/.