# COMPADRE y Orquídeas {#Compadre}
Los datos demográficos comparables son la base para analizar la dinámica de
poblaciones de orquídeas a través de especies, regiones y contextos
ambientales. Este capítulo presenta el conjunto de datos de orquídeas
derivado de la base COMPADRE y describe su organización para su uso en los
modelos y análisis desarrollados en capítulos anteriores.
Por: Raymond L. Tremblay
## Alcance y organización de los datos demográficos de orquídeas
El conjunto de datos de orquídeas reúne matrices de proyección poblacional y
metadatos asociados (especie, ubicación, periodo de muestreo, tipo de
hábitat y notas metodológicas) que permiten comparar la dinámica demográfica
entre poblaciones y especies. La estructura de los datos facilita la
construcción de matrices **U**, **F** y **C**, el cálculo de la tasa de
crecimiento poblacional (λ) y la implementación de análisis de sensibilidad,
elasticidad y LTRE, así como simulaciones bajo distintos escenarios.
En esta sección se describe cómo están organizadas las tablas principales —una
tabla de **matrices** y una tabla de **metadatos**—, las claves que las conectan
(especies/poblaciones/estudios) y las precauciones habituales al trabajar con
información heterogénea (año de referencia, definición de estadios,
unidades de medida y supuestos de reclutamiento). También se presenta una
vista general de la cobertura taxonómica y geográfica del conjunto, con el
fin de contextualizar cualquier patrón observado.
A diferencia de los capítulos analíticos, este capítulo no introduce nuevos
métodos; su objetivo es proporcionar un recurso de datos **listo para
analizar** que permita replicar ejemplos, comparar patrones demográficos entre
orquídeas y vincular resultados con decisiones de manejo y conservación. La
documentación clara de la estructura y las variables garantiza que los
análisis posteriores sean reproducibles e interpretables en el marco del
libro.
## Estructura del conjunto de datos y carga en el entorno
A continuación se describen las tablas principales y se muestra cómo cargar y
verificar el conjunto de datos en el entorno de trabajo.
Los datos aquí descritos se integran directamente en la descomposición en
matrices U, F y C y en el cálculo de
crecimiento poblacional.
La comparación de la importancia relativa de transiciones puede realizarse
mediante elasticidad poblacional y la explicación de
diferencias observadas entre poblaciones mediante LTRE.
Para explorar escenarios alternativos, puede utilizarse el capítulo de
métodos de simulaciones.
### Cobertura y limitaciones
La cobertura taxonómica y espacial es heterogénea entre especies y
poblaciones. Algunas series temporales son cortas o presentan años sin
muestreo; en estos casos se debe documentar cualquier decisión de
imputación o agregación. Las definiciones de estadios y los supuestos de
reclutamiento pueden variar entre estudios; por ello, al comparar poblaciones
conviene revisar la documentación asociada y mantener criterios consistentes
de armonización.
#### Librerías de R requeridas para el siguiente módulo
```{r Compr1, message=FALSE}
#| error: true
library(Rcompadre) # Paquete para trabajar con la base de datos de COMPADRE y COMADRE
library(tidyverse) # Paquete para activar multiples paquetes
library(flextable) # Paquete para formatear tablas
library(broom)
library(ggdist)
library(distributional)
library(leaflet)
library(Rage) # función para calcular el largo de vida esperada entre otras
library(car)
library(popdemo)
library(WRS2)
```
Uno de los esfuerzos más grandes para compilar el conocimiento actual sobre la ecología de poblaciones es la creación y mantenimiento de las bases de datos de COMPADRE y COMADRE. COMPADRE es una base de datos de matrices de transición de estados de poblaciones de plantas y COMADRE es una base de datos de matrices de transición de estados de poblaciones de animales. Estas bases de datos son una fuente de información para evaluar la dinámica de poblaciones de plantas y animales. En este capítulo se presenta una introducción a la base de datos de COMPADRE y algunas de las funciones en los paquetes de **Rcompadre**. En el próximo capítulo se presentarán funciones incluidas en el paquete **Rage**. La información aquí no sustituye la información provista en la página web de COMPADRE \<<https://compadre-db.org/>\> y los tutoriales provistos en la sección de Education de la misma página\<<https://compadre-db.org/Education>\>.
El valor de las bases de datos reside en tener en un mismo sitio una gran cantidad de información organizada de manera uniforme y accesible, además de que su formato permite utilizarla directamente en diferentes análisis. En el caso de COMPADRE y COMADRE, la información está organizada en matrices de transición de estados de poblaciones (MPM) que se pueden usar para evaluar la dinámica de poblaciones de plantas y animales y con múltiples variables, tal como sus coordenadas geográficas, el tipo de hábitat, la temporalidad de los datos, la fuente de la información, entre otros.
En este capítulo se aprenderá a utilizar la base de datos de COMPADRE para evaluar la dinámica de poblaciones de orquídeas. Se evaluará cómo extraer diferentes tipos de datos para responder a preguntas específicas.
------------------------------------------------------------------------
### Acceso a los datos de COMPADRE.
#### Descargando el archivo de datos
Hay dos métodos de tener acceso a los datos de COMPADRE (datos de dinámica poblacional de plantas) y COMADRE (datos de dinámica poblacional de animales). Se puede acceder a los datos directamente de la página web o bajar el archivo de datos desde el siguiente enlace \<<https://compadre-db.org/Data/Compadre>\> seleccionando la pestaña de **Download COMPADRE** o **Download COMADRE**.
Para tener acceso a los datos cuando no cuente con conexión a internet es necesario descargar el archivo en su ordenador y cargarlos en su proyecto de RStudio. Al momento de la edición de este libro la versión más reciente de COMPADRE es la versión 6.28.8.0 (fecha de la base de datos: agosto_14_2025) y se puede descargar en el siguiente enlace: \<\<<https://compadre-db.org/Data/Compadre/COMPADRE_v>.
##### Acceso a los datos desde su computadora (ordenador)
- USAR el código siguiente si ha descargado los datos en su computadora.
load(dirección/al/archivo/a/su/proyecto/de/RStudio) si tiene el repositorio en su computadora (preferiblemente en su proyecto de RStudio)
```{r Compr3, eval=FALSE, echo=FALSE}
#| error: true
#load("~/Library/CloudStorage/Dropbox/GitHub_Dropbox_Drive/GitHub/Diagnostico_Poblacional/Diagnostico_Poblacional/COMPADRE_v.6.23.5.0.RData")
#load("~/Dropbox/GitHub_Dropbox_Drive/GitHub/Diagnostico_Poblacional/Diagnostico_Poblacional/COMPADRE_v.6.23.5.0.RData") # work computer
```
------------------------------------------------------------------------
#### Carga de datos con el enlace de web
- Usando la función *cdb_fetch()* se pueden descargar los datos directamente de la página web de COMPADRE. Esta función se encuentra en el paquete de **Rcompadre**.
```{r Compr4, message=FALSE}
#| error: true
compadre <- readRDS("data/COMPADRE_2026.rds") # Usar este código para bajar los datos del repositorio de COMPADRE.
```
------------------------------------------------------------------------
#### Renombrar la base datos a algo sencillo
Se considera una buena práctica renombrar los objetos de forma tal que sea simple llamarlos posteriormente en nuestro script. Para ello, en este ejemplo se renombrará la base de datos de COMPADRE a algo más sencillo **TodasSp**, reemplazando **compadre**. - Se visualiza el nombre de cada columna en la base de datos. - Hay 59 variables en la base de datos de COMPADRE.
```{r Compr5}
#| error: true
TodasSp=compadre
#names(TodasSp) # La lista de los nombres de las variables en el archivo COMPADRE, Nota que 59 variables en la base de datos de COMPADRE.
```
- Conocer la dimensión de la base de dato. Al momento de la edición de este libro la base de datos de COMPADRE tiene 9149 filas y 59 columnas (variables).
```{r Compr6}
#| error: true
dim(TodasSp)
```
------------------------------------------------------------------------
### Explorando la base de datos de COMPADRE
Se estará evaluando múltiples funciones en Rcompadre para aprender a usar la base de datos de COMPADRE.
Para evaluar si la base de datos contiene información sobre especies particulares de orquídeas, se utilizará la función ‘cdb_check_species’. Es relevante mencionar que se puede evaluar múltiples especies de forma simultánea. Aquí se evaluó si la base contiene información sobre las especies *Epidendrum xanthinum*, *Epipactis gigantea* y *Caladenia latifolia*.
Como podrán notar, solamente existen datos para una de las tres que probamos en la base de datos de COMPADRE.
```{=latex}
\begin{landscape}
```
```{r compr7}
#| error: true
especies<- c("Epidendrum xanthinum", "Epipactis gigantea", "Caladenia latifolia")
cdb_check_species(TodasSp, especies) |> flextable() |> ft_wide()
```
```{=latex}
\end{landscape}
```
------------------------------------------------------------------------
### Crear un subconjunto de la base de datos de COMPADRE
Antes de seguir vamos a extraer de la base de datos de COMPADRE las especies de orquídeas y crear un nuevo objeto con todas las especies de orquídeas. La ventaja de crear un conjunto de datos es reducir el tamaño del archivo y facilitar los análisis posteriores.
Seleccionaremos todas las matrices que pertenecen a la familia Orchidaceae. Se observa que la base 788 filas, por consecuencia 788 matrices de transición de estados de poblaciones de orquídeas.
```{r compr8}
#| error: true
index_O = TodasSp %>%
filter(Family %in% c("Orchidaceae")) # Extraer la orquídeas de la base de datos.
```
------------------------------------------------------------------------
### La metadata de la base de datos de COMPADRE
Con la función **cdb_metadata()** se puede evaluar la metadata de la base de datos. La función muestra el número de filas y columnas, que incluye mútliples variables, tal como el nombre de la especies usada en la fuente de información ‘SpeciesAuthor’, el nombre del taxón reconocido “SpeciesAccepted”, la fuente de información como el DOI_ISBN, los años de estudio, sus coordenadas geográficas, el tipo de hábitat, la fuente de la información, entre otros.
```{=latex}
\begin{landscape}
```
```{r Compr9}
#| error: true
cdb_metadata(index_O) %>% head() |> flextable() |> ft_wide() # Evaluar la metadata de la base de datos de COMPADRE
```
```{=latex}
\end{landscape}
```
------------------------------------------------------------------------
### Extraer matrices
¿Cómo extraer matrices de transición de estados de las poblaciones de orquídeas?
Vamos a seleccionar solamente unas matrices de transición de estados de poblaciones de orquídeas. En este caso se selecciona la primera fila del objeto **index_O** que corresponde a la especie ***Laelia speciosa***.
Observamos que hay 4 matriz en la lista. La matriz de transición de estados de poblaciones (matU), la matriz de fecundidad (matF), la matriz de clonación (matC) y la suma de las tres matrices (matA=matU+MatF+matC).
```{=latex}
\begin{landscape}
```
```{r Compr10}
#| error: true
index_O %>% filter(SpeciesAccepted %in% c("Laelia speciosa")) -> Laeliasp # Extraer la información de la especie
head(cdb_metadata(Laeliasp), n = 3) |>
flextable() |> ft_wide() # Visualizar la información de la especie Laelia speciosa
```
```{=latex}
\end{landscape}
```
------------------------------------------------------------------------
### Extraer la matriz de transición de estados de poblaciones
En el siguiente script se muestra como extraer la matriz de transición de estados de poblaciones (matA) de **Laelia speciosa** y las etapas de esta matrices. Nota que el objeto **mat** es una lista de matrices que incluye la matriz de transición (matU) de estados de una población, la matriz de fecundidad (matF), la matriz de clonaje (matC) y la suma de las tres matrices (matA=matU+MatF+matC) vea el capítulo de \[Matrices de transición, fecundidad y clonal\]
```{r Compr11}
#| error: true
Laeliaspmat = matA(Laeliasp) # Extraer la matriz de transiciones de estados de la población (matA) de las cuatro filas
Laeliaspmat
```
------------------------------------------------------------------------
## Extraer matA, matU, matF y matC
Note que esta función es muy práctica porque extrae la matriz de transición de estados de poblaciones (matA), la matriz de supervivencia (matU), la matriz de fecundidad (matF) y la matriz de clonaje (matC) sin necesidad de usar el código largo en adición de los nombres de las etapas.
Se selecciona la segunda fila del objeto **Laeliasp** que corresponde a la especie **Laelia speciosa** y la segunda matriz en la fila\[\[2\]\].
```{r Compr12}
#| error: true
Laeliasp$mat[[2]]
```
------------------------------------------------------------------------
#### Evaluar si un genero o especie este en la base de datos de COMPADRE
- Para filtrar un genero específico se puede usar el siguiente código.
- Aquí seleccionamos todas las matrices del género **Epipactis**.
- Nota que hay 59 filas, que corresponde típicamente a 59 matrices de diferentes poblaciones, tiempo o un análisis teóricos.
```{=latex}
\begin{landscape}
```
```{r Compr13}
#| error: true
Epipactis = TodasSp %>%
filter(Genus %in% c("Epipactis")) # Filtrar la información de *Epipactis* en la base de datos.
head(cdb_metadata(Epipactis), n = 3) |>
flextable() |> ft_wide()
# Nota que en el genero *Epipactis*, tenemos 51 fila, pero todas son de la misma especie de dos estudios distintos.
```
```{=latex}
\end{landscape}
```
------------------------------------------------------------------------
## Matrices promedio
Para un estudio y especie determinados, la base de datos COMPADRE puede contener múltiples matrices que reflejan diferentes combinaciones de población, año y/o tratamiento. Hay una función que permite obtener una única matriz de promedio general para cada grupo de interés (p. ej., MatrixPopulation) y, por lo tanto, limitar la pseudorreplicación. El termino usado es colapsar las matrices, con la función mpm_mean.
Seleccionamos la búsqueda anterior y seleccionamos solamente el estudio de Hens et al. en 2017.
El primer paso es convertir cada una de las matrices de transición de estados de poblaciones en una lista de matrices y luego usar la función mpm_mean para calcular la matriz promedio de todas las matrices de transición de estados de poblaciones. De igual manera se puede calcular la mediana de los elementos de la matriz con la función mpm_median.
```{r Compr14}
#| error: true
Epi_Hens = index_O %>%
filter(SpeciesAuthor %in% c("Epipactis_atrorubens_3")) # Filtrar la información de *Epipactis* en la base de datos.
mpms <- Epi_Hens$mat[Epi_Hens$SpeciesAuthor == "Epipactis_atrorubens_3"] # convertir en lista de matrices
mpm_mean(mpms) # calcular la matriz promedio de todas las matrices de transición de estados de poblaciones. Se consigue una matriz para matA, matU, matF y matC.
```
------------------------------------------------------------------------
## Calcular la desviación de los elementos de la matriz
De igual manera se puede calcular la desviación estándar de los elementos de la matriz de transición de estados de poblaciones con la función mpm_sd.
```{r Compr15}
#| error: true
mpm_sd(mpms) # calcular la desviación estander de los elementos de la matriz de transición de estados de poblaciones. Se consigue una matriz para matA, matU, matF y matC.
```
Muchas veces es poco tedioso evaluar la base de datos completa de COMPADRE. Una manera facilitar el acceso a los datos es extraer las matrices con la función cdb_flatten. Nota lo que hace esta función es extraer todas las matrices de transición de estados de poblaciones (matA, matU, matF, matC) y las etapas de cada matriz y crear una lista con esa información.
Aquí hay 49 filas que corresponden a las 49 matrices de transición de estados de poblaciones de orquídeas del estudio de Hens et al. 2017.
```{r Compr16}
#| error: true
Epi_flat = cdb_flatten(Epi_Hens) # Extraer las matrices de transición de estados de la población
Epi_flat$matA[1] # miramos solamente la primera matriz
```
------------------------------------------------------------------------
### Evaluación de cumplimiento de condiciones
Es sumamente importante el cumplimiento de los supuestos de los análisis. Si no evaluamos críticamente las condiciones de las matrices, pudiese ser que los resultados no sean biológicamente relevantes. Para los análisis de PMP es necesario que las matrices cumplan con ciertas condiciones y dependiendo de la pregunta científica se tiene que evaluar las condiciones específicas. Una de estas condiciones es la ergodicidad e irreducibilidad.
- **check_ergodic**: Para la definición de ergodicidad.
- **check_irreducible**: Para la definición de irreducibilidad.
- **check_NA_A**: Determinar si hay valores faltantes en 'matA' Los valores faltantes ("NA") en las matrices impiden que la mayoría de los cálculos utilicen esas matrices.
- **check_NA_U**: Determinar si hay valores faltantes en 'matU' Los valores faltantes ("NA") en las matrices impiden que la mayoría de los cálculos utilicen esas matrices. La matriz de supervivencia es la matriz más importante para evaluar el Caladlargo de vida de una especie.
- **check_NA_F**: Determinar si hay valores faltantes en 'matF' Los valores faltantes ("NA") en las matrices impiden que la mayoría de los cálculos utilicen esas matrices. La matriz de fecundidad es la matriz más importante para evaluar el crecimiento de la población, cualquier especie donde no tiene fecundidad se verá que tiende disminiur a través del tiempo.
- **check_NA_C**: Determinar si hay valores faltantes en 'matC'. Los valores faltantes ("NA") en las matrices impiden que la mayoría de los cálculos utilicen esas matrices.
- **check_zero_U**: Determinar si la 'matU' tiene todos ceros (incluido 'NA'). Las submatrices compuestas enteramente de valores cero pueden resultar problemáticas. Puede haber buenas razones biológicas para este fenómeno. Por ejemplo, en la población focal particular en el año focal particular, realmente no se registró una supervivencia. Sin embargo, las submatrices de valor cero pueden provocar que algunos cálculos fallen y puede ser necesario excluirlas.
- **check_zero_F**: Determinar si la 'matF' tiene todos ceros (incluido 'NA'). Las submatrices compuestas enteramente de valores cero pueden resultar problemáticas. Puede haber buenas razones biológicas para este fenómeno o que se asocien con preguntas científicas específicas. Por ejemplo, en la población particular en el año particular, realmente no se registró reproducción. Sin embargo, las submatrices con valores de cero pueden provocar que algunos cálculos fallen y puede ser necesario excluirlas. En otros estudios no se evaluó la fecundidad ya que estos parámetros no eran necesarios para contestar las preguntas científicas.
- **check_zero_U_colsum**: Determinar si las columnas de 'matU' suman a cero, esto implica que no hay supervivencia de esa etapa en particular. Esta puede ser una parametrización perfectamente válida para un año/lugar en particular, pero es biológicamente irracional a largo plazo y los usuarios pueden desear excluir matrices problemáticas de su análisis.
- **check_singular_U**: Determinar si 'matU' es singular. Se dice que las matrices son singulares si no se pueden invertir. Se requiere inversión para muchos cálculos matriciales y, por lo tanto, la singularidad puede hacer que algunos cálculos fallen.
- **check_component_sum**: Determinar si las submatrices 'matU'/'matF'/'matC' suman a 'matA'. Un MPM completo ("matA") se puede dividir en las submatrices que lo componen (es decir, "matU", "matF" y "matC"). La suma de estas submatrices debe ser igual al MPM completo (es decir, 'matA' = 'matU' + 'matF' + 'matC'). A veces, sin embargo, se producen errores de modo que las submatrices NO suman 'matA'. Normalmente, esto se debe a errores de redondeo, pero es posible que se produzcan errores más importantes.
- **check_ergodic**: Determinar si 'matA' es ergódico (ver isErgodic). Algunos cálculos matriciales requieren que el MPM ("matA") sea ergódico. Los MPM ergódicos son aquellos en los que existe un único estado estable asintótico que no depende de la estructura de la etapa inicial. Por el contrario, los MPM no ergódicos son aquellos en los que existen múltiples estados estables asintóticos, que dependen de la estructura de la etapa inicial. Los MPM que no son ergódicos suelen ser biológicamente irracionales, tanto en términos de la descripción de su ciclo de vida como de su dinámica proyectada. Por tanto, hacen que algunos cálculos fallen.
- **check_irreductible**: Determinar si 'matA' es irreducible (ver isIrreducible). Algunos cálculos matriciales requieren que el MPM ("matA") sea irreducible. Los MPM irreductibles son aquellos en los que las tasas de transición parametrizadas facilitan el paso de todas las etapas a todas las demás etapas. Por el contrario, los MPM reducibles representan ciclos de vida incompletos donde no son posibles caminos desde todas las etapas a todas las demás etapas. Los MPM que son reducibles suelen ser biológicamente irracionales (pero no siempre), tanto en términos de la descripción de su ciclo de vida como de su dinámica proyectada. Por ello, hacen que algunos cálculos fallen. La irreductibilidad es necesaria pero no suficiente para la ergodicidad.
- **check_primitive**: Deteminar si 'matA' es primitivo (ver isPrimitive). Una matriz primitiva es una matriz no negativa que es irreducible y tiene un solo valor propio de módulo máximo. Por lo tanto, esta verificación es redundante debido a la superposición con 'check_irreducible' y 'checkErdogic'.
- **check_surv_gte_1**: Determinar si 'matU' contiene valores iguales o mayores que 1. La supervivencia está limitada entre 0 y 1. Los valores superiores a 1 no son biológicamente razonables (vea capítulo Impacto de Datos sin sentidos).
Usando la función cdb_flag se puede evaluar todas las opciones en la base de datos de COMPADRE.
Usando la función **cdb_flag** se identifican problemas potenciales en las matrices de transición de estados de las poblaciones. Esa función añade una fila por opciones en la matriz. Nota que para cada prueba anterior crea una columna con **TRUE** o **FALSE** para cada matriz en la base de datos.
Para facilitar el análisis usamos solamente las especies de *Caladenia* y enseñamos solamente las tres primeras filas.
```{=latex}
\begin{landscape}
```
```{r Compr17, warnings=FALSE, message=FALSE}
#| error: true
Caladenia = index_O %>%
filter(Genus %in% c("Caladenia")) # Filtrar la información de *Caladenia* en la base de datos.
Compadre_flagged <- cdb_flag(Caladenia) # Evaluación de todas las opciones en la base de datos de COMPADRE
flagged=Compadre_flagged %>% select(mat, SpeciesAccepted, starts_with("check"))
head(cdb_metadata(flagged), n = 3) |>
flextable() |> ft_wide()
```
```{=latex}
\end{landscape}
```
------------------------------------------------------------------------
### Ergodicidad e Irreductibilidad
En los siguientes procedimientos se aplican filtros específicos a matrices de transición poblacional con el objetivo de evaluar dos propiedades fundamentales en el análisis demográfico: la ergodicidad y la irreductibilidad. Se observa que toda matriz ergódica cumple con la condición de ser irreducible; sin embargo, no todas las matrices irreducibles son necesariamente ergódicas. Para ilustrar esta relación, se cuantificó el número de matrices que cumplen con cada propiedad, permitiendo así una comparación entre ambos conjuntos.
#### Matrices ergódicas
```{=latex}
\begin{landscape}
```
```{r Rage12}
#| error: true
Mat_ergodic <- subset(
Compadre_flagged,
check_NA_A == FALSE & check_ergodic == TRUE
) # para evaluar si las matrices son ergódicas solamente
head(cdb_metadata(Mat_ergodic), n=2) |>
flextable() |> ft_wide()
```
```{=latex}
\end{landscape}
```
#### Matrices irreductibles
```{=latex}
\begin{landscape}
```
```{r Rage12b}
#| error: true
Mat_irred <- subset(
Compadre_flagged,
check_NA_A == FALSE & check_irreducible == TRUE
) # para evaluar si las matrices son irreducibles solamente
head(cdb_metadata(Mat_irred), n=2) |>
flextable() |> ft_wide()
```
```{=latex}
\end{landscape}
```
#### Matrices ergódicas e irreductibles
```{=latex}
\begin{landscape}
```
```{r Rage12c}
#| error: true
Mat_erg_irred <- subset(
Compadre_flagged,
check_NA_A == FALSE & check_irreducible == TRUE & check_ergodic == TRUE
) # para evaluar si las matrices son ergódicas e irreducibles al mismo tiempo
head(cdb_metadata(Mat_erg_irred), n=2) |>
flextable() |> ft_wide()
```
```{=latex}
\end{landscape}
```
Sept 9, 2025