Multispecies occupancy model from Rota et al. (2016), for two (or more) interacting species.
Rota, C.T., et al. 2016. A multi-species occupancy model for two or more interacting species. Methods in Ecology and Evolution 7: 1164-1173.
The model generalizes the standard single-species occupancy model from MacKenzie et al. (2002), as a multispecies occupancy model designed for analyzing presence/absence data of two or more interacting species. It builds upon the standard single-species occupancy model by incorporating the potential for interactions between species. The model estimates occupancy probabilities for each species (Marginal occupancy), as well as the strength and direction of interactions between them (conditional occupancy), and can also incorporate the effects of environmental covariates.
On the interpretation of interaction term see this link: https://groups.google.com/g/unmarked/c/W3xceS-hSNA/m/8OvCD93BAQAJ
If the estimate of species1:species2 intercept is positive, then species 1 has greater occupancy probability at sites occupied by species 2. The reverse is also true: species 2 has greater occupancy at sites occupied by species 1. It might be more helpful to think about the value of the parameter it this way: are species 1 and 2 likely to occupy the same sites (species1:species2 positive), different sites (species1:species2 negative), or be independent of each other (species1:species2 = 0)?
We used Leopardus pardinoides and domestic dog data from 10 regions across the Colombian Andes, sampled with arrays of 20 to 60 camera traps, to exploring evidence for interactions with domestic dog while accounting for the effects of environmental variables and imperfect detection.
Cargar paquetes
codigo R
library(knitr)
library(mapview) # mapas facil
library(readxl) #leer datos
library(readr) # lee datos
library(sf) # vector map
library(geodata) # replace getData de raster para Terra
library(raster) # mapas raster
library(spatstat) # interpola mapa
# library(maptools) # to coerce to ppp. note that 'maptools' will be retired by the end of 2023
# library(rgdal) # rgdal will be retired during 2023 #some tricks to change projection
# library(stars)
# library(unmarked) # occu models
library(DT) # html table
library(camtrapR) # camera trap data creation
library(terra) # new raster
library(elevatr) # get elevation
library(DT) # tables
library (tmap) # nice maps
library(rnaturalearth) # colombia map
library(grateful) # citation packages
library(tidyverse) # maneja datos
# source("C:/CodigoR/tigrinus2/R/organizadato.R") # old version
source("C:/CodigoR/WCS-CameraTrap/R/organiza_datos_v3.R") # new version
Cargar datos
Ucumari, Pitalito, La cocha1, La Fe, Rio Grande, La cocha2, Ituango, Chingaza, Saldaña y Bogotá.
codigo R
<- read_excel("D:/BoxFiles/Box Sync/CodigoR/tigrinus/data/Full_data_Ucumari_Huila_Cocha1_Cocha2.xlsx",
Full_data_ucu sheet = "ucumari", col_types = c("numeric",
"text", "text", "text", "text", "text",
"text", "text", "text", "text", "text",
"text", "text", "text", "text", "numeric",
"text", "text", "text", "text", "text",
"text", "text", "text", "text", "numeric",
"numeric", "numeric", "numeric",
"text"))
<- read_csv("D:/BoxFiles/Box Sync/CodigoR/tigrinus/data/huila_merged.csv",
Full_data_pitalito col_types = cols(`Date_Time Captured` = col_character(),
camera_trap_start_date = col_character(),
camera_trap_end_date = col_character()))
<- read_csv("D:/BoxFiles/Box Sync/CodigoR/tigrinus/data/huila_merged.csv",
Full_data_pitalito col_types = cols(`Date_Time Captured` = col_character(),
camera_trap_start_date = col_character(),
camera_trap_end_date = col_character()))
<- read_csv("D:/BoxFiles/Box Sync/CodigoR/tigrinus/data/Cocha1_merged.csv",
Full_data_cocha1 col_types = cols(camera_trap_start_date = col_character(),
camera_trap_end_date = col_character()))
<- read_csv("D:/BoxFiles/Box Sync/CodigoR/tigrinus/data/Cocha_2.csv",
Full_data_cocha2 col_types = cols(camera_trap_start_date = col_character(),
"Photo time" = col_character(),
"Photo Date" = col_character(),
camera_trap_end_date = col_character()))
$camera_trap <- Full_data_cocha2$`Camera Trap Name`
Full_data_cocha2
<- read_excel("C:/CodigoR/tigrinus2/data/cuencaverde.xlsx", sheet = "LaFe_2021")
lafe_data
$year <- year(lafe_data$Photo_Date)
lafe_data
# filter by 2021
# lafe_data <- lafe_data_raw %>% filter(year == "2021")
<- read_excel("C:/CodigoR/tigrinus2/data/cuencaverde.xlsx",
riogrande_data sheet = "Riogrande_completo") |> mutate(yr=year(Photo_Date)) |> filter(yr==2021)
<- read_excel("D:/BoxFiles/Box Sync/CodigoR/tigrinus3/Ituango/Base de Datos Final.xlsx",
ituango_data sheet = "Datos_camaras12-07-2015") |> mutate(yr=Year) |> filter(yr==2015) |> filter (MES>=3 & MES<=6)
# Dista Casa Ituango en ituango_cov_occ
<- read_csv("C:/CodigoR/tigrinus2/data/ituango_cov_occ.csv")
ituango_dis_casa
<- read_excel("D:/BoxFiles/Box Sync/CodigoR/tigrinus3/Chingaza/tigrinus_Perros_PNNChingaza.xlsx") |>
chingaza mutate(scientificName = paste(Genus, Species, sep= " "))
$year <- lubridate::year(chingaza$Photo_date)
chingaza<- chingaza |> filter(chingaza$Photo_date <= "2020-01-31")
chingaza_data
#### usar Det_Hist_diario_cf_Ch_1year_.csv Det_Hist_diario_Lt_Ch_1year_.csv historias deteccion de ituango
<- read_csv("C:/CodigoR/tigrinus2/data/perro_Saldania.csv")
perro_Saldania <- read_csv("C:/CodigoR/tigrinus2/data/tigrinus_Saldania.csv")
tigrinus_Saldania
###############
<- read_csv("D:/BoxFiles/Box Sync/CodigoR/tigrinus/data/dist_casas_Bogota.csv")
casas_Bogota
<- read_csv("D:/BoxFiles/Box Sync/CodigoR/tigrinus/data/Perros_Bog_occ_7D_BAY_bloques_edited.csv") |> left_join(casas_Bogota) |> as.data.frame()
perro_Bogota row.names(perro_Bogota) <- perro_Bogota$camera_trap
<- read_csv("D:/BoxFiles/Box Sync/CodigoR/tigrinus/data/Tigrillo_Bog_occ_7D_BAY_bloques_edited.csv") |> left_join(casas_Bogota) |> as.data.frame()
tigrinus_Bogota row.names(tigrinus_Bogota) <- tigrinus_Bogota$camera_trap
<- read_csv("D:/BoxFiles/Box Sync/CodigoR/tigrinus/data/effort_Bog_occ_7D_BAY_bloques_edited.csv") |> left_join(casas_Bogota) |> as.data.frame()
effort_Bogota row.names(effort_Bogota) <- effort_Bogota$camera_trap
Get elevation and distance covariates
falta: to include forest (GFW) cover y huella humana
codigo R
#casas <- read_csv("C:/CodigoR/tigrinus2/data/casas.csv")
# casas_sf <- st_as_sf(casas, coords = c("lon", "lat"), crs = "EPSG:4326")
<- st_read("C:/CodigoR/tigrinus2/data/casas.shp")
casas_sf
############# start spatial part
#### make sf object
<- Full_data_ucu |>
ucumari select("Latitude",
"Longitude",
"camera_trap") |>
::distinct( ) |>
dplyrmutate(region="Ucumari RP")
<- Full_data_pitalito |>
pitalito select("Latitude",
"Longitude",
"camera_trap") |>
::distinct( ) |>
dplyrmutate(region="Pitalito")
<- Full_data_cocha1 |>
cocha1 select("Latitude",
"Longitude",
"camera_trap") |>
::distinct( ) |>
dplyrmutate(region="Cocha1")
<- Full_data_cocha2 |>
cocha2 select("Latitude",
"Longitude",
"camera_trap") |>
::distinct( ) |>
dplyrmutate(region="Cocha2")
<- lafe_data |>
lafe select("Latitude",
"Longitude",
"camera_trap") |>
::distinct( ) |>
dplyrmutate(region="La Fe")
<- riogrande_data |>
riogrande select("Latitude",
"Longitude",
"camera_trap") |>
::distinct( ) |>
dplyrmutate(region="Rio Grande")
<- ituango_data |>
ituango select("Latitude",
"Longitude",
"camera_trap") |>
::distinct( ) |>
dplyrmutate(region="Ituango")
<- chingaza_data |>
chingaza select("Latitude",
"Longitude",
"camera_trap") |>
::distinct( ) |>
dplyrmutate(region="Chingaza NP")
<- tigrinus_Saldania |> mutate(camera_trap=deployment_id_cam) |>
saldania mutate(Longitude=longitude) |>
mutate(Latitude=latitude) |>
select("Latitude",
"Longitude",
"camera_trap") |>
::distinct( ) |>
dplyrmutate(region="Saldaña")
<- tigrinus_Bogota |>
bogota select("Latitude",
"Longitude",
"camera_trap") |>
mutate(region="Bogota")
# join
<- rbind(ucumari,
puntos
pitalito,
cocha1,
lafe,
riogrande,
ituango,
cocha2,
chingaza,
saldania,
bogota)
################
# plot map
################
#
# pal = mapviewPalette("mapviewTopoColors") #color palete
#
# mapview(elev_ucu_ras) +
# mapview(casa_dist_rast, col.regions = pal(100), at = seq(600, 240000, 100), legend = TRUE) +
# mapview(puntos_sf["camera_trap"])
############### end spatial part
Crerar historias detección
codigo R
# make species names
$binomial <- str_c (Full_data_ucu$Genus, "_", Full_data_ucu$Species)
Full_data_ucu
$binomial <- Full_data_pitalito$`Genus Species`
Full_data_pitalito
# #funcion para crear todas las tablas de datos
# all_data_ucu <- f.matrix.creator2 (Full_data_ucu)
#
# # names(all_data) # ver lass especies y en que lista esta cada una
# # kable(names(all_data)) # html table
# # Tigrinus es lista 8
#
# datatable(
# data = as.data.frame(names(all_data_ucu)),
# caption = "Especies Ucumari",
# filter = "top"
# )
# fix date format
# Ucumari
$start_date <- as.Date(Full_data_ucu$"camera_trap_start_date", "%Y-%m-%d")
Full_data_ucu$end_date <- as.Date(Full_data_ucu$"camera_trap_end_date", "%Y-%m-%d")
Full_data_ucu$eventDate <- as.Date(Full_data_ucu$"Photo_Date", "%Y-%m-%d")
Full_data_ucu$eventDateTime <- ymd_hms(paste(Full_data_ucu$"Photo_Date", Full_data_ucu$"Photo time", sep=" "))
Full_data_ucu# rename camera id
$camid <- Full_data_ucu$`camera_trap`
Full_data_ucu
# Pitalito
$start_date <- as.Date(Full_data_pitalito$"camera_trap_start_date", "%Y-%m-%d")
Full_data_pitalito$end_date <- as.Date(Full_data_pitalito$"camera_trap_end_date", "%Y-%m-%d")
Full_data_pitalito# Full_data_pitalito$eventDate <- as.Date(Full_data_pitalito$, "%Y-%m-%d")
$eventDateTime <- ymd_hms(Full_data_pitalito$`Date_Time Captured`)
Full_data_pitalito# rename camera id
$camid <- Full_data_pitalito$camera_trap
Full_data_pitalito
# La Fe
$start_date <- as.Date(lafe_data$"camera_trap_start_date", "%Y-%m-%d")
lafe_data$end_date <- as.Date(lafe_data$"camera_trap_end_date", "%Y-%m-%d")
lafe_data$eventDate <- as.Date(lafe_data$Photo_Date, "%Y-%m-%d")
lafe_data
$eventDateTime <- ymd_hms(paste(lafe_data$"Photo_Date", lafe_data$"Photo time", sep=" "))# rename camera id
lafe_data$camid <- lafe_data$camera_trap
lafe_data
# Rio Grande
$start_date <- as.Date(riogrande_data$"camera_trap_start_date", "%Y-%m-%d")
riogrande_data$end_date <- as.Date(riogrande_data$"camera_trap_end_date", "%Y-%m-%d")
riogrande_data$eventDate <- as.Date(riogrande_data$Photo_Date, "%Y-%m-%d")
riogrande_data
$eventDateTime <- lubridate::ymd_hm(paste(
riogrande_dataas.Date(riogrande_data$"Photo_Date", "%Y-%m-%d"),
$"Photo time",
riogrande_datasep=" "),
tz = "America/Bogota")
# rename camera id
$camid <- riogrande_data$camera_trap
riogrande_data
# Ituango add start end
$start_date <- as.Date("2015-03-01", "%Y-%m-%d")
ituango_data$end_date <- as.Date("2015-06-30", "%Y-%m-%d")
ituango_data$eventDate <- as.Date(
ituango_datapaste(ituango_data$Year,
$MES,
ituango_data$DIA,
ituango_datasep="-"
"%Y-%m-%d")
),
$eventDateTime <- lubridate::ymd_hm(paste(
ituango_dataas.character(ituango_data$eventDate),
$"HORA",
ituango_datasep=" "),
tz = "America/Bogota")
# rename camera id
$camid <- ituango_data$camera_trap
ituango_data
# Chingaza
$start_date <- as.Date("2019-09-26", "%Y-%m-%d")# as.Date(chingaza_data$"Camera Start Date", "%Y-%m-%d")
chingaza_data$eventDateTime <- lubridate::ymd_hms(
chingaza_datapaste(
as.character(chingaza_data$Photo_date),
$Photo_time,
chingaza_datasep=" ")
#tz = "America/Bogota",
)
$end_date <- NA
chingaza_data# loop to fix dates
for (i in 1:length(chingaza_data$"Camera End Date")) {
if (chingaza_data$"Camera End Date"[i]<="2020-01-31") {
$end_date[i] = as.Date(chingaza_data$"Camera End Date", "%Y-%m-%d")[i]
chingaza_dataelse {
} $end_date[i] = as.Date("2020-02-01", "%Y-%m-%d")
chingaza_data
}# print(chingaza_data$end_date[i])
}$end_date <- as.Date(chingaza_data$end_date)
chingaza_data#as.Date("2020-09-01", "%Y-%m-%d")
# rename camera id
$camid <- chingaza_data$camera_trap
chingaza_data
# filter 2021 and make uniques
<- Full_data_ucu |> dplyr::group_by(camid) |> #(array_locID) |>
ucu_CToperation mutate(minStart=start_date, maxEnd=end_date) |> distinct(Longitude, Latitude, minStart, maxEnd) |> dplyr::ungroup()
# remove one duplicated
# View(CToperation)
# CToperation <- CToperation[-15,]
<- Full_data_pitalito |> dplyr::group_by(camid) |> #(array_locID) |>
pitalito_CToperation mutate(minStart=start_date, maxEnd=end_date) |> distinct(Longitude, Latitude, minStart, maxEnd) |> dplyr::ungroup()
<- lafe_data |> dplyr::group_by(camid) |> #(array_locID) |>
lafe_CToperation mutate(minStart=start_date, maxEnd=end_date) |> distinct(Longitude, Latitude, minStart, maxEnd) |> dplyr::ungroup()
### selecting 2021
<- riogrande_data |>
riogrande_CToperation ::group_by(camid) |> #(array_locID) |>
dplyrmutate(minStart=start_date, maxEnd=end_date) |> distinct(Longitude, Latitude, minStart, maxEnd) |> dplyr::ungroup()
<- ituango_data |>
ituango_CToperation ::group_by(camid) |> #(array_locID) |>
dplyrmutate(minStart=start_date, maxEnd=end_date) |> distinct(Longitude, Latitude, minStart, maxEnd) |> dplyr::ungroup()
<- chingaza_data |>
chingaza_CToperation ::group_by(camid) |> #(array_locID) |>
dplyrmutate(minStart=start_date, maxEnd=end_date) |> distinct(Longitude, Latitude, minStart, maxEnd) |> dplyr::ungroup()
# remove dos problematic in lafe
# lafe_CToperation <- lafe_CToperation[-c(28,29),]
# Generamos la matríz de operación de las cámaras
<- cameraOperation(CTtable= ucu_CToperation, # Tabla de operación
ucu_camop stationCol= "camid", # 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")
<- cameraOperation(CTtable= pitalito_CToperation, # Tabla de operación
pitalito_camop stationCol= "camid", # 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")
<- cameraOperation(CTtable= lafe_CToperation, # Tabla de operación
lafe_camop stationCol= "camid", # 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")
<- cameraOperation(CTtable= riogrande_CToperation, # Tabla de operación
riogrande_camop stationCol= "camid", # 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")
<- cameraOperation(CTtable= ituango_CToperation, # Tabla de operación
ituango_camop stationCol= "camid", # 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")
<- cameraOperation(CTtable= chingaza_CToperation, # Tabla de operación
chingaza_camop stationCol= "camid", # 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 problem species
$scientificName <- paste(Full_data_ucu$Genus,
Full_data_ucu$Species,
Full_data_ucusep=" ")
#### remove setups
<- which(Full_data_ucu$scientificName=="NA NA")
ucu_ind <- Full_data_ucu[-ucu_ind,]
Full_data_ucu
# ind <- which(Ecu_full$scientificName=="Set up")
# Ecu_full <- Ecu_full[-ind,]
#
# ind <- which(Ecu_full$scientificName=="Blank")
# Ecu_full <- Ecu_full[-ind,]
#
# ind <- which(Ecu_full$scientificName=="Unidentifiable")
# Ecu_full <- Ecu_full[-ind,]
$scientificName <- Full_data_pitalito$`Genus Species`
Full_data_pitalito
#### remove setups and NAs
<- which(is.na(Full_data_pitalito$scientificName))
pitalito_ind <- Full_data_pitalito[-pitalito_ind,]
Full_data_pitalito
# fix lafe
$scientificName <- lafe_data$binomial
lafe_data# fix riogrande
$scientificName <- riogrande_data$binomial
riogrande_data
#### remove setups and NAs
<- which(riogrande_data$scientificName=="NA_NA")
riogrande_data_ind <- riogrande_data[-riogrande_data_ind,]
riogrande_data
#### remove setups and NAs
<- which(ituango_data$scientificName=="NA")
ituango_data_ind <- ituango_data[-ituango_data_ind,]
ituango_data
############### Ucu
<- lapply(unique(Full_data_ucu$scientificName), FUN = function(x) {
ucu_DetHist_list detectionHistory(
recordTable = Full_data_ucu, # tabla de registros
camOp = ucu_camop, # Matriz de operación de cámaras
stationCol = "camid",
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 = 8, # 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(ucu_DetHist_list) <- unique(Full_data_ucu$scientificName)
# Finalmente creamos una lista nueva donde estén solo las historias de detección
<- lapply(ucu_DetHist_list, FUN = function(x) x$detection_history)
ucumari_ylist # otra lista con effort scaled
<- lapply(ucu_DetHist_list, FUN = function(x) x$effort)
ucumari_efort
# number of observetions per sp, collapsed to 7 days
# lapply(ylist, sum, na.rm = TRUE)
# leopardus tigrinus 7
# canis 18
############## Pitalito
<- lapply(unique(Full_data_pitalito$scientificName), FUN = function(x) {
pitalito_DetHist_list detectionHistory(
recordTable = Full_data_pitalito, # tabla de registros
camOp = pitalito_camop, # Matriz de operación de cámaras
stationCol = "camid",
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 = 6, # Colapso de las historias a 10 dí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(pitalito_DetHist_list) <- unique(Full_data_pitalito$scientificName)
# Finalmente creamos una lista nueva donde estén solo las historias de detección
<- lapply(pitalito_DetHist_list, FUN = function(x) x$detection_history)
pitalito_ylist # otra lista con effort scaled
<- lapply(pitalito_DetHist_list, FUN = function(x) x$effort)
pitalito_efort
# perro 41
# tigrinus 5
############## La Fe
# lafe_data <- lafe_data |>
# filter(camid != "Palmas_Ladera") |>
# filter(camid != "Abuel_Ladera")
<- lapply(unique(lafe_data$scientificName), FUN = function(x) {
lafe_DetHist_list detectionHistory(
recordTable = lafe_data, # tabla de registros
camOp = lafe_camop, # Matriz de operación de cámaras
stationCol = "camid",
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 dí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(lafe_DetHist_list) <- unique(lafe_data$scientificName)
# Finalmente creamos una lista nueva donde estén solo las historias de detección
<- lapply(lafe_DetHist_list, FUN = function(x) x$detection_history)
lafe_ylist # otra lista con effort scaled
<- lapply(lafe_DetHist_list, FUN = function(x) x$effort)
lafe_efort
# perro 2
# tigrinus 3
############## Rio Grande
# lafe_data <- lafe_data |>
# filter(camid != "Palmas_Ladera") |>
# filter(camid != "Abuel_Ladera")
<- lapply(unique(riogrande_data$scientificName), FUN = function(x) {
riogrande_DetHist_list detectionHistory(
recordTable = riogrande_data, # tabla de registros
camOp = riogrande_camop, # Matriz de operación de cámaras
stationCol = "camid",
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 = 8, # Colapso de las historias a 10 dí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(riogrande_DetHist_list) <- unique(riogrande_data$scientificName)
# Finalmente creamos una lista nueva donde estén solo las historias de detección
<- lapply(riogrande_DetHist_list, FUN = function(x) x$detection_history)
riogrande_ylist # otra lista con effort scaled
<- lapply(riogrande_DetHist_list, FUN = function(x) x$effort)
riogrande_efort
# perro 2
# tigrinus 3
############## Ituango
# lafe_data <- lafe_data |>
# filter(camid != "Palmas_Ladera") |>
# filter(camid != "Abuel_Ladera")
<- lapply(unique(ituango_data$scientificName), FUN = function(x) {
ituango_DetHist_list detectionHistory(
recordTable = ituango_data, # tabla de registros
camOp = ituango_camop, # Matriz de operación de cámaras
stationCol = "camid",
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 = 13, # Colapso de las historias a 10 dí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(ituango_DetHist_list) <- unique(ituango_data$scientificName)
# Finalmente creamos una lista nueva donde estén solo las historias de detección
<- lapply(ituango_DetHist_list, FUN = function(x) x$detection_history)
ituango_ylist # otra lista con effort scaled
<- lapply(ituango_DetHist_list, FUN = function(x) x$effort)
ituango_efort
# perro 5
# tigrinus 26
<- lapply(unique(chingaza_data$scientificName), FUN = function(x) {
chingaza_DetHist_list detectionHistory(
recordTable = chingaza_data, # tabla de registros
camOp = chingaza_camop, # Matriz de operación de cámaras
stationCol = "camid",
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 = 13, # Colapso de las historias a 10 dí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(chingaza_DetHist_list) <- unique(chingaza_data$scientificName)
# Finalmente creamos una lista nueva donde estén solo las historias de detección
<- lapply(chingaza_DetHist_list, FUN = function(x) x$detection_history)
chingaza_ylist # otra lista con effort scaled
<- lapply(chingaza_DetHist_list, FUN = function(x) x$effort)
chingaza_efort
# perro 1
# tigrinus 2
Cocha data
codigo R
# fix dates
$start_date <- as.Date(Full_data_cocha1$"camera_trap_start_date", "%Y-%m-%d")
Full_data_cocha1$end_date <- as.Date(Full_data_cocha1$"camera_trap_end_date", "%Y-%m-%d")
Full_data_cocha1$eventDateTime <- Full_data_cocha1$Date_Time #, "%Y-%m-%d")
Full_data_cocha1# remove NA in datetime
# Full_data_cocha1$eventDateTime <- ymd_hms(paste(Full_data_cocha1$"Photo_Date", Full_data_cocha1$"Photo time", sep=" "))
# rename camera id
$camid <- Full_data_cocha1$`camera_trap`
Full_data_cocha1
# filter 2021 and make uniques
<- Full_data_cocha1 |> dplyr::group_by(camid) |> #(array_locID) |>
cocha1_CToperation mutate(minStart=start_date, maxEnd=end_date) |> distinct(Longitude, Latitude, minStart, maxEnd) |> dplyr::ungroup()
# remove one duplicated
# View(CToperation)
# CToperation <- CToperation[-15,]
# Generamos la matríz de operación de las cámaras
<- cameraOperation(CTtable= cocha1_CToperation, # Tabla de operación
cocha1_camop stationCol= "camid", # 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 problem species
$scientificName <- Full_data_cocha1$`Genus Species`
Full_data_cocha1
#### remove setups
<- which(is.na((Full_data_cocha1$scientificName)))
cocha1_ind <- Full_data_cocha1[-cocha1_ind,]
Full_data_cocha1
# ind <- which(Ecu_full$scientificName=="Set up")
# Ecu_full <- Ecu_full[-ind,]
#
# ind <- which(Ecu_full$scientificName=="Blank")
# Ecu_full <- Ecu_full[-ind,]
#
# ind <- which(Ecu_full$scientificName=="Unidentifiable")
# Ecu_full <- Ecu_full[-ind,]
############### cocha1
<- lapply(unique(Full_data_cocha1$scientificName), FUN = function(x) {
cocha1_DetHist_list detectionHistory(
recordTable = Full_data_cocha1, # abla de registros
camOp = cocha1_camop, # Matriz de operación de cámaras
stationCol = "camid",
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 = 8, # 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(cocha1_DetHist_list) <- unique(Full_data_cocha1$scientificName)
# Finalmente creamos una lista nueva donde estén solo las historias de detección
<- lapply(cocha1_DetHist_list, FUN = function(x) x$detection_history)
cocha1_ylist # otra lista con effort scaled
<- lapply(cocha1_DetHist_list, FUN = function(x) x$effort)
cocha1_efort
# number of observetions per sp, collapsed to 7 days
# lapply(ylist, sum, na.rm = TRUE)
# leopardus tigrinus 9
# canis 1
############################
#### Cocha 2
############################
# fix dates
$start_date <- as.Date(Full_data_cocha2$"camera_trap_start_date", "%Y-%m-%d")
Full_data_cocha2$end_date <- as.Date(Full_data_cocha2$"camera_trap_end_date", "%Y-%m-%d")
Full_data_cocha2
$eventDateTime <- ymd_hms(paste(Full_data_cocha2$"Photo Date", Full_data_cocha2$"Photo time", sep=" "))
Full_data_cocha2
# remove NA in datetime
# Full_data_cocha1$eventDateTime <- ymd_hms(paste(Full_data_cocha1$"Photo_Date", Full_data_cocha1$"Photo time", sep=" "))
# rename camera id
$camid <- Full_data_cocha2$`Camera Trap Name`
Full_data_cocha2
# filter 2021 and make uniques
<- Full_data_cocha2 |> dplyr::group_by(camid) |> #(array_locID) |>
cocha2_CToperation mutate(minStart=start_date, maxEnd=end_date) |> distinct(Longitude, Latitude, minStart, maxEnd) |> dplyr::ungroup()
# remove one duplicated
# View(CToperation)
# CToperation <- CToperation[-15,]
# Generamos la matríz de operación de las cámaras
<- cameraOperation(CTtable= cocha2_CToperation, # Tabla de operación
cocha2_camop stationCol= "camid", # 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 problem species
$scientificName <- Full_data_cocha2$`Genus Species`
Full_data_cocha2
#### remove setups
<- which(is.na((Full_data_cocha2$scientificName)))
cocha2_ind <- Full_data_cocha2[-cocha2_ind,]
Full_data_cocha2
# ind <- which(Ecu_full$scientificName=="Set up")
# Ecu_full <- Ecu_full[-ind,]
############### cocha2
<- lapply(unique(Full_data_cocha2$scientificName), FUN = function(x) {
cocha2_DetHist_list detectionHistory(
recordTable = Full_data_cocha2, # abla de registros
camOp = cocha2_camop, # Matriz de operación de cámaras
stationCol = "camid",
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 = 13, # 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(cocha2_DetHist_list) <- unique(Full_data_cocha2$scientificName)
# Finalmente creamos una lista nueva donde estén solo las historias de detección
<- lapply(cocha2_DetHist_list, FUN = function(x) x$detection_history)
cocha2_ylist # otra lista con effort scaled
<- lapply(cocha2_DetHist_list, FUN = function(x) x$effort)
cocha2_efort
# number of observetions per sp, collapsed to 7 days
# lapply(ylist, sum, na.rm = TRUE)
# leopardus tigrinus 29
# canis NA
# Pitalito
# perro 41
# tigrinus 5
Data assembly
codigo R
#### Cocha 2
<- cocha2_ylist[[29]] |> as.data.frame()
tigrinus_cocha2 <- cocha2_efort[[29]] |> as.data.frame() |>
effort_cocha2 mutate(across(everything(), ~replace_na(., 0))) # replace NA to 0
# perro no hay en cocha2
<- cocha2_ylist[[29]]
my_vector <- ifelse(my_vector == 1, 0, my_vector) |> as.data.frame() # convert 1 to 0
perros_cocha2
#### Cocha 1
<- cocha1_ylist[[9]] |> as.data.frame()
tigrinus_cocha1 <- cocha1_efort[[9]] |> as.data.frame() |>
effort_cocha1 mutate(across(everything(), ~replace_na(., 0))) # replace NA to 0
# si hay perro en cocha2
# my_vector <- tigrinus_cocha2
<- cocha1_ylist[[1]] |> as.data.frame()# ifelse(my_vector == 1, 0, my_vector) # convert 1 to 0
perros_cocha1
#### LaFe
<- lafe_ylist[[3]] |> as.data.frame()
tigrinus_lafe <- lafe_efort[[3]] |> as.data.frame()|>
effort_lafe mutate(across(everything(), ~replace_na(., 0))) # replace NA to 0
# my_vector <- tigrinus_cocha2
<- lafe_ylist[[2]] |> as.data.frame() # ifelse(my_vector == 1, 0, my_vector) # convert 1 to 0
perros_lafe
# perro 2
# tigrinus 3
#### Rio Grande
<- riogrande_ylist[[11]] |> as.data.frame()
tigrinus_riogrande <- riogrande_efort[[11]] |> as.data.frame()|>
effort_riogrande mutate(across(everything(), ~replace_na(., 0))) # replace NA to 0
# my_vector <- tigrinus_cocha2
<- riogrande_ylist[[1]] |> as.data.frame() # ifelse(my_vector == 1, 0, my_vector) # convert 1 to 0
perros_riogrande
# perro 1
# tigrinus 11
#### Ituango
<- ituango_ylist[[26]] |> as.data.frame()
tigrinus_ituango <- ituango_efort[[26]] |> as.data.frame()|>
effort_ituango mutate(across(everything(), ~replace_na(., 0))) # replace NA to 0
# my_vector <- tigrinus_cocha2
<- ituango_ylist[[5]] |> as.data.frame() # ifelse(my_vector == 1, 0, my_vector) # convert 1 to 0
perros_ituango
# perro 5
# tigrinus 26
#### Chingaza
<- chingaza_ylist[[2]] |> as.data.frame()
tigrinus_chingaza <- chingaza_efort[[2]] |> as.data.frame()|>
effort_chingaza mutate(across(everything(), ~replace_na(., 0))) # replace NA to 0
# my_vector <- tigrinus_cocha2
<- chingaza_ylist[[1]] |> as.data.frame() # ifelse(my_vector == 1, 0, my_vector) # convert 1 to 0
perros_chingaza
# perro 1
# tigrinus 2
#### Pitalito
<- pitalito_ylist[[5]] |> as.data.frame()
tigrinus_pitalito <- pitalito_efort[[5]] |> as.data.frame()|>
effort_pitalito mutate(across(everything(), ~replace_na(., 0))) # replace NA to 0
# my_vector <- tigrinus_cocha2
<- pitalito_ylist[[41]] |> as.data.frame() # ifelse(my_vector == 1, 0, my_vector) # convert 1 to 0
perros_pitalito
# perro 41
# tigrinus 5
######### Ucumari
<- ucumari_ylist[[7]] |> as.data.frame()
tigrinus_ucumari <- ucumari_efort[[7]] |> as.data.frame()|>
effort_ucumari mutate(across(everything(), ~replace_na(., 0))) # replace NA to 0
# my_vector <- tigrinus_cocha2
<- ucumari_ylist[[18]] |> as.data.frame() # ifelse(my_vector == 1, 0, my_vector) # convert 1 to 0
perros_ucumari
# leopardus tigrinus 7
# canis 18
################# Saldania
<- tigrinus_Saldania[1:11] |>
tigrinus_saldania column_to_rownames(var = "...1") |>
as.data.frame()
<- perro_Saldania[1:11] |>
perros_saldania column_to_rownames(var = "...1") |>
as.data.frame()
<- tigrinus_Saldania[15:24] |>
effort_Saldania # column_to_rownames(var = "...1") |>
as.data.frame()
row.names(effort_Saldania) <- row.names(tigrinus_saldania)
names(tigrinus_saldania) <- c("o1","o2","o3","o4","o5", "o6","o7","o8","o9","o10")
names(perros_saldania) <- c("o1","o2","o3","o4","o5", "o6","o7","o8","o9","o10")
names(effort_Saldania) <- c("o1","o2","o3","o4","o5", "o6","o7","o8","o9","o10")
# fix tigrinus_pitalito to complete 11 ocasiones
# tigrinus_pitalito$o11 <- NA
# perros_pitalito$o11 <- NA
# effort_pitalito$o11 <- NA
# fix tigrinus_lafe to complete 11 ocasiones
# tigrinus_lafe$o11 <- NA
# perros_lafe$o11 <- NA
# effort_lafe$o11 <- NA
<- rbind(tigrinus_ucumari,
DL_tigrinus
tigrinus_pitalito,
tigrinus_cocha1,
tigrinus_lafe,
tigrinus_riogrande,
tigrinus_ituango,
tigrinus_cocha2,
tigrinus_chingaza,
tigrinus_saldania,2:11])
tigrinus_Bogota[,# tigrinus_cocha2
#)
<- rbind(perros_ucumari,
DL_perros
perros_pitalito,
perros_cocha1,
perros_lafe,
perros_riogrande,
perros_ituango,
perros_cocha2,
perros_chingaza,
perros_saldania,2:11])
perro_Bogota[,
<- rbind(effort_ucumari,
DL_effort
effort_pitalito,
effort_cocha1,
effort_lafe,
effort_riogrande,
effort_ituango,
perros_cocha2,
perros_chingaza,
effort_Saldania,2:11])
effort_Bogota[,
# add colname to later extract covs
$camera_trap <- row.names(DL_tigrinus)
DL_tigrinus$camera_trap <- row.names(DL_perros)
DL_perros$camera_trap <- row.names(DL_effort)
DL_effort
# Letf join con puntos
<- left_join(DL_tigrinus, puntos)
DL_tigrinus_p <- left_join(DL_perros, puntos)
DL_perros_p # DL_tigrinus_p <- left_join(DL_tigrinus, puntos)
########## add spatial covs
# make sf and add projection
<- DL_tigrinus_p |> st_as_sf(coords =
puntos_tigrinus_sf c("Longitude", "Latitude"),
crs = "EPSG:4326")
# Extract coordinates and drop geometry
# coordinates <- st_coordinates(puntos_sf)
# data_no_geometry <- st_drop_geometry(sf_data)
# get elevation points... slow!
<- get_elev_point(puntos_tigrinus_sf[1:61,],
site_covs_ucu src = "aws", z = 12)
<- get_elev_point(puntos_tigrinus_sf[62:122,],
site_covs_pit src = "aws", z = 12)
<- get_elev_point(puntos_tigrinus_sf[123:165,],
site_covs_coc1 src = "aws", z = 12)
# site_covs_coc2 <- get_elev_point(puntos_tigrinus_sf[166:218,],
# src = "aws", z = 12)
<- get_elev_point(puntos_tigrinus_sf[166:192,],
site_covs_lafe src = "aws", z = 12)
<- get_elev_point(puntos_tigrinus_sf[193:224,],
site_covs_riogrande src = "aws", z = 12)
<- get_elev_point(puntos_tigrinus_sf[225:278,],
site_covs_ituango src = "aws", z = 12)
<- get_elev_point(puntos_tigrinus_sf[279:331,],
site_covs_coc2 src = "aws", z = 12)
<- get_elev_point(puntos_tigrinus_sf[332:356,],
site_covs_ching src = "aws", z = 12)
<- get_elev_point(puntos_tigrinus_sf[357:387,],
site_covs_salda src = "aws", z = 12)
<- get_elev_point(puntos_tigrinus_sf[388:479,],
site_covs_bogo src = "aws", z = 12)
# combine points in one sf object
<- rbind(site_covs_ucu,
site_covs
site_covs_pit,
site_covs_coc1,
site_covs_lafe,
site_covs_riogrande,
site_covs_ituango,
site_covs_coc2,
site_covs_ching,
site_covs_salda,#,
site_covs_bogo)# site_covs_coc2)
#z =1-14
# bb <- st_as_sfc(st_bbox(elevation_17)) # make bounding box
############## make distance map using SF
# Convert points to sp spatialpointdatafram
# casas_points <- as(casas_sf, "Spatial")
# Projection
<- st_transform(casas_sf, CRS('+init=epsg:21818'))
casas_points_utm # convert sf to ppp
<- vect(casas_points_utm)
nc_spatvect <- vect(casas_points_utm)
c_spatvect <- distance(rast(nc_spatvect, resolution = 100), c_spatvect) #|> mask(nc_spatvect) # < resolution + detail
casa_dist_rast
# Extrae distancia casas
$dist_casa <- raster::extract(casa_dist_rast, site_covs)[,2] # also works
site_covs
# rename elevation
<- site_covs |> rename(elev = elevation)
site_covs
### overwrite Casas Chingaza
<- read_csv("D:/BoxFiles/Box Sync/CodigoR/tigrinus2/data/chi_cov_occ.csv") |>
chi_cov_occ rename(dist_casa=dist_casas) |>
rename(camera_trap=Camara) |> select(c(dist_casa,camera_trap))
# View(chi_cov_occ)
<- site_covs |>
site_covs2 filter (region=="Chingaza NP") |>
left_join(chi_cov_occ, by = "camera_trap")
# mapview(casa_dist_rast) + mapview(site_covs[,"camera_trap"])
<- site_covs |>
site_covs3 filter (region=="Ituango") |>
left_join(ituango_dis_casa, by = "camera_trap")
# mapview(casa_dist_rast) + mapview(site_covs[,"camera_trap"])
### dirty add for Chingaza, Ituango y Bogota dist_casa
$dist_casa[332:356] <- site_covs2$dist_casa.y #chingaza
site_covs$dist_casa[225:278] <- replace_na(site_covs3$dist_casa.y, 610) # Ituango
site_covs$dist_casa[388:479] <- tigrinus_Bogota$dist_casa*100000
site_covs
# ############################################
# # Canopy High using package(forestdata)
# ############################################
#
# ucu_point <- puntos_tigrinus_sf |> filter (region=="Ucumari RP")
#
# ucu_pol <- st_as_sf( # make sf
# st_buffer( # bufer 1 k
# st_as_sfc(# make sfc
# st_bbox(ucu_point) # box around point
# ),
# dist = 500)# distance bufer 500m
# )
#
#
# library(terra)
# library(tidyterra)
# library(aws.s3)
# library(forestdata)
# ## Download the data
# ucumari_eth <- fd_canopy_height(
# x = ucu_pol,
# model = "eth",
# crop = TRUE
# #mask = TRUE
# )
#
#
# ## Download the forest data... takes time!
# ucumari_forest <- fd_forest_glad(
# x=ucu_pol,
# #lon = -75.53673, lat = 4.748044,
# year = 2020,
# model = "landcover",
# # model = "eth",
# crop = TRUE,
# mask = TRUE
# )
#
#
#
# ## Print raster
# print(ucumari_forest)
#
# save
# saveRDS(DL_tigrinus_p, file = "C:/CodigoR/tigrinus2/data/asembled/DL_tigrinus_p.rds")
# saveRDS(DL_perros_p, file = "C:/CodigoR/tigrinus2/data/asembled/DL_perros_p.rds")
# saveRDS(site_covs, file = "C:/CodigoR/tigrinus2/data/asembled/site_covs.rds")
# saveRDS(DL_effort, file = "C:/CodigoR/tigrinus2/data/asembled/DL_effort.rds")
#load
# Load the data from the RDS file
<- readRDS(file = "C:/CodigoR/tigrinus2/data/asembled/DL_tigrinus_p.rds") |>
DL_tigrinus_p_tofix filter (region != "Rio Grande")
# Load the data from the RDS file
<- readRDS(file = "C:/CodigoR/tigrinus2/data/asembled/DL_perros_p.rds") |>
DL_perros_p_tofix filter (region != "Rio Grande")
# Load the data from the RDS file
<- readRDS(file = "C:/CodigoR/tigrinus2/data/asembled/site_covs.rds") |>
site_covs_tofix filter (region != "Rio Grande")
# Load the data from the RDS file
<- readRDS(file = "C:/CodigoR/tigrinus2/data/asembled/DL_effort.rds") # |>
DL_effort_tofix # filter (region != "Rio Grande")
### Load Fixed data by Alejandra
<- read_csv("data/from_aleja/occ_cov/Full_cov_occ.csv")
site_covs_fixed
# merge
<- site_covs_tofix |>
site_covs_2 left_join(site_covs_fixed)
# remove Nas
<- which(is.na(site_covs_2$Distance_house))
ind <- site_covs_2[-ind,]
site_covs
# make equal dimensions to site_covs deleting five Nas in Saldania
<- DL_effort_tofix |> right_join(site_covs, by = "camera_trap")
DL_effort <- DL_tigrinus_p_tofix |> right_join(site_covs, by = "camera_trap")
DL_tigrinus_p <- DL_perros_p_tofix |> right_join(site_covs, by = "camera_trap")
DL_perros_p
write.csv(site_covs, "C:/CodigoR/tigrinus2/data/ToAleja/site_covs_29agosto2025.csv")
Map
General map
codigo R
# save
# saveRDS(puntos_tigrinus_sf, file = "C:/CodigoR/tigrinus2/data/asembled/puntos_tigrinus_sf.rds")
#load
# Load the data from the RDS file
# puntos_tigrinus_sf <- readRDS(file = "C:/CodigoR/tigrinus2/data/asembled/puntos_tigrinus_sf.rds") |> filter (region != "Rio Grande")
<- read_csv("C:/CodigoR/tigrinus2/data/final/site_covs_29agosto2025_f.csv") |>
puntos_tigrinus_sf st_as_sf(coords = c("Longitude", "Latitude"),
crs = "EPSG:4326")
# from package rnaturalearth
<- ne_countries(country = "Colombia", scale = "medium")
col
# Topo map
<- rast("C:/CodigoR/tigrinus2/raster/HYP_HR_SR.tif")
topomap <- terra::crop(topomap, col, mask=T)
topocol ### Nota eliminar Rio grande ##########
# general
tm_shape(topocol, bbox = tmaptools::bb(col, ext = 1.1)) +
# tm_raster("HYP_HR_1", col.scale = tm_scale_continuous(values = terrain.colors(10))) +
tm_rgb(col = tm_vars(1:3, multivariate = TRUE)) +
tm_shape(col,
bbox = tmaptools::bb(col, ext = 5)) +
tm_borders() +
tm_shape(puntos_tigrinus_sf, # add bb
bbox = tmaptools::bb(puntos_tigrinus_sf, ext = 1.5)) + tm_symbols(shape = 21,
col = "red",
fill = "blue",
size =0.4)
codigo R
# tm_basemap("OpenTopoMap") + # c(StreetMap = "OpenStreetMap", TopoMap = "OpenTopoMap")) +# ("Esri.WorldImagery") + # usa basemap
# tm_facets(by = "region", ncol = 3)
Zoom to regions
codigo R
#####| column: screen-inset-shaded
### detallado
# tm_shape(topocol) +
# tm_rgb(col = tm_vars(1:3, multivariate = TRUE)) +
tm_shape(puntos_tigrinus_sf, is.main = TRUE) +
tm_basemap("OpenTopoMap") +# ("Esri.WorldImagery") + # usa basemap
tm_symbols(shape = 21, col = "red", fill = "blue",size =0.4) + # tm_basemap("OpenTopoMap") +
tm_facets(by = "region", ncol = 4, free.coords=TRUE) + tm_check_fix()
MODELOS DE CO-OCURRENCIA
codigo R
# Load final data
<- read_csv("C:/CodigoR/tigrinus2/data/final/tigrinus_p_29agosto2025.csv")
DL_tigrinus_p <- read_csv("C:/CodigoR/tigrinus2/data/final/dogs_p_29agosto2025.csv")
DL_perros_p <- read_csv("C:/CodigoR/tigrinus2/data/final/Effort_29agosto2025.csv")
DL_effort
<- puntos_tigrinus_sf
site_covs_sf # load huella
<- rast("C:/CodigoR/tigrinus2/raster/HuellaHumana.tif")
huella_humana
<- terra::extract(huella_humana, puntos_tigrinus_sf)
huella_extract $HH <- huella_extract$HuellaHumana
site_covs_sf# Drop the geometry
<- site_covs_sf |> st_drop_geometry() |> as.data.frame()
site_covs
# first tigrinus then dog
<- c( "~efort_tig", "~effort_perro")#, "~1")
detformulas <- c('~1','~1', '~1')# "~1")#, "~1", "~1", "~0")# 3 sp
stateformulas <- c('~Elevation','~Elevation', "~1") #"~0"
stateformulas_elev_1_1 <- c('~Elevation + I(Elevation^2)','~Elevation', "~1") #"~0"
stateformulas_elev_2_1 <- c('~Elevation','~Elevation + I(Elevation^2)', "~1") #"~0"
stateformulas_elev_1_2 <- c('~Distance_house','~1', "~1") #"~0"
stateformulas_house_1_0 <- c('~1','~Distance_house', "~1") #"~0"
stateformulas_house_0_1 <- c('~Distance_house','~Distance_house', "~1") #
stateformulas_house_1_1 <- c('~1','~1', "~Distance_house") #"~0"
stateformulas_house_0_0_1 <- c('~HH','~1', "~1") #"~0"
stateformulas_HH_1_0 <- c('~1','~HH', "~1") #"~0"
stateformulas_HH_0_1 <- c('~HH','~HH', "~1") #"~0"
stateformulas_HH_1_1 <- c('~HH','~HH', "~HH") #"~0"
stateformulas_HH_1_1_1 <- c('~HH','~HH', "~Distance_house") #"~0"
state_HH_1_1_House
<- list(as.matrix(DL_tigrinus_p[,2:11]),# truncate 10
y as.matrix(DL_perros_p[,2:11])
#[,1:5]))# , tigrinus y perros)
)names(y) <- c("tigrinus", "perros")#, "ocelote")
# obs_covs <-as.data.frame(scale(cams_ucu_sf$dist_casa))
# names(obs_covs) <- "dist_casa"
<- data.frame(site_covs[,c('Elevation',
site_covs_full 'Distance_house',
"GFW",
"HH"
1:4]
)])[,<-as.data.frame(apply(site_covs_full,2,scale)) # notice scale here
site_covs_full names(site_covs_full) <- c("Elevation",
"Distance_house",
"GFW",
"HH")
#### effort
<- list(
obs_covs efort_tig=as.data.frame(DL_effort[,2:11]), # truncate to 10
effort_perro=as.data.frame(DL_effort[,2:11])
)
library(unmarked)
<- unmarkedFrameOccuMulti(y = y,
umf siteCovs = site_covs_full,
obsCovs = obs_covs)#NULL)
plot(umf)
codigo R
#umf
# occFormulas Length should match number/order of columns in fDesign
@fDesign umf
f1[tigrinus] f2[perros] f3[tigrinus:perros]
psi[11] 1 1 1 psi[10] 1 0 0 psi[01] 0 1 0 psi[00] 0 0 0
codigo R
#########################
<- c("~1", "~1")
null_det <- c("~1", "~1")#, "~0")
null_occu <- occuMulti(null_det, null_occu,
null
umf,method="BFGS",
se=TRUE,
engine=c("C"),
silent=TRUE,
maxOrder=1,
penalty =2,#0.5 * sum(paramvals^2)
boot=100
)
Bootstraping covariance matrix
codigo R
null
Call: occuMulti(detformulas = null_det, stateformulas = null_occu, data = umf, maxOrder = 1, penalty = 2, boot = 100, method = “BFGS”, se = TRUE, engine = c(“C”), silent = TRUE)
Occupancy (logit-scale): Estimate SE z P(>|z|) [tigrinus] (Intercept) -0.567 0.138 -4.11 4.00e-05 [perros] (Intercept) -0.673 0.120 -5.61 2.07e-08
Detection (logit-scale): Estimate SE z P(>|z|) [tigrinus] (Intercept) -1.58 0.127 -12.5 1.24e-35 [perros] (Intercept) -1.38 0.108 -12.8 1.57e-37
AIC: 3439.187 Number of sites: 483 Bootstrap iterations: 100
codigo R
########################
<- occuMulti(detformulas, stateformulas, umf,
fit1 method="BFGS", se=TRUE, engine=c("C"), silent=TRUE,
maxOrder=2,
penalty =2,#0.5 * sum(paramvals^2)
boot=100,
)
Bootstraping covariance matrix
codigo R
# with effort fit1
Call: occuMulti(detformulas = detformulas, stateformulas = stateformulas, data = umf, maxOrder = 2, penalty = 2, boot = 100, method = “BFGS”, se = TRUE, engine = c(“C”), silent = TRUE)
Occupancy (logit-scale): Estimate SE z P(>|z|) [tigrinus] (Intercept) -0.786 0.178 -4.42 9.99e-06 [perros] (Intercept) -0.713 0.189 -3.78 1.57e-04 [tigrinus:perros] (Intercept) 0.593 0.258 2.30 2.14e-02
Detection (logit-scale): Estimate SE z P(>|z|) [tigrinus] (Intercept) -2.0521 0.1530 -13.41 5.41e-41 [tigrinus] efort_tig 0.0704 0.0205 3.43 5.97e-04 [perros] (Intercept) -2.3102 0.3311 -6.98 3.01e-12 [perros] effort_perro 0.1085 0.0310 3.50 4.72e-04
AIC: 3388.446 Number of sites: 483 Bootstrap iterations: 100
codigo R
# update model
# occFormulas2 <- c('~dist_casa', '~dist_casa', '~dist_casa', "~1", "~1", "~1", "~0")
# occFormulas2 <- c('~dist_casa', '~dist_casa', "~1")
<- update(fit1, stateformulas=stateformulas_elev_1_1) fit2
Bootstraping covariance matrix
codigo R
fit2
Call: occuMulti(detformulas = object@detformulas, stateformulas = c(“~Elevation”, “~Elevation”, “~1”), data = object@data, maxOrder = 2, penalty = 2, boot = 100, method = “BFGS”, se = TRUE, engine = c(“C”), silent = TRUE)
Occupancy (logit-scale): Estimate SE z P(>|z|) [tigrinus] (Intercept) -0.7921 0.1892 -4.19 2.83e-05 [tigrinus] Elevation 0.0369 0.0998 0.37 7.12e-01 [perros] (Intercept) -0.6947 0.1883 -3.69 2.25e-04 [perros] Elevation 0.1200 0.1160 1.03 3.01e-01 [tigrinus:perros] (Intercept) 0.6132 0.2628 2.33 1.96e-02
Detection (logit-scale): Estimate SE z P(>|z|) [tigrinus] (Intercept) -2.0637 0.1381 -14.95 1.59e-50 [tigrinus] efort_tig 0.0716 0.0199 3.60 3.24e-04 [perros] (Intercept) -2.3543 0.3452 -6.82 9.08e-12 [perros] effort_perro 0.1124 0.0340 3.31 9.39e-04
AIC: 3391.051 Number of sites: 483 Bootstrap iterations: 100
codigo R
<- update(fit1, stateformulas=stateformulas_elev_2_1) fit3
Bootstraping covariance matrix
codigo R
fit3
Call: occuMulti(detformulas = object@detformulas, stateformulas = c(“~Elevation + I(Elevation^2)”, “~Elevation”, “~1”), data = object@data, maxOrder = 2, penalty = 2, boot = 100, method = “BFGS”, se = TRUE, engine = c(“C”), silent = TRUE)
Occupancy (logit-scale): Estimate SE z P(>|z|) [tigrinus] (Intercept) -0.574 0.1849 -3.11 0.001900 [tigrinus] Elevation -0.165 0.1474 -1.12 0.262099 [tigrinus] I(Elevation^2) -0.222 0.0713 -3.11 0.001840 [perros] (Intercept) -0.686 0.1794 -3.82 0.000132 [perros] Elevation 0.125 0.1142 1.09 0.275373 [tigrinus:perros] (Intercept) 0.591 0.2609 2.27 0.023429
Detection (logit-scale): Estimate SE z P(>|z|) [tigrinus] (Intercept) -2.0615 0.1667 -12.37 3.94e-35 [tigrinus] efort_tig 0.0704 0.0181 3.89 1.02e-04 [perros] (Intercept) -2.3559 0.3251 -7.25 4.27e-13 [perros] effort_perro 0.1125 0.0308 3.65 2.61e-04
AIC: 3384.752 Number of sites: 483 Bootstrap iterations: 100
codigo R
<- update(fit1, stateformulas=stateformulas_house_1_0) fit4
Bootstraping covariance matrix
codigo R
fit4
Call: occuMulti(detformulas = object@detformulas, stateformulas = c(“~Distance_house”, “~1”, “~1”), data = object@data, maxOrder = 2, penalty = 2, boot = 100, method = “BFGS”, se = TRUE, engine = c(“C”), silent = TRUE)
Occupancy (logit-scale): Estimate SE z P(>|z|) [tigrinus] (Intercept) -0.832 0.185 -4.50 6.69e-06 [tigrinus] Distance_house 0.271 0.100 2.71 6.82e-03 [perros] (Intercept) -0.713 0.177 -4.03 5.49e-05 [tigrinus:perros] (Intercept) 0.600 0.217 2.77 5.61e-03
Detection (logit-scale): Estimate SE z P(>|z|) [tigrinus] (Intercept) -1.9799 0.1506 -13.15 1.79e-39 [tigrinus] efort_tig 0.0627 0.0254 2.47 1.36e-02 [perros] (Intercept) -2.3063 0.3232 -7.14 9.60e-13 [perros] effort_perro 0.1081 0.0289 3.74 1.83e-04
AIC: 3384 Number of sites: 483 Bootstrap iterations: 100
codigo R
<- update(fit1, stateformulas=stateformulas_house_0_1) fit5
Bootstraping covariance matrix
codigo R
fit5
Call: occuMulti(detformulas = object@detformulas, stateformulas = c(“~1”, “~Distance_house”, “~1”), data = object@data, maxOrder = 2, penalty = 2, boot = 100, method = “BFGS”, se = TRUE, engine = c(“C”), silent = TRUE)
Occupancy (logit-scale): Estimate SE z P(>|z|) [tigrinus] (Intercept) -0.745 0.173 -4.30 1.71e-05 [perros] (Intercept) -0.819 0.182 -4.49 7.21e-06 [perros] Distance_house 0.496 0.111 4.45 8.50e-06 [tigrinus:perros] (Intercept) 0.523 0.241 2.17 3.01e-02
Detection (logit-scale): Estimate SE z P(>|z|) [tigrinus] (Intercept) -2.0481 0.1405 -14.58 3.68e-48 [tigrinus] efort_tig 0.0699 0.0183 3.81 1.39e-04 [perros] (Intercept) -2.1275 0.2821 -7.54 4.64e-14 [perros] effort_perro 0.0930 0.0269 3.45 5.55e-04
AIC: 3368.867 Number of sites: 483 Bootstrap iterations: 100
codigo R
<- update(fit1, stateformulas=stateformulas_house_1_1) fit6
Bootstraping covariance matrix
codigo R
fit6
Call: occuMulti(detformulas = object@detformulas, stateformulas = c(“~Distance_house”, “~Distance_house”, “~1”), data = object@data, maxOrder = 2, penalty = 2, boot = 100, method = “BFGS”, se = TRUE, engine = c(“C”), silent = TRUE)
Occupancy (logit-scale): Estimate SE z P(>|z|) [tigrinus] (Intercept) -0.721 0.1777 -4.06 4.96e-05 [tigrinus] Distance_house 0.219 0.0988 2.22 2.63e-02 [perros] (Intercept) -0.755 0.1676 -4.50 6.69e-06 [perros] Distance_house 0.477 0.1057 4.51 6.37e-06 [tigrinus:perros] (Intercept) 0.362 0.2365 1.53 1.26e-01
Detection (logit-scale): Estimate SE z P(>|z|) [tigrinus] (Intercept) -1.9907 0.1514 -13.15 1.71e-39 [tigrinus] efort_tig 0.0641 0.0212 3.02 2.56e-03 [perros] (Intercept) -2.1247 0.2633 -8.07 7.00e-16 [perros] effort_perro 0.0927 0.0268 3.46 5.31e-04
AIC: 3367.015 Number of sites: 483 Bootstrap iterations: 100
codigo R
<- update(fit1, stateformulas=stateformulas_HH_1_0) fit7
Bootstraping covariance matrix
codigo R
fit7
Call: occuMulti(detformulas = object@detformulas, stateformulas = c(“~HH”, “~1”, “~1”), data = object@data, maxOrder = 2, penalty = 2, boot = 100, method = “BFGS”, se = TRUE, engine = c(“C”), silent = TRUE)
Occupancy (logit-scale): Estimate SE z P(>|z|) [tigrinus] (Intercept) -0.718 0.179 -4.01 6.14e-05 [tigrinus] HH -0.307 0.135 -2.28 2.28e-02 [perros] (Intercept) -0.670 0.162 -4.14 3.54e-05 [tigrinus:perros] (Intercept) 0.478 0.247 1.94 5.29e-02
Detection (logit-scale): Estimate SE z P(>|z|) [tigrinus] (Intercept) -2.0876 0.1815 -11.50 1.31e-30 [tigrinus] efort_tig 0.0743 0.0226 3.29 1.02e-03 [perros] (Intercept) -2.3099 0.2742 -8.43 3.59e-17 [perros] effort_perro 0.1084 0.0262 4.14 3.48e-05
AIC: 3384.134 Number of sites: 483 Bootstrap iterations: 100
codigo R
<- update(fit1, stateformulas=stateformulas_HH_0_1) fit8
Bootstraping covariance matrix
codigo R
fit8
Call: occuMulti(detformulas = object@detformulas, stateformulas = c(“~1”, “~HH”, “~1”), data = object@data, maxOrder = 2, penalty = 2, boot = 100, method = “BFGS”, se = TRUE, engine = c(“C”), silent = TRUE)
Occupancy (logit-scale): Estimate SE z P(>|z|) [tigrinus] (Intercept) -0.735 0.175 -4.20 2.69e-05 [perros] (Intercept) -0.853 0.173 -4.93 8.03e-07 [perros] HH 0.716 0.127 5.63 1.85e-08 [tigrinus:perros] (Intercept) 0.492 0.231 2.13 3.29e-02
Detection (logit-scale): Estimate SE z P(>|z|) [tigrinus] (Intercept) -2.0472 0.1330 -15.40 1.76e-53 [tigrinus] efort_tig 0.0698 0.0198 3.52 4.30e-04 [perros] (Intercept) -2.1766 0.2941 -7.40 1.36e-13 [perros] effort_perro 0.0974 0.0270 3.60 3.15e-04
AIC: 3356.253 Number of sites: 483 Bootstrap iterations: 100
codigo R
<- update(fit1, stateformulas=stateformulas_HH_1_1) fit9
Bootstraping covariance matrix
codigo R
fit9
Call: occuMulti(detformulas = object@detformulas, stateformulas = c(“~HH”, “~HH”, “~1”), data = object@data, maxOrder = 2, penalty = 2, boot = 100, method = “BFGS”, se = TRUE, engine = c(“C”), silent = TRUE)
Occupancy (logit-scale): Estimate SE z P(>|z|) [tigrinus] (Intercept) -0.825 0.184 -4.47 7.65e-06 [tigrinus] HH -0.465 0.126 -3.69 2.27e-04 [perros] (Intercept) -0.975 0.183 -5.34 9.25e-08 [perros] HH 0.819 0.137 5.99 2.15e-09 [tigrinus:perros] (Intercept) 0.807 0.240 3.36 7.70e-04
Detection (logit-scale): Estimate SE z P(>|z|) [tigrinus] (Intercept) -2.0963 0.1764 -11.89 1.39e-32 [tigrinus] efort_tig 0.0751 0.0212 3.54 4.01e-04 [perros] (Intercept) -2.2001 0.2866 -7.68 1.65e-14 [perros] effort_perro 0.0991 0.0283 3.50 4.69e-04
AIC: 3345.213 Number of sites: 483 Bootstrap iterations: 100
codigo R
<- update(fit1, stateformulas=stateformulas_house_0_0_1) fit10
Bootstraping covariance matrix
codigo R
fit10
Call: occuMulti(detformulas = object@detformulas, stateformulas = c(“~1”, “~1”, “~Distance_house”), data = object@data, maxOrder = 2, penalty = 2, boot = 100, method = “BFGS”, se = TRUE, engine = c(“C”), silent = TRUE)
Occupancy (logit-scale): Estimate SE z P(>|z|) [tigrinus] (Intercept) -0.720 0.192 -3.749 1.78e-04 [perros] (Intercept) -0.765 0.161 -4.756 1.98e-06 [tigrinus:perros] (Intercept) 0.160 0.261 0.612 5.41e-01 [tigrinus:perros] Distance_house 0.823 0.138 5.947 2.73e-09
Detection (logit-scale): Estimate SE z P(>|z|) [tigrinus] (Intercept) -1.9449 0.1431 -13.59 4.69e-42 [tigrinus] efort_tig 0.0558 0.0203 2.75 5.99e-03 [perros] (Intercept) -2.1136 0.2716 -7.78 7.17e-15 [perros] effort_perro 0.0927 0.0282 3.28 1.02e-03
AIC: 3350.786 Number of sites: 483 Bootstrap iterations: 100
codigo R
<- update(fit1, stateformulas=stateformulas_HH_1_1_1) fit11
Bootstraping covariance matrix
codigo R
fit11
Call: occuMulti(detformulas = object@detformulas, stateformulas = c(“~HH”, “~HH”, “~HH”), data = object@data, maxOrder = 2, penalty = 2, boot = 100, method = “BFGS”, se = TRUE, engine = c(“C”), silent = TRUE)
Occupancy (logit-scale): Estimate SE z P(>|z|) [tigrinus] (Intercept) -0.810 0.182 -4.450 8.57e-06 [tigrinus] HH -0.394 0.178 -2.213 2.69e-02 [perros] (Intercept) -0.989 0.164 -6.021 1.74e-09 [perros] HH 0.860 0.151 5.694 1.24e-08 [tigrinus:perros] (Intercept) 0.809 0.247 3.271 1.07e-03 [tigrinus:perros] HH -0.130 0.258 -0.502 6.15e-01
Detection (logit-scale): Estimate SE z P(>|z|) [tigrinus] (Intercept) -2.0879 0.1427 -14.63 1.82e-48 [tigrinus] efort_tig 0.0745 0.0211 3.53 4.12e-04 [perros] (Intercept) -2.2026 0.3038 -7.25 4.15e-13 [perros] effort_perro 0.0994 0.0279 3.57 3.59e-04
AIC: 3347.01 Number of sites: 483 Bootstrap iterations: 100
codigo R
<- update(fit1, stateformulas=state_HH_1_1_House) fit12
Bootstraping covariance matrix
codigo R
fit12
Call: occuMulti(detformulas = object@detformulas, stateformulas = c(“~HH”, “~HH”, “~Distance_house”), data = object@data, maxOrder = 2, penalty = 2, boot = 100, method = “BFGS”, se = TRUE, engine = c(“C”), silent = TRUE)
Occupancy (logit-scale): Estimate SE z P(>|z|) [tigrinus] (Intercept) -0.767 0.186 -4.12 3.85e-05 [tigrinus] HH -0.425 0.152 -2.80 5.19e-03 [perros] (Intercept) -0.984 0.139 -7.06 1.67e-12 [perros] HH 0.738 0.119 6.21 5.42e-10 [tigrinus:perros] (Intercept) 0.359 0.241 1.49 1.36e-01 [tigrinus:perros] Distance_house 0.774 0.123 6.31 2.82e-10
Detection (logit-scale): Estimate SE z P(>|z|) [tigrinus] (Intercept) -2.0040 0.1258 -15.93 3.87e-57 [tigrinus] efort_tig 0.0635 0.0196 3.25 1.17e-03 [perros] (Intercept) -2.0361 0.2541 -8.01 1.12e-15 [perros] effort_perro 0.0866 0.0259 3.34 8.32e-04
AIC: 3309.895 Number of sites: 483 Bootstrap iterations: 100
codigo R
# fit1_2 <- occuMulti(detFormulas_eff, stateformulas_2, umf,
# method="BFGS", se=TRUE, engine=c("C"), silent=TRUE,
# maxOrder=2,
# penalty =2,#0.5 * sum(paramvals^2)
# boot=100)
# null_2order <- optimizePenalty(null,
# stateformulas = c("~1", "~1", "~0"),
# penalties = 2, # c(0, 2^seq(-4, 4))
# maxOrder=2,
# k = 5, boot = 250)
# summary(null_2order)
Model Selection
codigo R
#List of fitted models
<- fitList(null = null ,
fmList effort = fit1,
effort_elev = fit2,
effort_elev2 = fit3,#,
effort_dist_casa_t = fit4,
effort_dist_casa_p = fit5,
effort_dist_casa_tp = fit6,
effort_HH_t = fit7,
effort_HH_p = fit8,
effort_HH_tp = fit9,
effort_dist_casa3 = fit10,
effort_HH_1_1_1 = fit11,
effort_HH_1_1_DistCasa = fit12
)
#Model selection
<- modSel(fmList)
models models
nPars AIC delta AICwt cumltvWt
effort_HH_1_1_DistCasa 10 3309.89 0.00 1.0e+00 1.00 effort_HH_tp 9 3345.21 35.32 2.1e-08 1.00 effort_HH_1_1_1 10 3347.01 37.12 8.7e-09 1.00 effort_dist_casa3 8 3350.79 40.89 1.3e-09 1.00 effort_HH_p 8 3356.25 46.36 8.6e-11 1.00 effort_dist_casa_tp 9 3367.01 57.12 3.9e-13 1.00 effort_dist_casa_p 8 3368.87 58.97 1.6e-13 1.00 effort_dist_casa_t 8 3384.00 74.11 8.1e-17 1.00 effort_HH_t 8 3384.13 74.24 7.6e-17 1.00 effort_elev2 10 3384.75 74.86 5.6e-17 1.00 effort 7 3388.45 78.55 8.8e-18 1.00 effort_elev 9 3391.05 81.16 2.4e-18 1.00 null 4 3439.19 129.29 8.4e-29 1.00
codigo R
<- as(models, "data.frame") |> select(c(model,nPars,AIC,delta,AICwt,cumltvWt))
models_toExport
# print table
::datatable(models_toExport) |> formatRound(c('AIC',"delta", "AICwt", "cumltvWt"), 3) DT
codigo R
# coef(fmList)
Best model fit
codigo R
#############
# Model fit #
#############
<- parboot(fit12, nsim=100) # takes time best model
bt plot(bt)
The model has a goof fit. It is appropriated for prediction.
Plot predicted marginal occupancy
Look at occupancy for species individually.
codigo R
#Plot predicted marginal occupancy as a function of best predictor
<- range(site_covs$Elevation)
r <- seq(r[1],r[2], length.out=100)
x1 <- (x1-mean(site_covs$Elevation))/sd(site_covs$Elevation)
x_scale
<- range(site_covs$Distance_house)
r2 <- seq(r2[1],r2[2], length.out=100)
x2 <- (x2-mean(site_covs$Distance_house))/sd(site_covs$Distance_house)
x2_scale
<- range(site_covs$HH)
r3 <- seq(r3[1],r3[2], length.out=100)
x3 <- (x3-mean(site_covs$HH))/sd(site_covs$HH)
x3_scale
# New data
<- matrix(NA, 100, 2)
nd <- data.frame(Elevation = x_scale,
nd Distance_house = x2_scale,
HH = x3_scale)
# predict marginal
<- predict(fit12, "state", species="tigrinus", newdata=nd)
tigrinus_pred $Species <- "tigrinus"
tigrinus_pred
<- predict(fit12, "state", species="perros", newdata=nd)
perros_pred $Species <- "perros"
perros_pred
# ocelote_pred <- predict(fit2, "state", species="ocelote", newdata=nd)
# ocelote_pred$Species <- "ocelote"
################### point plot
############## Null model
<- predict(fit12, "state", species="tigrinus")
tigrinus_pred_null $Species <- "tigrinus"
tigrinus_pred_null
<- predict(fit12, "state", species="perros")
perros_pred_null $Species <- "perros"
perros_pred_null
<- rbind(tigrinus_pred_null[1,], perros_pred_null[1,])
all_marginal $Species <- c("tigrinus", "perros")
all_marginal
#plot
plot(1:2, all_marginal$Predicted, ylim=c(0,0.9),
xlim=c(0.5,2.5), pch=19, cex=1.5, xaxt='n',
xlab="", ylab="Marginal occupancy and 95% CI")
axis(1, at=1:2, labels=all_marginal$Species)
# CIs
<- 0.1
top for (i in 1:2){
segments(i, all_marginal$lower[i], i, all_marginal$upper[i])
segments(i-top, all_marginal$lower[i], i+top)
segments(i-top, all_marginal$upper[i], i+top)
}
codigo R
#################################
<- rbind(tigrinus_pred, perros_pred)#, ocelote_pred)
plot_dat
ggplot(data=plot_dat, aes(x=rep(x3,2), y=Predicted)) + # change to 3 sp and x2 to distance x3 to HH
geom_ribbon(aes(ymin=lower, ymax=upper, fill=Species), alpha=0.3) +
geom_line(aes(col=Species)) +
labs(x="Human footprint", y="Marginal occupancy") +
theme_bw() +
theme(panel.grid.major=element_blank(), panel.grid.minor=element_blank(),
axis.text=element_text(size=12), axis.title=element_text(size=14),
legend.text=element_text(size=12), legend.title=element_text(size=14))
Plot predicted co-occurrence occupancy
codigo R
#Plot predicted marginal occupancy as a function of disturbance
<- range(site_covs$Elevation)
r <- seq(r[1],r[2],length.out=100)
x1 <- (x1-mean(site_covs$Elevation))/sd(site_covs$Elevation)
x_scale
<- range(site_covs$Distance_house)
r2 <- seq(r2[1],r2[2],length.out=100)
x2 <- (x2-mean(site_covs$Distance_house))/sd(site_covs$Distance_house)
x2_scale
<- range(site_covs$HH)
r3 <- seq(r3[1],r3[2],length.out=100)
x3 <- (x3-mean(site_covs$HH))/sd(site_covs$HH)
x3_scale
<- matrix(NA, 100, 2)
nd <- data.frame(Elevation = x_scale,
nd Distance_house = x2_scale,
HH = x3_scale)
<- predict(fit12, "state",
tigrinus_perros_pred species=c("tigrinus", "perros"),
# cond=c('-perros'), #perro absent
newdata=nd)
# tigrinus_pred$Species <- c("tigrinus", "perros")
# perros_pred <- predict(fit1, "state", species="perros", newdata=nd)
# perros_pred$Species <- "perros"
# ocelote_pred <- predict(fit2, "state", species="ocelote", newdata=nd)
# ocelote_pred$Species <- "ocelote"
<- tigrinus_perros_pred #rbind(tigrinus_pred, perros_pred)#, ocelote_pred)
plot_dat
ggplot(data=plot_dat, aes(x=rep(x2), y=Predicted)) + # change to 3 sp and x2 to distance, x3 to HH
geom_ribbon(aes(ymin=lower, ymax=upper, fill = "grey50"), alpha=0.3) +
geom_line(aes(y=Predicted), col="blue") +
labs(x="Distance House", y="co-occurence") +
theme_bw() +
theme(panel.grid.major=element_blank(), panel.grid.minor=element_blank(),
axis.text=element_text(size=12), axis.title=element_text(size=14),
legend.text=element_text(size=12), legend.title=element_text(size=14))
Plot predicted conditional occupancy
you want to know the probability of occupancy of one species, conditional on the presence of another.
codigo R
#Plot predicted marginal occupancy as a function of disturbance
<- range(site_covs$Elevation)
r <- seq(r[1],r[2],length.out=100)
x1 <- (x1-mean(site_covs$Elevation))/sd(site_covs$Elevation)
x_scale
<- range(site_covs$Distance_house)
r2 <- seq(r2[1],r2[2],length.out=100)
x2 <- (x2-mean(site_covs$Distance_house))/sd(site_covs$Distance_house)
x2_scale
<- range(site_covs$HH)
r3 <- seq(r3[1],r3[2],length.out=100)
x3 <- (x3-mean(site_covs$HH))/sd(site_covs$HH)
x3_scale
<- matrix(NA, 100, 2)
nd <- data.frame(Elevation = x_scale,
nd Distance_house = x2_scale,
HH = x3_scale)
##############
######## point plot
######## null model
##############
<- predict(fit12, type="state", species="tigrinus", cond="perros")
tigrinus_con_perro
<- predict(fit12, type="state", species="tigrinus", cond="-perros")
tigrinus_no_perro
<- rbind(tigrinus_con_perro[1,], tigrinus_no_perro[1,])
cond_data $tigrinus_status <- c("Present","Absent")
cond_data
plot(1:2, cond_data$Predicted, ylim=c(0.15,0.9),
xlim=c(0.5,2.5), pch=19, cex=1.5, xaxt='n',
xlab="Perro status", ylab="tigrinus occupancy and 95% CI")
axis(1, at=1:2, labels=cond_data$tigrinus_status)
# CIs
<- 0.1
top for (i in 1:2){
segments(i, cond_data$lower[i], i, cond_data$upper[i])
segments(i-top, cond_data$lower[i], i+top)
segments(i-top, cond_data$upper[i], i+top)
}
codigo R
##############
# line plot
# new data conditional
# one is the mean the other is range
<- data.frame(
nd_cond #elev = rep(mean(site_covs$elev), 100),
HH = seq(min(x3_scale), max(x3_scale),
length.out = 100),
# roads = rep(mean(site_covs$roads), 100),
Elevation = rep(mean(x_scale), 100), #seq(min(x_scale), max(x_scale)
Distance_house = rep(mean(x2_scale), 100)
)
##### conditional
<- predict(fit12, "state",
tigrinus_dog_0 species = "tigrinus",
cond = '-perros',
newdata = nd_cond)
$Species <- "perro ausente"
tigrinus_dog_0
<- predict(fit12, "state",
tigrinus_dog_1 species = "tigrinus",
cond = 'perros',
newdata = nd_cond)
$Species <- "perro presente"
tigrinus_dog_1
<- predict(fit12, "state", species = "perros", newdata = nd)
perros_pred $Species <- "perros"
perros_pred
# ocelote_pred <- predict(fit2, "state", species="ocelote", newdata=nd)
# ocelote_pred$Species <- "ocelote"
# old plot
<- rbind(tigrinus_dog_1, tigrinus_dog_0)#, ocelote_pred)
plot_dat
ggplot(data=plot_dat, aes(x=rep(x3,2), y=Predicted)) + # change to 3 sp and x2 to distance x is elev, x2 is dist house
geom_ribbon(aes(ymin=lower, ymax=upper, fill=Species), alpha=0.3) +
geom_line(aes(col=Species)) +
labs(x="Human footprint", y="tigrinus conditional occupancy") +
theme_bw() +
theme(panel.grid.major=element_blank(), panel.grid.minor=element_blank(),
axis.text=element_text(size=12), axis.title=element_text(size=14),
legend.text=element_text(size=12), legend.title=element_text(size=14))
codigo R
# new plot
<- data.frame(
gg_df_cond1 HH = rep(nd_cond$HH, 2),
occupancy = c(tigrinus_dog_1$Predicted,
$Predicted),
tigrinus_dog_0low = c(tigrinus_dog_1$lower,
$lower),
tigrinus_dog_0high = c(tigrinus_dog_1$upper,
$upper),
tigrinus_dog_0conditional = rep(c('Dog present', 'Dog absent'),
each = 100)
)
<- ggplot(gg_df_cond1, aes(x = HH, y = occupancy,
cond_fig1 group = conditional)) +
geom_ribbon(aes(ymin = low, ymax = high, fill = conditional), alpha=0.5) +
geom_line() +
ylab('Conditional L. tigrinus\noccupancy probability') +
xlab('Human footprint') +
labs(fill = 'Dog state') +
theme(text = element_text(size = 15),
#legend.position = c(0.75, 0.85)
)
cond_fig1
Package Citation
codigo R
<- cite_packages(output = "paragraph", pkgs="Session", out.dir = ".")
pkgs # knitr::kable(pkgs)
pkgs
We used R version 4.4.2 (R Core Team 2024) and the following R packages: camtrapR v. 2.3.0 (Niedballa et al. 2016), DT v. 0.33 (Xie, Cheng, and Tan 2024), elevatr v. 0.99.0 (Hollister et al. 2023), geodata v. 0.6.2 (Hijmans et al. 2024), knitr v. 1.50 (Xie 2014, 2015, 2025), mapview v. 2.11.2 (Appelhans et al. 2023), nlme v. 3.1.166 (J. C. Pinheiro and Bates 2000; J. Pinheiro, Bates, and R Core Team 2024), raster v. 3.6.32 (Hijmans 2025a), rnaturalearth v. 1.0.1 (Massicotte and South 2023), rpart v. 4.1.23 (Therneau and Atkinson 2023), sf v. 1.0.21 (E. Pebesma 2018; E. Pebesma and Bivand 2023), sp v. 2.2.0 (E. J. Pebesma and Bivand 2005; Bivand, Pebesma, and Gomez-Rubio 2013), spatstat v. 3.3.3 (Baddeley and Turner 2005a; Baddeley et al. 2013a; Baddeley, Rubak, and Turner 2015a), spatstat.data v. 3.1.6 (Baddeley and Turner 2005b; Baddeley et al. 2013b; Baddeley, Rubak, and Turner 2015b), spatstat.explore v. 3.4.3 (Baddeley and Turner 2005c; Baddeley et al. 2013c; Baddeley, Rubak, and Turner 2015c), spatstat.geom v. 3.4.1 (Baddeley and Turner 2005d; Baddeley et al. 2013d; Baddeley, Rubak, and Turner 2015d), spatstat.linnet v. 3.2.6 (Baddeley and Turner 2005e; Baddeley et al. 2013e; Baddeley, Rubak, and Turner 2015e), spatstat.model v. 3.3.6 (Baddeley and Turner 2005f; Baddeley et al. 2013f; Baddeley, Rubak, and Turner 2015f), spatstat.random v. 3.4.1 (Baddeley and Turner 2005g; Baddeley et al. 2013g; Baddeley, Rubak, and Turner 2015g), spatstat.univar v. 3.1.3 (Baddeley and Turner 2005h; Baddeley et al. 2013h; Baddeley, Rubak, and Turner 2015h), terra v. 1.8.60 (Hijmans 2025b), tidyverse v. 2.0.0 (Wickham et al. 2019), tmap v. 4.1.0.9000 (Tennekes 2018), unmarked v. 1.5.0 (Fiske and Chandler 2011; Kellner et al. 2023).
Sesion info
codigo R
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] unmarked_1.5.0 lubridate_1.9.4 forcats_1.0.0
[4] stringr_1.5.1 dplyr_1.1.4 purrr_1.1.0
[7] tidyr_1.3.1 tibble_3.2.1 ggplot2_3.5.2
[10] tidyverse_2.0.0 grateful_0.2.10 rnaturalearth_1.0.1
[13] tmap_4.1.0.9000 elevatr_0.99.0 camtrapR_2.3.0
[16] DT_0.33 spatstat_3.3-3 spatstat.linnet_3.2-6 [19] spatstat.model_3.3-6 rpart_4.1.23 spatstat.explore_3.4-3 [22] nlme_3.1-166 spatstat.random_3.4-1 spatstat.geom_3.4-1
[25] spatstat.univar_3.1-3 spatstat.data_3.1-6 raster_3.6-32
[28] sp_2.2-0 geodata_0.6-2 terra_1.8-60
[31] sf_1.0-21 readr_2.1.5 readxl_1.4.3
[34] mapview_2.11.2 knitr_1.50
loaded via a namespace (and not attached): [1] RColorBrewer_1.1-3 rstudioapi_0.17.1 jsonlite_2.0.0
[4] wk_0.9.4 magrittr_2.0.3 spatstat.utils_3.1-4
[7] farver_2.1.2 rmarkdown_2.29 vctrs_0.6.5
[10] base64enc_0.1-3 RcppNumerical_0.6-0 htmltools_0.5.8.1
[13] leafsync_0.1.0 curl_6.0.0 cellranger_1.1.0
[16] s2_1.1.9 sass_0.4.10 bslib_0.9.0
[19] slippymath_0.3.1 KernSmooth_2.23-24 htmlwidgets_1.6.4
[22] cachem_1.1.0 stars_0.6-8 lifecycle_1.0.4
[25] pkgconfig_2.0.3 cols4all_0.8-1 Matrix_1.7-1
[28] R6_2.6.1 fastmap_1.2.0 rbibutils_2.3
[31] digest_0.6.37 colorspace_2.1-1 tensor_1.5
[34] leafem_0.2.4 crosstalk_1.2.1 labeling_0.4.3
[37] lwgeom_0.2-14 progressr_0.15.0 spacesXYZ_1.6-0
[40] spatstat.sparse_3.1-0 timechange_0.3.0 httr_1.4.7
[43] polyclip_1.10-7 abind_1.4-8 mgcv_1.9-1
[46] compiler_4.4.2 microbenchmark_1.5.0 proxy_0.4-27
[49] bit64_4.5.2 withr_3.0.2 DBI_1.2.3
[52] logger_0.4.0 MASS_7.3-61 maptiles_0.10.0
[55] tmaptools_3.3 leaflet_2.2.2 classInt_0.4-11
[58] tools_4.4.2 units_0.8-7 leaflegend_1.2.1
[61] goftest_1.2-3 glue_1.8.0 rnaturalearthdata_1.0.0 [64] satellite_1.0.5 grid_4.4.2 generics_0.1.3
[67] gtable_0.3.6 tzdb_0.4.0 class_7.3-22
[70] data.table_1.17.8 hms_1.1.3 pillar_1.10.1
[73] vroom_1.6.5 splines_4.4.2 lattice_0.22-6
[76] bit_4.5.0.1 deldir_2.0-4 tidyselect_1.2.1
[79] pbapply_1.7-2 reformulas_0.4.0 stats4_4.4.2
[82] xfun_0.52 stringi_1.8.4 yaml_2.3.10
[85] evaluate_1.0.4 codetools_0.2-20 archive_1.1.12
[88] cli_3.6.5 RcppParallel_5.1.9 Rdpack_2.6.2
[91] jquerylib_0.1.4 secr_5.1.0 dichromat_2.0-0.1
[94] Rcpp_1.1.0 png_0.1-8 XML_3.99-0.18
[97] parallel_4.4.2 mvtnorm_1.3-2 scales_1.4.0
[100] e1071_1.7-16 crayon_1.5.3 rlang_1.1.6
References
Reuse
Citation
@online{untitled,
author = {},
langid = {en}
}