# COMPADRE y Orquídeas {#Compadre}
*Por: Raymond L. Tremblay*
::: callout-note
## Qué es este capítulo
Este capítulo es una **guía práctica de uso del paquete `Rcompadre`**. No introduce conceptos nuevos sobre dinámica poblacional —para eso están los capítulos del 4 al 16—, sino que enseña a manejar la base COMPADRE con confianza: cómo descargarla, filtrarla, validar las matrices, extraer las submatrices U/F/C, y conectar los datos con los análisis del resto del libro. El paquete `Rcompadre` no es trivial: tiene su propia clase de objetos (`CompadreDB`), funciones con nombres similares pero comportamientos distintos, y trampas que cuestan tiempo si uno las descubre por prueba y error. Este capítulo busca acortar esa curva de aprendizaje.
:::
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 usarlos en los modelos y análisis del libro.
## 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.
::: callout-warning
**COMPADRE agrega estudios diversos — la armonización es responsabilidad del usuario.** Las matrices de la base provienen de estudios con definiciones de estadios distintas, periodos de muestreo variables (mensual a multianual) y supuestos de reclutamiento diferentes. La columna `MatrixComposite` indica si una matriz es individual, promedio o *pooled*. Antes de comparar matrices entre estudios, conviene revisar:
- `MatrixDimension`: ¿el número de estadios es comparable?
- `StudyDuration` y `Periodicity`: ¿los pasos de tiempo son iguales?
- `MatrixCriteriaSize` / `MatrixCriteriaAge` / `MatrixCriteriaOntogeny`: ¿los criterios de clasificación son compatibles?
Sin esta armonización, las "comparaciones entre especies" pueden ser artefactos del diseño metodológico, no diferencias biológicas reales.
:::
#### 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 múltiples 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)
```
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 proyección poblacional de **plantas**; COMADRE es la base correspondiente para **animales**. En este capítulo se presenta una introducción a COMPADRE y algunas de las funciones del paquete `Rcompadre`. En el próximo capítulo se presentan funciones del paquete `Rage`. La información aquí no sustituye la documentación oficial en la [página web de COMPADRE](https://compadre-db.org/) ni los tutoriales en la [sección Education](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 (MPP) 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 COMPADRE para evaluar la dinámica de poblaciones de orquídeas, extrayendo diferentes tipos de datos para responder preguntas específicas.
::: callout-tip
**Flujo de trabajo recomendado con COMPADRE.**
1. **Cargar** la base completa una sola vez (`compadre`).
2. **Filtrar** a la familia, género o especie de interés (`filter()`).
3. **Validar** con `cdb_flag()` para detectar problemas (NAs, no ergodicidad, etc.).
4. **Extraer** las matrices (`matU()`, `matF()`, `matC()`, `matA()`).
5. **Analizar** con `popbio`/`popdemo`/`Rage` según la pregunta.
Este capítulo cubre los pasos 1–4. El paso 5 se desarrolla en los capítulos analíticos (elasticidad, LTRE, simulaciones, funciones de transferencia).
:::
::: callout-tip
## ¿Qué función de `Rcompadre` necesito? — Árbol de decisión
| Si quiero… | Use |
|--------------------------------------------------------------------|--------------------------------------------------------------------|
| Bajar la base completa por primera vez | `cdb_fetch("compadre")` |
| Ver los metadatos (especie, año, ubicación, etc.) | `cdb_metadata(x)` |
| Filtrar a una familia | `subset(x, Family == "Orchidaceae")` *o* `x %>% filter(Family == "Orchidaceae")` |
| Filtrar a una especie | `subset(x, SpeciesAccepted == "Lepanthes caritensis")` |
| Marcar matrices con problemas (NAs, no-ergódicas, no-irreducibles) | `cdb_flag(x)` — añade columnas `check_*`, no filtra |
| Quedarme sólo con matrices "limpias" | `subset(cdb_flag(x), check_NA_A == FALSE & check_ergodic == TRUE)` |
| Extraer la matriz de transición completa A | `matA(x)` → lista de matrices |
| Extraer las submatrices | `matU(x)`, `matF(x)`, `matC(x)` |
| Una matriz individual | `matA(x)[[i]]` (la i-ésima) |
| Aplicar una función a todas las matrices | `purrr::map_dbl(matA(x), ~ popbio::lambda(.x))` |
**Regla práctica.** Si no está seguro de qué función usar, casi siempre necesita: `cdb_fetch()` → `subset()` o `filter()` → `cdb_flag()` → `subset(check_* )` → `matU()` / `matF()` / `matA()`.
:::
::: callout-warning
## Trampas comunes con `Rcompadre`
- **`subset()` no es base-R.** `Rcompadre` exporta su propio método `subset()` para objetos `CompadreDB`; la sintaxis se parece a base-R pero respeta la estructura interna del objeto. **No** uses `[]` para subconjuntos directos.
- **`mat` ≠ `matA()`**. `mat` es una columna del data-frame interno; `matA()` es la función que extrae la matriz A de cada fila. Use siempre la función.
- **`cdb_flag()` añade columnas, no filtra**. Después de `cdb_flag()` hay que filtrar manualmente con las columnas `check_*` (`check_NA_A`, `check_ergodic`, `check_irreducible`).
- **`Lat` y `Lon` a veces son `character`, no `numeric`**. Verifíquelo con `class()` antes de mapear o calcular distancias; convierta con `as.numeric()` si es necesario.
- **`MatrixComposite`** indica si una matriz fue promediada o agrupada (*pooled*). Para análisis comparativo conviene quedarse con `MatrixComposite == "Individual"` para evitar pseudoreplicación.
- **`MatrixCriteriaSize` / `MatrixCriteriaAge` / `MatrixCriteriaOntogeny`** describen cómo se definieron los estadios. Antes de comparar matrices entre estudios, conviene verificar que estos criterios sean compatibles.
:::
::: callout-note
## Campos de metadatos esenciales
De los más de 50 campos en COMPADRE, estos 9 son los que usará el 95% del tiempo:
| Campo | Qué contiene |
|------------------------|-------------------------------------------------------------------------|
| `Family` | Familia taxonómica (ej. `"Orchidaceae"`) |
| `SpeciesAccepted` | Nombre científico aceptado |
| `MatrixPopulation` | Identificador de la población (varias por especie en muchos estudios) |
| `StudyStart`/`StudyEnd`| Años de inicio y fin del muestreo |
| `MatrixDimension` | Número de estadios en la matriz |
| `OrganismType` | "Epiphyte", "Herbaceous perennial", etc. |
| `Lat`, `Lon` | Coordenadas de la población (a menudo como texto, ver Trampas) |
| `MatrixComposite` | "Individual" / "Mean" / "Pooled" — clave para análisis comparativos |
| `DOI_ISBN` | Identificador del estudio original |
Para la lista completa: `?Rcompadre::CompadreDB` y la documentación oficial.
:::
------------------------------------------------------------------------
## Acceso a los datos de COMPADRE
Hay tres formas de obtener la base. Las tres dejan en el entorno un objeto llamado `compadre` que contiene todas las matrices y metadatos.
### Opción 1 — Descarga manual desde la página web
La forma más sencilla es descargar el archivo `.RData` desde la página oficial: <https://compadre-db.org/Data/Compadre>. Al momento de la edición de este libro la versión más reciente es la 6.28.8.0 (agosto 2025). Una vez descargado, se carga con `load()`:
```{r}
#| eval: false
load("ruta/a/COMPADRE_v.6.28.8.0.RData")
```
### Opción 2 — Descarga directa desde R
El paquete `Rcompadre` incluye la función `cdb_fetch()` que descarga la última versión directamente desde R, sin necesidad de descargar el archivo manualmente:
```{r}
#| eval: false
compadre <- cdb_fetch("compadre")
```
### Opción 3 — Archivo precompilado de este libro
Para garantizar reproducibilidad, este libro distribuye una copia local del *snapshot* de COMPADRE usado en los ejemplos. Esta es la opción que se usa en el resto del capítulo:
```{r Compr4, message=FALSE}
#| error: true
compadre <- readRDS("data/COMPADRE_2026.rds")
```
------------------------------------------------------------------------
### Verificar la base cargada
Una vez cargada, conviene verificar el tamaño y la estructura. Al momento de edición la base tiene 9149 filas (matrices) y 59 columnas (variables/metadatos).
```{r Compr6}
#| error: true
dim(compadre)
```
------------------------------------------------------------------------
### 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(compadre, 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 contiene 788 filas, es decir 788 matrices de transición de estados de poblaciones de orquídeas.
```{r compr8}
#| error: true
index_O = compadre %>%
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últiples 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 cómo extraer la matriz de transición de estados de poblaciones (matA) de *Laelia speciosa* y las etapas de estas 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 clonaje](#MatricesTFC).
```{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 género o especie está en la base de datos de COMPADRE
- Para filtrar un género específico se puede usar el siguiente código.
- Aquí seleccionamos todas las matrices del género *Epipactis*.
- Nota que hay 59 filas, que corresponden típicamente a 59 matrices de diferentes poblaciones, tiempos o análisis teóricos.
```{=latex}
\begin{landscape}
```
```{r Compr13}
#| error: true
Epipactis = compadre %>%
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 género *Epipactis* tenemos 51 filas, pero todas son de la misma especie de dos estudios distintos.
```
```{=latex}
\end{landscape}
```
------------------------------------------------------------------------
## Matrices promedio
::: callout-tip
**Pseudorreplicación: cuándo colapsar matrices.** Cuando un estudio reporta múltiples matrices para la misma población-año (e.g., diferentes tratamientos o réplicas dentro de un sitio), incluirlas todas en un análisis comparativo entre estudios infla artificialmente el tamaño de muestra. La función `mpm_mean()` reduce el conjunto a una sola matriz promedio por grupo, eliminando la pseudorreplicación. Para ver la dispersión interna del grupo, `mpm_sd()` calcula la matriz de desviaciones estándar elemento por elemento.
:::
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 promedio para cada grupo de interés (p. ej., `MatrixPopulation`) y, por lo tanto, limitar la pseudorreplicación. El término 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 estándar 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 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
::: callout-note
**`cdb_flag()` agrega una columna por cada chequeo.** Para una base con muchas matrices, no se filtran las problemáticas: se les agrega banderas (`check_NA_A`, `check_ergodic`, `check_irreducible`, etc.) y luego el usuario decide qué excluir según la pregunta. Por ejemplo, para análisis de elasticidad se requiere ergodicidad e irreducibilidad; para descripciones cualitativas del ciclo de vida, una matriz reducible puede ser perfectamente válida. La filosofía es **transparencia**: nunca se eliminan matrices automáticamente, siempre se documenta por qué se excluyen.
:::
Es sumamente importante el cumplimiento de los supuestos de los análisis. Si no evaluamos críticamente las condiciones de las matrices, los resultados podrían no ser biológicamente relevantes. Para los análisis de MPP es necesario que las matrices cumplan ciertas condiciones, y dependiendo de la pregunta científica se evalúan las condiciones específicas. La función `cdb_flag()` corre todos los chequeos de calidad disponibles y agrega una columna por cada uno; los principales son:
- **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 cálculo del largo 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 sin fecundidad tenderá a disminuir 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 MPP 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 MPP 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 MPP ("matA") sea ergódico. Los MPP 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 MPP 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 MPP 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_irreducible**: Determinar si 'matA' es irreducible (ver isIrreducible). Algunos cálculos matriciales requieren que el MPP ("matA") sea irreducible. Los MPP 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 MPP reducibles representan ciclos de vida incompletos donde no son posibles caminos desde todas las etapas a todas las demás etapas. Los MPP 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**: Determinar 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 (ver el capítulo de [Impacto de datos sin sentido](122-Impacto_de_Datos_sin_Sentido.qmd)).
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}
```
------------------------------------------------------------------------
## ¿Qué sigue?
Una vez identificadas las matrices que cumplen los chequeos relevantes para tu pregunta, los siguientes pasos típicos son:
- **Calcular métricas demográficas** (esperanza de vida, edad de primera reproducción, generación) con el paquete `Rage` — ver el capítulo siguiente.
- **Comparar λ entre poblaciones, especies o tratamientos** — ver los capítulos de [Crecimiento poblacional](109-Crecimiento_poblacional.qmd) y [LTRE](#ERTV).
- **Evaluar sensibilidad y elasticidad** — ver el capítulo de [Elasticidad](#Elasticidad).
- **Simular dinámicas bajo escenarios alternativos** — ver el capítulo de [Métodos de simulación](115-Metodos_de_simulaciones.qmd).
El conjunto filtrado (`Mat_erg_irred` en el ejemplo) está listo para alimentar cualquiera de estos análisis sin preocuparse por matrices defectuosas.
------------------------------------------------------------------------
## Ejercicios — Pruebe usted mismo
Aprender `Rcompadre` requiere ensuciarse las manos. Estos ejercicios usan exclusivamente las funciones presentadas en este capítulo. Las soluciones se construyen combinando `cdb_fetch()`, `subset()`/`filter()`, `cdb_flag()`, `matU()`/`matF()`/`matA()` y verbos de `dplyr`.
::: callout-tip
## Ejercicio 1 — *Lepanthes* en COMPADRE
¿Cuántas matrices de proyección hay en COMPADRE para el género *Lepanthes*? ¿Cuántas son ergódicas e irreducibles al mismo tiempo? ¿De cuántas especies distintas son?
**Pista:** filtre por `Genus == "Lepanthes"`, aplique `cdb_flag()`, y use `length(unique(SpeciesAccepted))`.
:::
::: callout-tip
## Ejercicio 2 — Cosecha sostenible
Encuentre todas las matrices de orquídeas en COMPADRE asociadas a estudios de cosecha (busque las palabras clave `harvest` o `cosecha` en `Authors` o el DOI). ¿Qué especies aparecen? ¿Para cuáles existen matrices de la misma población con y sin cosecha?
**Pista:** la base no tiene un campo "cosecha" estructurado; tendrá que filtrar el conjunto cargado por palabras en metadatos como `MatrixPopulation` o usar `DOI_ISBN` para identificar pares de estudios.
:::
::: callout-tip
## Ejercicio 3 — Estudios largos
Liste todas las orquídeas de COMPADRE cuyo estudio duró ≥ 5 años (`StudyEnd - StudyStart >= 5`) y que tengan al menos 4 estadios en la matriz (`MatrixDimension >= 4`). ¿Qué tienen en común estas especies en términos de hábitat (`OrganismType`)?
**Pista:** este filtro le permite identificar el subconjunto de estudios "robustos" para análisis comparativos —tamaño de muestra suficiente y resolución demográfica suficiente.
:::
::: callout-tip
## Ejercicio 4 — Calidad de los datos
Para el conjunto del ejercicio 3, ¿qué proporción de matrices pasa los tres chequeos (`check_NA_A == FALSE`, `check_ergodic == TRUE`, `check_irreducible == TRUE`)? ¿Las que fallan, fallan por NAs, por reducibilidad, o por no-ergodicidad?
**Pista:** después de `cdb_flag()`, use `table(Mat$check_NA_A, Mat$check_ergodic)` o `summarise()` con `dplyr` para contar los modos de falla.
:::
Estos ejercicios son representativos del trabajo real con COMPADRE: nunca se cargan todas las matrices, siempre se filtra primero, casi siempre hay que combinar criterios biológicos (hábitat, género) con criterios técnicos (`check_*`), y a menudo el resultado es un conjunto menor de matrices "limpias" sobre las que se hacen los análisis del resto del libro.