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)
#
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
<- readRDS(file = "C:/CodigoR/tigrinus2/data/asembled/puntos_tigrinus_sf.rds")
puntos_tigrinus_sf
# from package rnaturalearth
<- ne_countries(country = "Colombia", scale = "medium")
col
# general
tm_shape(col)+
tm_shape(puntos_tigrinus_sf, # add bb
bbox = tmaptools::bb(puntos_tigrinus_sf, ext = 1.5)) +
tm_basemap("OpenStreetMap") + # c(StreetMap = "OpenStreetMap", TopoMap = "OpenTopoMap")) +# ("Esri.WorldImagery") + # usa basemap
tm_symbols(shape = 21, col = "red", fill = "blue",size =0.4) #+ #punto negro
codigo R
# tm_facets(by = "region", ncol = 3)
Zoom to regions
codigo R
#####| column: screen-inset-shaded
### detallado
tm_shape(puntos_tigrinus_sf) +
tm_basemap("OpenTopoMap") +# ("Esri.WorldImagery") + # usa basemap
tm_symbols(shape = 21, col = "red", fill = "blue",size =0.4) + #punto negro
tm_facets(by = "region", ncol = 4)
MODELOS DE CO-OCURRENCIA
codigo R
# 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 # Load the data from the RDS file
<- readRDS(file = "C:/CodigoR/tigrinus2/data/asembled/DL_perros_p.rds")
DL_perros_p # Load the data from the RDS file
<- readRDS(file = "C:/CodigoR/tigrinus2/data/asembled/site_covs.rds")
site_covs # Load the data from the RDS file
<- readRDS(file = "C:/CodigoR/tigrinus2/data/asembled/DL_effort.rds")
DL_effort
<- c( "~1", "~1")#, "~1")
detformulas #stateformulas <- c('~elev','~elev', '~elev', "~1", "~1", "~1", "~0")# 3 sp
<- c('~elev','~elev', "~1") #"~0"
stateformulas <- c('~elev + I(elev^2)','~elev', "~1") #"~0"
stateformulas_2
<- list(as.matrix(DL_tigrinus_p[,1:10]),# truncate 10
y as.matrix(DL_perros_p[,1:10])
#[,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('elev','dist_casa')])[,1:2]
site_covs_full <-as.data.frame(apply(site_covs_full,2,scale)) # notice scale here
site_covs_full names(site_covs_full) <- c("elev", "dist_casa")
#### effort
<- list(
obs_covs efort_tig=as.data.frame(DL_effort[,1:10]), # truncate to 10
effort_perro=as.data.frame(DL_effort[,1:10])
)
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.643 0.155 -4.16 3.18e-05 [perros] (Intercept) -0.813 0.131 -6.18 6.25e-10
Detection (logit-scale): Estimate SE z P(>|z|) [tigrinus] (Intercept) -1.81 0.132 -13.7 7.74e-43 [perros] (Intercept) -1.51 0.147 -10.3 7.71e-25
AIC: 2830.008 Number of sites: 479 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
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.556 0.210 -2.64 8.22e-03 [tigrinus] elev 0.222 0.098 2.26 2.38e-02 [perros] (Intercept) -0.720 0.177 -4.06 4.95e-05 [perros] elev 0.202 0.131 1.54 1.23e-01 [tigrinus:perros] (Intercept) -0.320 0.273 -1.17 2.42e-01
Detection (logit-scale): Estimate SE z P(>|z|) [tigrinus] (Intercept) -1.81 0.131 -13.8 2.56e-43 [perros] (Intercept) -1.51 0.145 -10.4 1.83e-25
AIC: 2829.403 Number of sites: 479 Bootstrap iterations: 100
codigo R
# update model
# occFormulas2 <- c('~dist_casa', '~dist_casa', '~dist_casa', "~1", "~1", "~1", "~0")
<- c('~dist_casa', '~dist_casa', "~1")
occFormulas2 <- update(fit1, stateformulas=occFormulas2) fit2
Bootstraping covariance matrix
codigo R
fit2
Call: occuMulti(detformulas = object@detformulas, stateformulas = c(“~dist_casa”, “~dist_casa”, “~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.5480 0.183 -2.99 2.77e-03 [tigrinus] dist_casa 0.0884 0.125 0.71 4.78e-01 [perros] (Intercept) -0.7296 0.174 -4.19 2.82e-05 [perros] dist_casa 0.3557 0.143 2.49 1.27e-02 [tigrinus:perros] (Intercept) -0.3191 0.228 -1.40 1.62e-01
Detection (logit-scale): Estimate SE z P(>|z|) [tigrinus] (Intercept) -1.81 0.145 -12.5 7.85e-36 [perros] (Intercept) -1.51 0.133 -11.3 7.94e-30
AIC: 2824.597 Number of sites: 479 Bootstrap iterations: 100
codigo R
<- c('~efort_tig', '~effort_perro')
detFormulas_eff <- update(fit1, detformulas=detFormulas_eff) fit3
Bootstraping covariance matrix
codigo R
fit3
Call: occuMulti(detformulas = c(“~efort_tig”, “~effort_perro”), stateformulas = object@stateformulas, 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.570 0.184 -3.09 0.00200 [tigrinus] elev 0.254 0.111 2.28 0.02239 [perros] (Intercept) -0.617 0.191 -3.23 0.00125 [perros] elev 0.277 0.133 2.08 0.03723 [tigrinus:perros] (Intercept) -0.303 0.267 -1.13 0.25746
Detection (logit-scale): Estimate SE z P(>|z|) [tigrinus] (Intercept) -1.9541 0.1473 -13.26 3.78e-40 [tigrinus] efort_tig 0.0277 0.0219 1.26 2.07e-01 [perros] (Intercept) -2.1741 0.2894 -7.51 5.85e-14 [perros] effort_perro 0.0859 0.0267 3.22 1.27e-03
AIC: 2811.363 Number of sites: 479 Bootstrap iterations: 100
codigo R
<- update(fit2, detformulas=detFormulas_eff) fit4
Bootstraping covariance matrix
codigo R
<- occuMulti(detFormulas_eff, stateformulas_2, umf,
fit1_2 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
# 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(#elev = fit1,
fmList #distCasa = fit2,
elev_effort = fit3,
distCasa_effort = fit4,
# null_2order = null_2order,
null = null,
elev2_eff = fit1_2)
#Model selection
<- modSel(fmList)
models
<- 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(fit1_2, 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 disturbance
<- range(site_covs$elev)
r <- seq(r[1],r[2],length.out=100)
x1 <- (x1-mean(site_covs$elev))/sd(site_covs$elev)
x_scale
<- range(site_covs$dist_casa)
r2 <- seq(r2[1],r2[2],length.out=100)
x2 <- (x2-mean(site_covs$dist_casa))/sd(site_covs$dist_casa)
x2_scale
<- matrix(NA, 100, 2)
nd <- data.frame(elev=x_scale, dist_casa= x2_scale)
nd
<- predict(fit1_2, "state", species="tigrinus", newdata=nd)
tigrinus_pred $Species <- "tigrinus"
tigrinus_pred
<- predict(fit1_2, "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(fit3, "state", species="tigrinus")
tigrinus_pred_null $Species <- "tigrinus"
tigrinus_pred_null
<- predict(fit3, "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(x1,2), y=Predicted)) + # change to 3 sp and x2 to distance
geom_ribbon(aes(ymin=lower, ymax=upper, fill=Species), alpha=0.3) +
geom_line(aes(col=Species)) +
labs(x="elevation", 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$elev)
r <- seq(r[1],r[2],length.out=100)
x1 <- (x1-mean(site_covs$elev))/sd(site_covs$elev)
x_scale
<- range(site_covs$dist_casa)
r2 <- seq(r2[1],r2[2],length.out=100)
x2 <- (x2-mean(site_covs$dist_casa))/sd(site_covs$dist_casa)
x2_scale
<- matrix(NA, 100, 2)
nd <- data.frame(elev=x_scale, dist_casa= x2_scale)
nd
<- predict(fit1_2, "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(x1), y=Predicted)) + # change to 3 sp and x2 to distance
geom_ribbon(aes(ymin=lower, ymax=upper, fill = "grey50"), alpha=0.3) +
geom_line(aes(y=Predicted), col="blue") +
labs(x="elev", 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$elev)
r <- seq(r[1],r[2],length.out=100)
x1 <- (x1-mean(site_covs$elev))/sd(site_covs$elev)
x_scale
<- range(site_covs$dist_casa)
r2 <- seq(r2[1],r2[2],length.out=100)
x2 <- (x2-mean(site_covs$dist_casa))/sd(site_covs$dist_casa)
x2_scale
<- matrix(NA, 100, 2)
nd <- data.frame(elev=x_scale, dist_casa= x2_scale)
nd
##############
######## point plot
######## null model
##############
<- predict(fit1_2, type="state", species="tigrinus", cond="perros")
tigrinus_con_perro
<- predict(fit1_2, 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
##############
# new data conditional
<- data.frame(
nd_cond #elev = rep(mean(site_covs$elev), 100),
dist_casa = rep(mean(x2_scale), 100),
# roads = rep(mean(site_covs$roads), 100),
elev = seq(min(x_scale), max(x_scale),
length.out = 100)
)
##### conditional
<- predict(fit1_2, "state",
tigrinus_dog_0 species = "tigrinus",
cond = '-perros',
newdata = nd_cond)
$Species <- "perro ausente"
tigrinus_dog_0
<- predict(fit1_2, "state",
tigrinus_dog_1 species = "tigrinus",
cond = 'perros',
newdata = nd_cond)
$Species <- "perro presente"
tigrinus_dog_1
<- predict(fit1, "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(x1,2), y=Predicted)) + # change to 3 sp and x2 to distance
geom_ribbon(aes(ymin=lower, ymax=upper, fill=Species), alpha=0.3) +
geom_line(aes(col=Species)) +
labs(x="elev", 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 elev = rep(nd_cond$elev, 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 = elev, 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('elev') +
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.49 (Xie 2014, 2015, 2024), 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.30 (Hijmans 2024), 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.1.4 (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.21 (Hijmans 2025), tidyverse v. 2.0.0 (Wickham et al. 2019), tmap v. 4.1 (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.0.2
[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 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-30
[28] sp_2.1-4 geodata_0.6-2 terra_1.8-21
[31] sf_1.0-21 readr_2.1.5 readxl_1.4.3
[34] mapview_2.11.2 knitr_1.49
loaded via a namespace (and not attached): [1] RColorBrewer_1.1-3 rstudioapi_0.17.1 jsonlite_1.8.9
[4] wk_0.9.4 magrittr_2.0.3 spatstat.utils_3.1-4
[7] rmarkdown_2.29 vctrs_0.6.5 base64enc_0.1-3
[10] RcppNumerical_0.6-0 htmltools_0.5.8.1 leafsync_0.1.0
[13] curl_6.0.0 cellranger_1.1.0 s2_1.1.7
[16] slippymath_0.3.1 KernSmooth_2.23-24 htmlwidgets_1.6.4
[19] stars_0.6-8 lifecycle_1.0.4 pkgconfig_2.0.3
[22] cols4all_0.8 Matrix_1.7-1 R6_2.6.1
[25] fastmap_1.2.0 rbibutils_2.3 digest_0.6.37
[28] colorspace_2.1-1 tensor_1.5 leafem_0.2.4
[31] crosstalk_1.2.1 lwgeom_0.2-14 progressr_0.15.0
[34] spacesXYZ_1.3-0 spatstat.sparse_3.1-0 timechange_0.3.0
[37] httr_1.4.7 polyclip_1.10-7 abind_1.4-8
[40] mgcv_1.9-1 compiler_4.4.2 microbenchmark_1.5.0
[43] proxy_0.4-27 withr_3.0.2 DBI_1.2.3
[46] MASS_7.3-61 maptiles_0.8.0 tmaptools_3.2
[49] leaflet_2.2.2 classInt_0.4-10 tools_4.4.2
[52] units_0.8-5 leaflegend_1.2.1 goftest_1.2-3
[55] glue_1.8.0 satellite_1.0.5 grid_4.4.2
[58] generics_0.1.3 gtable_0.3.6 leaflet.providers_2.0.0 [61] tzdb_0.4.0 class_7.3-22 data.table_1.16.4
[64] hms_1.1.3 pillar_1.10.1 splines_4.4.2
[67] lattice_0.22-6 deldir_2.0-4 tidyselect_1.2.1
[70] pbapply_1.7-2 reformulas_0.4.0 stats4_4.4.2
[73] xfun_0.49 stringi_1.8.4 yaml_2.3.10
[76] evaluate_1.0.1 codetools_0.2-20 cli_3.6.3
[79] RcppParallel_5.1.9 Rdpack_2.6.2 munsell_0.5.1
[82] secr_5.1.0 dichromat_2.0-0.1 Rcpp_1.0.13-1
[85] png_0.1-8 XML_3.99-0.17 parallel_4.4.2
[88] viridisLite_0.4.2 mvtnorm_1.3-2 scales_1.3.0
[91] e1071_1.7-16 rlang_1.1.4
References
Reuse
Citation
@online{untitled,
author = {},
langid = {en}
}