En este espacio se encuentran los contenidos teóricos y prácticos para el taller Introducción a la modelización jerárquica: detectabilidad imperfecta en modelos de ocupación y N-mixture impartido en el XVI Congreso de la SECEM (6-9 de diciembre de 2023 en Granollers). En los siguientes enlaces se pueden descargar los materiales se utilizarán durante el taller:
Se recomienda guardar todos estos archivos en una misma carpeta. A continuación se presenta de manera resumida la teoría del taller y posteriormente los casos prácticos.
Cuando estudiamos la distribución o la abundancia (variables de estado) de las especies podemos distinguir entre
Si no se tiene en cuenta ese proceso observacional corremos el riesgo de asumir que nuestros datos representan fielmente la realidad, lo cual podría hacernos obtener estimas de la distribución o la abundancia sesgadas y/o poco precisas.
Uno de los sesgos más comunes en los procesos observacionales a la hora de estudiar la distribución y la abundancia de las especies es la detectabilidad imperfecta, esto es, la probabilidad de que una especie o un individuo no sea detectado estando presente en un lugar dado. Este fenómeno es muy habitual, ya que hay muchos factores que pueden afectar a la detectabilidad: el carácter elusivo de las especies, su fenología, los medios de los que disponemos para detectarlas, las condiciones metereológicas en el momento del muestreo, la experiencia del muestreador, el propio hábitat donde se encuentra la especie, etc. La detectabilidad imperfecta es especialmente importante cuando varía a través de nuestros sitios de muestreo, ya que podemos confundir el efecto de las covariables que afectan a la detectabilidad con las que afectan a la ecología de nuestra especie.
Los modelos de ocupación nos permiten estimar la probabilidad de presencia o distribución de una especie (esta será nuestra variable de estado) en nuestro área de estudio teniendo en cuenta la detectabilidad imperfecta a partir de muestreos repetidos registrando detecciones/no detecciones (observaciones). Para ello, asumiremos que el proceso de que una especie esté presente en el sitio \(i\) (\(z_{i} = 1\)) sigue una distribución de \(Bernoulli\) con probabilidad de éxito (probabilidad de ocupación) \(\psi_{i}\):
\[\begin{equation} \tag{Eq 1}\label{eq1} z_{i} \sim Bernoulli(\psi_{i}) \end{equation}\]
Esta probabilidad de ocupación a su vez puede ser modelizada por medio de covariables predictoras utilizando la maquinaria habitual de los modelos lineales generalizados, utilizando por ejemplo la función vínculo \(logit\) para asegurarnos de que el parámetro \(\psi_{i}\) toma valores entre 0 y 1, ya que se trata de una probabilidad (otras funciones vínculo como \(probit\) o \(cloglog\) son igualmente posibles):
\[\begin{equation} \tag{Eq 2}\label{eq2} logit(\psi_{i}) = \boldsymbol{\beta X_{i}} \end{equation}\]
donde \(\boldsymbol{\beta}\)
representa el vector de que forman el intercepto \(\beta_{0}\) y los coeficientes o
estimates de cada una de las covariables predictoras (\(\beta_{1}, \beta_{2}, ... \beta_{n}\)),
mientras que \(\boldsymbol{X_{i}}\)
representa el valor de cada una de las covariables predictoras (\(X1_{i}, X2_{i}, ... Xn_{i}\)) en el sitio
\(i\).
Hasta aquí, el procedimiento es exáctamente idéntico a una regresión logística utilizada normalmente para modelizar la presencia/ausencia de las especies. La diferencia en los modelos de ocupación radica en que se añade un sub-modelo que describe el proceso observacional y se sirve del histórico de detecciones/no detecciones para estimar la probabilidad de detección de la especie en cada sitio \(i\):
\[\begin{equation} \tag{Eq 3}\label{eq3} h_{ij}|z_{i} \sim Bernoulli(z_{i}p_{ij}) \end{equation}\]
donde \(h_{ij}|z_{i}\) es el histórico de \(j\) detecciones/no detecciones dado que la especie esté realmente presente o ausente (1 / 0) en el sitio \(i\) (\(z_{i}\)), mientras que \(p_{ij}\) es la probabilidad de detección de la especie en el sitio \(i\) durante el muestreo \(j\). Una de las ventajas de los modelos de ocupación es que nos permiten a la vez modelizar esa probabilidad de detección \(p_{ij}\) por medio de covariables predictoras de la misma forma que hicimos con la ocupación:
\[\begin{equation} \tag{Eq 4}\label{eq4} logit(p_{ij}) = \boldsymbol{\beta X_{ij}} \end{equation}\]
Cabe destacar que en el proceso observacional pueden
existir dos tipos de covariables predictoras: covariables que afecten al
sitio \(i\), o covariables que afecten
a la ocasión de muestreo \(j\). Puede
ser que la detectabilidad de la especie se vea afectada por las
características físicas de una determinada localidad \(i\) si por ejemplo nos encontramos en un
terreno muy escarpado con mucho desnivel y esto nos impide localizar
fácilmente a nuestra especie en comparación con localidades más planas.
Pero también puede suceder que las condiciones meteorológicas en una
determinada ocasión de muestreo impidan la detección de la especie (por
ejemplo, momentos de mucha niebla) en comparación a otras ocasiones de
muestreo en la misma localidad (días despejados). Nótese que esta es una
característica propia del proceso observacional, ya que en los modelos
de ocupación se asume que la variable de estado (presencia o ausencia
real de la especie en una localidad) no varía durante la realización del
estudio. Esta situación es igualmente aplicable a los modelos N-mixture
que veremos a continuación.
De esta forma se puede apreciar la estructura jerárquica de los modelos de ocupación, ya que el proceso observacional (\ref{eq3} y \ref{eq4}) se construye sobre la base de que la especie esté realmente presente o ausente en cada sitio (proceso ecológico, \ref{eq1} y \ref{eq2}), pudiendo estar afectado independientemente por otras covariables.
Los modelos N-mixture son la versión para trabajar con conteos y abundancias de los modelos de ocupación. Nos permiten estimar la abundancia de una especie (esta será nuestra variable de estado) en nuestro área de estudio teniendo en cuenta la detectabilidad imperfecta a partir de muestreos repetidos registrando conteos de los individuos de nuestra especie (observaciones). Para ello, asumiremos que la abundancia de una especie en el sitio \(i\) (\(N_{i}\)) sigue una distribución de \(Poisson\) con intensidad o abundancia media \(\lambda_{i}\):
\[\begin{equation} \tag{Eq 5}\label{eq5} N_{i} \sim Poisson(\lambda_{i}) \end{equation}\]
De forma similar a los modelos de ocupación, esta intensidad o abundancia media \(\lambda_{i}\) puede modelizarse a través de covariables predictoras utilizando la maquinaria habitual en los modelos lineales generalizados utilizando esta vez la función vínculo \(log\) para que el valor de \(\lambda_{i}\) siempre sea positivo:
\[\begin{equation} \tag{Eq 6}\label{eq6} log(\lambda_{i}) = \boldsymbol{\beta X_{i}} \end{equation}\]
donde, análogamente al modelo de ocupación, \(\boldsymbol{\beta}\) representa el vector
de que forman el intercepto \(\beta_{0}\) y los coeficientes o
estimates de cada una de las covariables predictoras (\(\beta_{1}, \beta_{2}, ... \beta_{n}\)),
mientras que \(\boldsymbol{X_{i}}\)
representa el valor de cada una de las covariables predictoras (\(X1_{i}, X2_{i}, ... Xn_{i}\)) en el sitio
\(i\).
Una vez más, hasta aquí el procedimiento sería idéntico a una regresión de Poisson, o un modelo lineal generalizado utilizando la familia de \(Poisson\). Sin embargo, ahora podemos añadir un nuevo sub-modelo que se encargue de modelizar el proceso observacional y tener en cuenta la detectabilidad imperfecta a la hora de contar los indivduos de nuestra especie. Para ello utilizaremos la distribución \(Binomial\) en la que cada uno de los individuos realmente presentes en cada sitio de muestreo \(i\) será un ensayo de “éxito o fracaso” que dependerá de una probabilidad de detección individual (\(p_{ij}\)):
\[\begin{equation} \tag{Eq 7}\label{eq7} C_{ij}|N_{i} \sim Binomial(N_{i},p_{ij}) \end{equation}\]
En este caso, \(C_{ij}\) será el resultado del conteo de individuos en el sitio \(i\) durante el muestreo \(j\), mientras que \(N_{i}\) será el número de individuos realmente presentes en el sitio \(i\). De igual forma que en los modelos de ocupación, la probabilidad de detección (esta vez a nivel de individuo), puede ser a su vez modelizada mediante covariables predictoras (nótese que volvemos a usar la función vínculo \(logit\) ya que la probabilidad debe encontrarse entre 0 y 1):
\[\begin{equation} \tag{Eq 8}\label{eq8} logit(p_{ij}) = \boldsymbol{\beta X_{ij}} \end{equation}\]
Entre las numerosas extensiones disponibles de este modelo general, una de las más básicas es la de asumir que la abundancia de nuestra especie sigue otra distribución que no sea la de \(Poisson\) determinada en la \ref{eq7}, como la \(\text{Binomial negativa}\) o la \(\text{Poisson inflada de ceros}\)
Queremos modelizar la ocupación (probabilidad de presencia) de una especie a partir de datos de cámaras trampa. Nuestro área de estudio es una zona montañosa dividida en una malla de 50x50 celdas. Sabemos que nuestra especie utiliza mayormente el hábitat de matorral de los fondos de valle de nuestro área de estudio. Disponemos de un total de 100 cámaras de fototrampeo que hemos dispuesto aleatoriamente en nuestro área de estudio que han estado activas durante 7 noches utilizando una lata de sardinas como atrayente. De las 100 cámaras, 47 de ellas son de la marca A y 53 de la marca B.
# Instalamos y cargamos las librerías que vamos a utilizar.
#install.packages("terra")
#install.packages("unmarked")
#install.packages("AICcmodavg")
library(terra)
library(unmarked)
library(AICcmodavg)
# Leemos nuestros datos en formato CVS
datos <- read.csv("https://raw.githubusercontent.com/jabiologo/web/master/tutorials/tallerSECEM_files/occuDatos.csv")
# Si hemos descargado previamente los datos, podemos indicar la ruta (la carpeta
# en nuestro ordenador donde se localizan los archivos) y cargarlos desde ahí.
# datos <- read.csv("mi/ruta/occuDatos.csv")
# Le pedimos a R que nos muestre las primeras filas de nuestros datos.
head(datos)
## id marca o1 o2 o3 o4 o5 o6 o7 dia1 dia2 dia3 dia4 dia5 dia6 dia7
## 1 593 A 0 0 0 0 0 0 0 1 2 3 4 5 6 7
## 2 1942 B 0 0 0 0 0 0 0 1 2 3 4 5 6 7
## 3 1945 A 0 0 0 1 0 0 0 1 2 3 4 5 6 7
## 4 253 B 0 0 0 0 0 0 0 1 2 3 4 5 6 7
## 5 2152 A 0 0 0 0 0 0 0 1 2 3 4 5 6 7
## 6 1528 A 0 0 0 0 0 0 0 1 2 3 4 5 6 7
# Cargamos las capas raster correspondientes a nuestras covariables predictoras,
# en este caso elevación y porcentaje de vegetación arbustiva.
elev <- rast("https://github.com/jabiologo/web/raw/master/tutorials/tallerSECEM_files/elev.tif")
arbu <- rast("https://github.com/jabiologo/web/raw/master/tutorials/tallerSECEM_files/arbu.tif")
# Si hemos descargado previamente las capas, podemos indicar la ruta (la carpeta
# en nuestro ordenador donde se localizan los archivos) y cargarlos desde ahí.
# elev <- rast("mi/ruta/elev.tif")
# arbu <- rast("mi/ruta/arbu.tif")
names(elev) <- "elev"
names(arbu) <- "arbu"
# Vamos a graficar estas capas para hacernos una idea de cómo son. Además,
# colocaremos encima las localizaciones de nuestros dos modelos de cámaras.
par(mfrow = c(1,2))
plot(elev, main = "Elevación")
points(xyFromCell(elev, datos$id[datos$marca == "A"]), col = "darkred", pch = 19)
points(xyFromCell(elev, datos$id[datos$marca == "B"]), col = "darkblue", pch = 19)
plot(arbu, main = "Porcentaje arbusto")
# En este paso estandarizaremos nuestras variables para que su media sea 0 y su
# desviación estándar 1. Esta es una práctica habitual en modelización que ayuda
# a ajustar los modelos de forma más efectiva. La fórmula es:
# valor escalado = (valor de la cov - valor medio de la cov)/ SD de la cov
datos$elev <- scale(elev[datos$id])[1:100]
datos$arbu <- scale(arbu[datos$id])[1:100]
# Volvemos a inspeccionar las primeras filas de nuestro juego de datos.
head(datos)
## id marca o1 o2 o3 o4 o5 o6 o7 dia1 dia2 dia3 dia4 dia5 dia6 dia7
## 1 593 A 0 0 0 0 0 0 0 1 2 3 4 5 6 7
## 2 1942 B 0 0 0 0 0 0 0 1 2 3 4 5 6 7
## 3 1945 A 0 0 0 1 0 0 0 1 2 3 4 5 6 7
## 4 253 B 0 0 0 0 0 0 0 1 2 3 4 5 6 7
## 5 2152 A 0 0 0 0 0 0 0 1 2 3 4 5 6 7
## 6 1528 A 0 0 0 0 0 0 0 1 2 3 4 5 6 7
## elev arbu
## 1 0.55262104 1.4229936
## 2 0.37677981 -0.4942135
## 3 0.03575438 0.7839246
## 4 -0.80082361 0.9685444
## 5 0.29685197 0.3578785
## 6 0.35546572 -1.5735298
# A continuación prepararemos los datos para que sean entendidos por el paquete
# unmarked. Para ello debemos colocar de una forma determinada nuestras
# observaciones (detecciones/no detecciones en este caso), nuestras covariables
# predictoras. Recordad que las covariables predictoras que pueden estar
# relacionadas con los sitios de muestreos (siteCovs) o con las ocasiones de
# muestreo (obsCovs).
obserCov <- list(dia = as.matrix(datos[,10:16]))
datosUM <- unmarkedFrameOccu(as.matrix(datos[,3:9]), siteCovs=datos[,c(2,17,18)], obsCovs=obserCov)
## Warning: siteCovs contains characters. Converting them to factors.
# A continuación ajustaremos el modelo de ocupación utilizando la marca de la
# cámara trampa y los días desde que se colocó la cámara y el cebo como
# covariables que afectan a la detectabilidad (proceso observacional), y
# elevación y porcentaje de cobertura arbustiva como covariables que afectan a
# la ocupación o probabilidad de presencia (proceso ecológico).
m1 <- occu(~ marca + dia ~ elev + arbu, data = datosUM)
#Inspeccionamos los resultados del modelo.
summary(m1)
##
## Call:
## occu(formula = ~marca + dia ~ elev + arbu, data = datosUM)
##
## Occupancy (logit-scale):
## Estimate SE z P(>|z|)
## (Intercept) -0.6183 0.273 -2.266 0.023439
## elev -1.0045 0.300 -3.354 0.000797
## arbu -0.0257 0.254 -0.101 0.919423
##
## Detection (logit-scale):
## Estimate SE z P(>|z|)
## (Intercept) 0.218 0.4549 0.478 6.32e-01
## marcaB 0.690 0.4026 1.713 8.67e-02
## dia -0.443 0.0831 -5.331 9.79e-08
##
## AIC: 368.7241
## Number of sites: 100
## optim convergence code: 0
## optim iterations: 32
## Bootstrap iterations: 0
# Inspeccionamos los efectos de la covariable de la cámara y del procentaje
# de arbusto.
plotEffects(m1, type = "det", covariate="marca")
plotEffects(m1, type = "state", covariate="arbu")
# También podemos predecir de forma espacialmente explícita nuestro modelo
# de ocupación para inspeccionar la probabilidad de presencia de nuestra especie
# sobre un mapa. Para ello primero estandarizaremos los rásters de la misma
# forma que lo hicimos con nuestras variables.
elevScaled <- (elev - 958.29) / 187.6693
arbuScaled <- (arbu - 49.78) / 7.041493
dataPred <- c(elevScaled, arbuScaled)
names(dataPred) <- c("elev", "arbu")
# Después, podemos utilizar la función predict con nuestro modelo y las nuevas
# capas raster estandarizadas y graficar los resultados.
pred <- predict(m1, dataPred, type = "state")
plot(pred)
# Por último podemos explorar la bondad de ajuste de nuestro modelo, esto es,
# cuanto de bien predice nuestras observaciones el modelo que hemos construido.
mb.gof.test(m1, nsim = 100)
##
## MacKenzie and Bailey goodness-of-fit for single-season occupancy model
##
## Pearson chi-square table:
##
## Cohort Observed Expected Chi-square
## 0000000 0 67 66.67 0.00
## 0001000 0 5 1.05 14.94
## 0010000 0 1 1.63 0.24
## 0010100 0 1 0.31 1.54
## 0011010 0 1 0.07 13.26
## 0100000 0 1 2.54 0.93
## 0110000 0 1 1.17 0.02
## 0111110 0 1 0.01 67.15
## 1000000 0 6 3.95 1.06
## 1000001 0 2 0.31 9.24
## 1001000 0 1 1.17 0.02
## 1010000 0 1 1.82 0.37
## 1010100 0 1 0.39 0.97
## 1011010 0 1 0.09 9.15
## 1100000 0 2 2.83 0.24
## 1100010 0 1 0.39 0.97
## 1100100 0 1 0.60 0.26
## 1110000 0 2 1.46 0.20
## 1110010 0 1 0.22 2.78
## 1110100 0 1 0.34 1.27
## 1110110 0 1 0.05 16.36
## 1111000 0 1 0.53 0.41
##
## Chi-square statistic = 153.8116
## Number of bootstrap samples = 100
## P-value = 0.16
##
## Quantiles of bootstrapped statistics:
## 0% 25% 50% 75% 100%
## 51 79 95 131 273
##
## Estimate of c-hat = 1.4
¿Qué podemos decir de este modelo? En primer lugar, puede
sorprendernos el coeficiente estimado para la covariable porcentaje
de arbusto. Este coeficiente es ligeramente negativo (-0.02), pero
es poco significativo, su p-value es mayor de 0.05 y el
intervalo de confianza de este valor utilizando el error estándar
incluye el valor 0, por lo que esta covariable predictora parece que
tiene poco efecto en nuestra especie. Sin embargo, como investigadores
estábamos seguros de que esta especie utilizaba el hábitat de matorral
del fondo de valle de nuestra área de estudio…
Cuando graficamos
los efectos de las covariables en nuestro modelo también podemos
apreciar que la marca de cámara trampa B es bastante
más efectiva que la A a la hora de detectar nuestra
especie, y confirmamos que el porcentaje de arbusto apenas tiene efecto
sobre la probabilidad de presencia de nuestra especie.
Por último
podemos comprobar que la bondad de ajuste de nuestro modelo no es
demasiado buena… el p-valor no es demasiado significativo pero
atendiendo al valor de ĉ apreciamos algo de sobredispersión.
Quizás
podríamos construir otro modelo modificando las covariables predictoras
en los diferentes sub-modelos para los procesos ecológico y
observacional y compararlo con el modelo 1 mediante su valor de AIC.
En este caso queremos modelizar la abundancia (número de individuos) de una especie a partir de conteos realizados en muestreos repetidos. Nuestro área de estudio es una zona de transición agrícola-forestal en una malla de 50x50 celdas. Sabemos que nuestra especie habita principalmente en bosques y tiene querencia por temperaturas cálidas. Hemos muestreado un total de 100 sitios diferentes en los que hemos realizado conteos directos en tres ocasiones distintas. Como sabemos que nuestra especie es sensible a la temperatura, en cada muestreo tomamos nota de la temperatura que había en ese momento en ese lugar, y le dimos un valor categórico (temperatura baja, media o alta).
# Si hemos cargado los paquetes necesarios anteriormente, no es necesario volver
# a cargarlos. Los paquetes que utilizaremos terra, unmarked y AICcmodavg
# Leemos nuestros datos en formato CVS.
datos <- read.csv("https://github.com/jabiologo/web/raw/master/tutorials/tallerSECEM_files/nmixDatos.csv")
# Si hemos descargado previamente los datos, podemos indicar la ruta (la carpeta
# en nuestro ordenador donde se localizan los archivos) y cargarlos desde ahí
# datos <- read.csv("mi/ruta/nmixDatos.csv").
# Visualizamos las primeras filas de nuestros datos.
head(datos)
## id o1 o2 o3 t1 t2 t3
## 1 553 0 0 0 media media media
## 2 1897 8 7 1 alta alta baja
## 3 1947 0 0 0 media alta media
## 4 2283 3 1 3 media media alta
## 5 1549 10 10 10 media media alta
## 6 933 1 0 4 baja baja media
# Cargamos las capas raster correspondientes a nuestras covariables predictoras,
# en este caso tipo de cobertura de vegetación y temperatura media de cada sitio.
cober <- rast("https://github.com/jabiologo/web/raw/master/tutorials/tallerSECEM_files/cober.tif")
tempe <- rast("https://github.com/jabiologo/web/raw/master/tutorials/tallerSECEM_files/tempe.tif")
# Si hemos descargado previamente las capas, podemos indicar la ruta (la carpeta
# en nuestro ordenador donde se localizan los archivos) y cargarlos desde ahí.
# cober <- rast("mi/ruta/cober.tif")
# tempe <- rast("mi/ruta/tempe.tif")
names(cober) <- "cober"
names(tempe) <- "tempe"
# Vamos a graficar estas capas para hacernos una idea de cómo son. Colocaremos
# encima las localizaciones de nuestros conteos repetidos. Nótese que la
# variable cobertura del suelo es categórica y cada númer corresponde a un tipo
# de cobertura:
# 1 = urbano
# 2 = agrícola
# 3 = transición
# 4 = bosque
par(mfrow = c(1,2))
plot(tempe, main = "Temperatura")
points(xyFromCell(tempe, datos$id), pch = 19, cex = 0.5)
plot(cober, main = "Cobertura del suelo")
# Estandarizamos la variable temperatura y convertimos a factor la variable de
# cobertura del suelo, ya que se trata de una variable categórica.
datos$tempe <- scale(tempe[datos$id])[1:100]
datos$cober <- as.factor(cober[datos$id][,1])
# Volvemos a visualizar las primeras filas de nuestro juego de datos.
head(datos)
## id o1 o2 o3 t1 t2 t3 tempe cober
## 1 553 0 0 0 media media media -0.4727608 2
## 2 1897 8 7 1 alta alta baja -2.0753400 4
## 3 1947 0 0 0 media alta media -1.4743728 3
## 4 2283 3 1 3 media media alta -1.4743728 3
## 5 1549 10 10 10 media media alta -1.4743728 4
## 6 933 1 0 4 baja baja media 0.5288511 3
# Como hicimos anteriormente, vamos a organizar nuestros datos de una manera
# que entienda el paquete unmarked.
obserCov <- list(tOc = datos[,5:7])
datosUM <- unmarkedFramePCount(y = as.matrix(datos[,2:4]), siteCovs=datos[,8:9], obsCovs=obserCov)
## Warning: obsCovs contains characters. Converting them to factors.
# A continuación ajustaremos un modelo N-mixture utilizando la temperatura de la
# ocasión de muestreo y la temperatura media del sitio como covariables que
# afectan a la detectabilidad y la temperatura media del sitio y el tipo de
# cobertura del suelo como variables que afectan a la abundancia de la especie.
m1 <- pcount(~ tOc + tempe ~ tempe + cober, data = datosUM, K = 200)
# Inspeccionamos los resultados del modelo
summary(m1)
##
## Call:
## pcount(formula = ~tOc + tempe ~ tempe + cober, data = datosUM,
## K = 200)
##
## Abundance (log-scale):
## Estimate SE z P(>|z|)
## (Intercept) 0.484 0.5761 0.84 4.01e-01
## tempe 1.079 0.0718 15.02 5.33e-51
## cober2 -2.115 0.6444 -3.28 1.03e-03
## cober3 0.887 0.5810 1.53 1.27e-01
## cober4 3.816 0.5836 6.54 6.17e-11
##
## Detection (logit-scale):
## Estimate SE z P(>|z|)
## (Intercept) 1.313 0.281 4.666 3.07e-06
## tOcbaja -3.428 0.262 -13.102 3.19e-39
## tOcmedia -0.550 0.196 -2.815 4.88e-03
## tempe -0.059 0.139 -0.424 6.72e-01
##
## AIC: 590.2252
## Number of sites: 100
## optim convergence code: 0
## optim iterations: 86
## Bootstrap iterations: 0
# Inspeccionamos algunos efectos de algunas covariables
plotEffects(m1, type = "det", covariate="tempe")
plotEffects(m1, type = "state", covariate="tempe")
# Preparamos las variables para poder realizar las predicciones
tempeScaled <- (tempe[] - 26.22) / 5.02
dataPred <- data.frame(cbind(tempeScaled, cober[]))
names(dataPred) <- c("tempe", "cober")
dataPred$cober <- as.factor(dataPred$cober)
# Realizamos las predicciones del modelo y las graficamos
pred <- predict(m1, dataPred, type = "state")
predRas <- rast(nrows=50, ncols=50, xmin=0, xmax=50, ymin = 0, ymax = 50)
predRas[] <- pred$Predicted
plot(predRas)
# Por último, podemos analizar la bondad de ajuste de nuestro modelo.
Nmix.gof.test(m1, nsim = 100)
##
## Chi-square goodness-of-fit for N-mixture model of 'unmarkedFitPCount' class
##
## Observed chi-square statistic = 207.3841
## Number of bootstrap samples = 100
## P-value = 0.93
##
## Quantiles of bootstrapped statistics:
## 0% 25% 50% 75% 100%
## 165 233 261 305 949
##
## Estimate of c-hat = 0.72
Al igual que en el caso anterior, nos podemos preguntar muchas cosas
sobre este modelo. ¿Qué efecto parece que tiene la temperatura media del
sitio de muestreo sobre la detectabilidad de los individuos de nuestra
especie? ¿Cómo podríamos mejorar este modelo?
Hay otras preguntas
sobre las que podemos reflexionar comparando los modelos de ocupación y
los modelos N-mixture:
A continuación se mencionan algunas extensiones a estos modelos y otras lecturas recomendadas:
occuMS
del paquete
unmarked
(J. Royle et al.
2007).occuFP
del paquete unmarked
.occuRN
del paquete unmarked
(J. A. Royle
and Nichols 2003). Un ejemplo en Fernández-López et al. (2022).colext()
(MacKenzie et al. 2003) y
pcountOpen()
(Dail and Madsen
2011) del paquete unmarked
.occuMulti
del paquete unmarked
.Entre otras ventajas, la Inferencia Bayesiana proporciona una mayor flexibilidad y permite ajustar modelos mucho más complejos, que en ocasiones son necesarios. A continuación se mencionan algunas herramientas que nos permiten ajustar modelos jerárqucos mediante Inferencia Bayesiana con algunas extensiones, como efectos aleatorios, modelos espaciales, etc.