Por: Raymond L. Tremblay

17.0.0.1 Librerías de R requeridas para el siguiente módulo

Código
library(Rcompadre)  # Paquete para trabajar con la base de datos de COMPADRE y COMADRE
library(tidyverse)  # Paquete para activar multiples paquetes
library(readxl)
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(skimr)
library(flextable)  # Paquete para formatear tablas

El presente capítulo examina una selección de funciones contenidas en el paquete Rage, diseñado para facilitar el análisis de datos provenientes de las bases de datos COMPADRE y COMADRE. Estos repositorios públicos reúnen información sobre la dinámica poblacional de plantas (COMPADRE) y animales (COMADRE), estructurada en matrices de transición por estados o edades (MPM). La librería Rage ofrece herramientas analíticas que permiten estimar parámetros demográficos clave, tales como la esperanza de vida, la edad de inicio de la reproducción, la entropía poblacional y la tasa de crecimiento, entre otros. A lo largo del capítulo, se ilustran algunas de estas funciones y se demuestra su aplicación en el estudio de la dinámica poblacional de especies de orquídeas.


17.0.1 Acceso a los datos de COMPADRE.

Vea el capítulo anterior


17.0.1.1 Rastreando los datos con el enlace de web

La obtención de datos directamente desde el sitio web de COMPADRE puede realizarse mediante la función cdb_fetch(), la cual forma parte del paquete Rcompadre. Esta herramienta permite acceder de manera eficiente y automatizada a los datos de dinámica poblacional disponibles en dicho repositorio, facilitando su integración en flujos de trabajo reproducibles dentro del entorno de R.

Código
compadre <- readRDS("data/COMPADRE_2026.rds")  # Usar este código para bajar los datos del repositorio de COMPADRE.

17.0.1.2 Renombrar la base datos a algo sencillo

En este segmento del script, se realiza una simplificación del nombre de la base de datos COMPADRE, asignándole el identificador TodasSp. Aunque el paquete `Rage recomienda convertir el objeto original de clase list en un objeto de clase CompadreDB mediante la función as_cdb(), en este caso se conserva la estructura original para facilitar el acceso directo a sus componentes. A continuación, se utiliza la función names() para visualizar los nombres de las variables contenidas en la base de datos. Esta operación revela que el conjunto de datos incluye un total de 59 variables, las cuales describen diversos atributos ecológicos y demográficos de las especies registradas.

Código
# TodasSp=as_cdb(compadre) # Un paso critico: Convertir la
# base de datos anterior COM(P)ADRE (de clase 'list') en la
# base en un objeto CompadreDB (COMPADRE Database)

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.
 [1] "mat"                    "MatrixID"               "SpeciesAuthor"         
 [4] "SpeciesAccepted"        "CommonName"             "Kingdom"               
 [7] "Phylum"                 "Class"                  "Order"                 
[10] "Family"                 "Genus"                  "Species"               
[13] "Infraspecies"           "InfraspeciesType"       "OrganismType"          
[16] "DicotMonoc"             "AngioGymno"             "Authors"               
[19] "Journal"                "SourceType"             "OtherType"             
[22] "YearPublication"        "DOI_ISBN"               "AdditionalSource"      
[25] "StudyDuration"          "StudyStart"             "StudyEnd"              
[28] "ProjectionInterval"     "MatrixCriteriaSize"     "MatrixCriteriaOntogeny"
[31] "MatrixCriteriaAge"      "MatrixPopulation"       "NumberPopulations"     
[34] "Lat"                    "Lon"                    "Altitude"              
[37] "Country"                "Continent"              "Ecoregion"             
[40] "StudiedSex"             "MatrixComposite"        "MatrixSeasonal"        
[43] "MatrixTreatment"        "MatrixCaptivity"        "MatrixStartYear"       
[46] "MatrixStartSeason"      "MatrixStartMonth"       "MatrixEndYear"         
[49] "MatrixEndSeason"        "MatrixEndMonth"         "CensusType"            
[52] "MatrixSplit"            "MatrixFec"              "Observations"          
[55] "MatrixDimension"        "SurvivalIssue"          "_Database"             
[58] "_PopulationStatus"      "_PublicationStatus"    

17.0.2 Filtrar para la familia de Orquidaceae

Para filtrar únicamente las especies pertenecientes a la familia Orchidaceae en la base de datos COMPADRE (ahora renombrada como TodasSp), puedes utilizar la función filter() del paquete dplyr. Aquí tienes el código en R con estilo claro y académico:

Código
Orquideas = TodasSp %>%
    filter(Family %in% c("Orchidaceae"))  # Extraer las orquídeas de la base de datos.

# Assuming Orquideas is a CompadreDB object
head(cdb_metadata(Orquideas), n = 3) |>
    flextable() |>
    ft_wide()

MatrixID

SpeciesAuthor

SpeciesAccepted

CommonName

Kingdom

Phylum

Class

Order

Family

Genus

Species

Infraspecies

InfraspeciesType

OrganismType

DicotMonoc

AngioGymno

Authors

Journal

SourceType

OtherType

YearPublication

DOI_ISBN

AdditionalSource

StudyDuration

StudyStart

StudyEnd

ProjectionInterval

MatrixCriteriaSize

MatrixCriteriaOntogeny

MatrixCriteriaAge

MatrixPopulation

NumberPopulations

Lat

Lon

Altitude

Country

Continent

Ecoregion

StudiedSex

MatrixComposite

MatrixSeasonal

MatrixTreatment

MatrixCaptivity

MatrixStartYear

MatrixStartSeason

MatrixStartMonth

MatrixEndYear

MatrixEndSeason

MatrixEndMonth

CensusType

MatrixSplit

MatrixFec

Observations

MatrixDimension

SurvivalIssue

_Database

_PopulationStatus

_PublicationStatus

238,285

Caladenia_amonea

Caladenia amonea

Plantae

Tracheophyta

Liliopsida

Asparagales

Orchidaceae

Caladenia

amonea

Herbaceous perennial

Monocot

Angiosperm

Raymond L. Tremblay; Pérez; Larcombe; Brown; Quarmby; Bickerton; French; Bould

Aust J Bot

Journal Article

2009

10.1071/BT08167

12

1996

2007

1

No

Yes

No

North-eastern Melbourne, Vic

1

AUS

Oceania

TBM

A

Mean

No

Unmanipulated

W

1996

Summer

8

2007

Autumn

9

Divided

Locations of surveyed areas are kept vague to reduce the likelihood of unauthorised disturbance of the populations

3

1

COMPADRE

Released

Released

238,286

Caladenia_argocalla

Caladenia argocalla

Plantae

Tracheophyta

Liliopsida

Asparagales

Orchidaceae

Caladenia

argocalla

Herbaceous perennial

Monocot

Angiosperm

Raymond L. Tremblay; Pérez; Larcombe; Brown; Quarmby; Bickerton; French; Bould

Aust J Bot

Journal Article

2009

10.1071/BT08167

12

1996

2007

1

No

Yes

No

Adelaide Hills and Clare Valley, SA

1

AUS

Oceania

TBM

A

Mean

No

Unmanipulated

W

2003

Autumn

9

2007

Autumn

10

Divided

No

Locations of surveyed areas are kept vague to reduce the likelihood of unauthorised disturbance of the populations

3

1

COMPADRE

Released

Released

238,287

Caladenia_clavigera

Caladenia clavigera

Plantae

Tracheophyta

Liliopsida

Asparagales

Orchidaceae

Caladenia

clavigera

Herbaceous perennial

Monocot

Angiosperm

Raymond L. Tremblay; Pérez; Larcombe; Brown; Quarmby; Bickerton; French; Bould

Aust J Bot

Journal Article

2009

10.1071/BT08167

12

1996

2007

1

No

Yes

No

North-eastern Melbourne, Vic

1

AUS

Oceania

TBM

A

Mean

No

Unmanipulated

W

1997

Autumn

9

2007

Autumn

10

Divided

Locations of surveyed areas are kept vague to reduce the likelihood of unauthorised disturbance of the populations

3

1

COMPADRE

Released

Released


17.1 Cuantos estudios únicos?

En este bloque de código se construye un nuevo conjunto de datos, SPECIES_O, que resume información clave sobre los estudios incluidos en la base de datos de orquídeas. Se seleccionan variables relevantes como el año de inicio y finalización del estudio (StudyStart, StudyEnd), el nombre científico aceptado de la especie (SpeciesAccepted), el año de publicación (YearPublication), los autores (Authors), el identificador del artículo (DOI_ISBN), el tipo de organismo (OrganismType), y el identificador de población (MatrixPopulation), junto con la matriz de proyección (mat).

Luego, se agrupan los datos por especie, año de publicación, tipo de organismo y periodo del estudio, y se calcula el número de poblaciones únicas muestreadas por especie mediante length(unique(MatrixPopulation)). El resultado se ordena alfabéticamente por especie y se normalizan los valores de los años como variables numéricas. Finalmente, se recodifica la variable OrganismType para traducir los términos originales del inglés al español: “Epiphyte” se convierte en “Epífita” y “Herbaceous perennial” en “Terrestre”. Se eliminan los registros con valores faltantes en los años de inicio o finalización del estudio.

Este resumen permite visualizar de forma clara cuántas poblaciones fueron muestreadas por especie, en qué periodo se realizaron los estudios, y qué tipo de orquídea fue analizada, lo que facilita comparaciones entre especies y estudios.

Código
# names(Orquideas) Los nombres de las variables
SPECIES_O = Orquideas %>%
    select(StudyStart, StudyEnd, SpeciesAccepted, YearPublication,
        Authors, DOI_ISBN, OrganismType, MatrixPopulation, mat) %>%
    group_by(SpeciesAccepted, YearPublication, OrganismType,
        StudyStart, StudyEnd) %>%
    summarize(n_populations = length(unique(MatrixPopulation))) %>%
    arrange(SpeciesAccepted) %>%
    mutate(StudyStart = as.numeric(StudyStart)) %>%
    mutate(StudyEnd = as.numeric(StudyEnd)) %>%
    mutate(OrganismType_RC = fct_recode(OrganismType, Epífita = "Epiphyte",
        Terrestre = "Herbaceous perennial")) |>
    drop_na(StudyStart, StudyEnd) |>
    ungroup()


flextable(head(SPECIES_O))

SpeciesAccepted

YearPublication

OrganismType

StudyStart

StudyEnd

n_populations

OrganismType_RC

Aspasia principissa

2006

Epiphyte

1,997

2,004

1

Epífita

Brassavola cucullata

2020

Epiphyte

2,009

2,014

3

Epífita

Broughtonia cubensis

2021

Epiphyte

2,006

2,019

3

Epífita

Caladenia amonea

2009

Herbaceous perennial

1,996

2,007

1

Terrestre

Caladenia argocalla

2009

Herbaceous perennial

1,996

2,007

1

Terrestre

Caladenia clavigera

2009

Herbaceous perennial

1,996

2,007

1

Terrestre

Código
# write_csv(SPECIES_O, 'DATA/Species_O.csv')

17.1.1 Determinar cuantas poblaciones fueron muestreadas por especies

Cúal es la frecuencia de cantidad de poblaciones por especies en la base de datos.

  • La mayoría de las especies fueron estudiadas en una sola población.

  • Sin embargo, hay casos en los que se muestrearon hasta 18 poblaciones distintas para una misma especie.

Este gráfico permite observar claramente la concentración de estudios en pocas poblaciones, así como los casos excepcionales con mayor cobertura. Esto puede reflejar diferencias en el diseño de los estudios, disponibilidad de datos o interés ecológico particular en ciertas especies.

Código
as.data.frame(table(SPECIES_O$n_populations)) |>
    ggplot(aes(Var1, Freq)) + geom_bar(stat = "identity", aes(fill = "lightblue")) +
    rlt_style_fill() + ylab("Frecuencia") + xlab("Cantidad de Poblaciones \n en el estudio") +
    theme(legend.position = "none")


17.1.2 La cantidad de poblaciones por especies en la base de datos de COMPADRE.

La cantidad de poblaciones muestreadas por especie en la base de datos de COMPADRE varía considerablemente. Aunque la mayoría de las especies están representadas por una sola población, existen casos en los que se han registrado hasta 20 poblaciones distintas para una misma especie. Estas poblaciones pueden provenir de diferentes publicaciones científicas o representar datos recolectados en distintos momentos o con distintos objetivos dentro de una misma población. Por ejemplo, los datos de Lepanthes rupestris provienen de dos estudios independientes (Tremblay & Ackerman, 2001; Tremblay & McCarthy, 2014). En el primero, se utilizaron matrices poblacionales para estimar el tamaño efectivo de las poblaciones (Ne), mientras que en el segundo se emplearon los mismos datos para desarrollar un enfoque bayesiano que permite estimar los elementos de las matrices de transición, especialmente útil cuando se dispone de pocos datos por población o periodo. Este enfoque aprovecha la información conjunta de todas las poblaciones para generar estimaciones más robustas y biológicamente realistas.


17.1.3 ¿Cuan largo fueron los estudios?

La duración de los estudios en la base de datos de orquídeas de COMPADRE varía considerablemente. Aunque muchos estudios abarcan solo unos pocos años —el mínimo requerido para calcular una matriz de transición poblacional es de dos periodos—, también existen investigaciones que se extienden por lapsos más prolongados. Algunos estudios, como los realizados por Tremblay con Lepanthes rupestris, incluyen muestreos mensuales, mientras que otros se basan en observaciones anuales. Esta diversidad en la temporalidad refleja tanto los objetivos específicos de cada investigación como las estrategias metodológicas empleadas.

La siguiente visualización muestra cómo varía la duración de los estudios según el tipo de orquídea, diferenciando entre especies epífitas y terrestres:

Código
SPECIES_O$SpeciesAccepted <- fct_reorder(SPECIES_O$SpeciesAccepted,
    SPECIES_O$StudyStart, .desc = FALSE)

ggplot(SPECIES_O, aes(SpeciesAccepted, ymin = StudyStart, ymax = StudyEnd,
    color = OrganismType_RC)) + geom_linerange() + coord_flip() +
    theme(legend.position.inside = c(0.2, 0.8)) + ylab("") +
    xlab("") + rlt_style_colour() + theme(axis.text.x = element_text(color = "grey20",
    size = 9, angle = 90, hjust = 0.5, vjust = 0.5, face = "plain"),
    axis.text.y = element_text(color = "grey20", size = 7, angle = 0,
        hjust = 1, vjust = 0, face = "plain"), axis.title.x = element_text(color = "grey20",
        size = 12, angle = 0, hjust = 0.5, vjust = 0, face = "plain"),
    axis.title.y = element_text(color = "grey20", size = 12,
        angle = 90, hjust = 0.5, vjust = 0.5, face = "plain")) +
    theme(legend.position = c(0.2, 0.8), legend.title = element_blank()) +
    theme(axis.text.y = element_text(size = 5)) + scale_y_continuous(n.breaks = 12)

Código
# ggsave('images/Lenght_survey.png')

17.1.4 Tiempo de duración de las investigaciones.

La siguiente figura muestra la duración de los estudios realizados sobre orquídeas epífitas y terrestres. Según los datos extraídos de la base de datos COMPADRE, la mayoría de las investigaciones tuvieron una duración relativamente corta, especialmente en el caso de las especies epífitas. Sin embargo, también se registran estudios que se extendieron por más de 20 años, lo que evidencia un compromiso a largo plazo en algunos casos para entender mejor la dinámica poblacional de estas plantas.

Código
Orquideas = Orquideas %>%
    mutate(StudyDuration = as.numeric(StudyDuration), OrganismType_RC = fct_recode(OrganismType,
        Epífita = "Epiphyte", Terrestre = "Herbaceous perennial"))

# table(Orquideas$StudyDuration)
# table(Orquideas$OrganismType)

ggplot(Orquideas, aes(StudyDuration, fill = OrganismType_RC)) +
    geom_histogram(colour = "white") + facet_wrap(~OrganismType_RC) +
    theme(legend.position = "none") + xlab("Duración de los estudios") +
    ylab("Frecuencia") + rlt_style_fill() + scale_x_continuous(n.breaks = 10)

Código
# ggsave('Duración_Epi_Ter.pdf')

ggsave("images/Duración_Epi_Ter.png")


17.1.5 Cálculo del Valor Propio Dominante (λ) en Matrices Ergodicas e Irreductibles

A partir del conjunto de matrices previamente filtradas por cumplir con las condiciones de ergodicidad e irreducibilidad, se procede al cálculo del valor propio dominante (\(\lambda\)), el cual representa la tasa de crecimiento poblacional asintótica en modelos matriciales.

Para ello, se emplea la función eigs del paquete popdemo, que permite obtener los valores propios de una matriz. Esta función se aplica a cada matriz seleccionada mediante sapply, generando una lista de valores de (\(\lambda\)) almacenados en el objeto lambdaVals. Cada entrada en esta lista corresponde al valor propio dominante de una matriz matA incluida en el conjunto de datos.

Posteriormente, se utiliza la función summary para obtener una descripción estadística de los valores de (\(\lambda\)), y la función hist para visualizar su distribución, lo que permite evaluar la variabilidad en las tasas de crecimiento poblacional entre las distintas especies o poblaciones representadas.

17.1.5.1 Matrices ergódicas e irreductibles

Código
Compadre_flagged <- cdb_flag(Orquideas)

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()

MatrixID

SpeciesAuthor

SpeciesAccepted

CommonName

Kingdom

Phylum

Class

Order

Family

Genus

Species

Infraspecies

InfraspeciesType

OrganismType

DicotMonoc

AngioGymno

Authors

Journal

SourceType

OtherType

YearPublication

DOI_ISBN

AdditionalSource

StudyDuration

StudyStart

StudyEnd

ProjectionInterval

MatrixCriteriaSize

MatrixCriteriaOntogeny

MatrixCriteriaAge

MatrixPopulation

NumberPopulations

Lat

Lon

Altitude

Country

Continent

Ecoregion

StudiedSex

MatrixComposite

MatrixSeasonal

MatrixTreatment

MatrixCaptivity

MatrixStartYear

MatrixStartSeason

MatrixStartMonth

MatrixEndYear

MatrixEndSeason

MatrixEndMonth

CensusType

MatrixSplit

MatrixFec

Observations

MatrixDimension

SurvivalIssue

_Database

_PopulationStatus

_PublicationStatus

OrganismType_RC

check_NA_A

check_NA_U

check_NA_F

check_NA_C

check_zero_U

check_zero_F

check_zero_C

check_zero_U_colsum

check_singular_U

check_component_sum

check_ergodic

check_irreducible

check_primitive

check_surv_gte_1

238,285

Caladenia_amonea

Caladenia amonea

Plantae

Tracheophyta

Liliopsida

Asparagales

Orchidaceae

Caladenia

amonea

Herbaceous perennial

Monocot

Angiosperm

Raymond L. Tremblay; Pérez; Larcombe; Brown; Quarmby; Bickerton; French; Bould

Aust J Bot

Journal Article

2009

10.1071/BT08167

12

1996

2007

1

No

Yes

No

North-eastern Melbourne, Vic

1

AUS

Oceania

TBM

A

Mean

No

Unmanipulated

W

1996

Summer

8

2007

Autumn

9

Divided

Locations of surveyed areas are kept vague to reduce the likelihood of unauthorised disturbance of the populations

3

1

COMPADRE

Released

Released

Terrestre

false

false

false

false

false

true

true

false

false

true

true

true

true

false

238,286

Caladenia_argocalla

Caladenia argocalla

Plantae

Tracheophyta

Liliopsida

Asparagales

Orchidaceae

Caladenia

argocalla

Herbaceous perennial

Monocot

Angiosperm

Raymond L. Tremblay; Pérez; Larcombe; Brown; Quarmby; Bickerton; French; Bould

Aust J Bot

Journal Article

2009

10.1071/BT08167

12

1996

2007

1

No

Yes

No

Adelaide Hills and Clare Valley, SA

1

AUS

Oceania

TBM

A

Mean

No

Unmanipulated

W

2003

Autumn

9

2007

Autumn

10

Divided

No

Locations of surveyed areas are kept vague to reduce the likelihood of unauthorised disturbance of the populations

3

1

COMPADRE

Released

Released

Terrestre

false

false

false

false

false

true

true

false

false

true

true

true

true

false

Código
lambdaVals_list <- sapply(matA(Mat_erg_irred), popdemo::eigs,
    what = "lambda")

lambdaVals = as_tibble(lambdaVals_list)

tidy(lambdaVals) |>
    flextable()
Error in `seq.default()`:
! wrong sign in 'by' argument
Código
ggplot(lambdaVals, aes(value)) + geom_histogram(aes(fill = "lightblue"),
    colour = "white") + rlt_style_fill() + xlab("Lambda") + ylab("Frecuencia") +
    scale_x_continuous(n.breaks = 10) + theme(legend.position = "none")

Una metodología alternativa para calcular los valores propios dominantes (\(\lambda\)) de las matrices de transición poblacional consiste en utilizar la función map_dbl de la librería purrr. Esta función permite aplicar una operación a cada elemento de una lista, devolviendo un vector numérico de igual longitud. En este contexto, se aplica una función de cálculo de \(\lambda\) a cada matriz de transición (matA), obteniendo así un valor de \(\lambda\) por matriz. Esta estrategia resulta eficiente para el procesamiento simultáneo de múltiples matrices dentro de un flujo de trabajo reproducible en R.

Código
## con el paquete popdemo
lambdaVals1 <- map_dbl(matA(Mat_erg_irred), ~popdemo::eigs(.x,
    what = "lambda"))

## O puede calcular lambda con el paquete popbio, que evita
## algunos mensajes de advertencia

lambdaVals2 <- map_dbl(matA(Mat_erg_irred), ~popbio::lambda(.x))

17.2 Variación en el crecimiento poblacional entre especies epífitas y terrestres

En esta sección se seleccionan las especies clasificadas como epífitas y terrestres, agrupándolas en objetos distintos que contienen todas las poblaciones muestreadas correspondientes. Esta separación permite evaluar comparativamente la variación en las tasas de crecimiento poblacional entre ambos grupos funcionales, facilitando el análisis de patrones ecológicos y demográficos asociados a sus respectivos hábitos de vida.

Código
epifitas = Orquideas %>%
    filter(OrganismType == "Epiphyte")

terrestres = Orquideas %>%
    filter(OrganismType == "Herbaceous perennial")
Código
Compadre_flagged_epif <- cdb_flag(epifitas)

x_epif <- subset(Compadre_flagged_epif, check_NA_A == FALSE &
    check_ergodic == TRUE)

# sapply(matA(x_epi), popdemo::eigs, what='lambda')

lambda_epif <- map_dbl(matA(x_epif), ~popdemo::eigs(.x, what = "lambda"))

# Or with popbio, which avoids some warning messages…

Compadre_flagged_terrestres <- cdb_flag(terrestres)

x_terr <- subset(Compadre_flagged_terrestres, check_NA_A == FALSE &
    check_ergodic == TRUE)

lambda_terr <- map_dbl(matA(x_terr), ~popdemo::eigs(.x, what = "lambda"))

17.2.1 Evaluación de Tendencias Centrales y Dispersión en Especies Terrestres y Epífitas

Mediante el uso de la función summary, se analizaron las medidas de tendencia central y dispersión de los valores propios de lambda correspondientes a especies terrestres y epífitas. Los resultados indican que las especies terrestres presentan una mayor dispersión en los valores de lambda en comparación con las especies epífitas. Aunque los promedios difieren ligeramente entre ambos grupos, las medianas resultaron ser similares, lo que sugiere patrones demográficos comparables en términos de centralidad, pero con variabilidad distinta en su comportamiento poblacional.

Código
library(flextable)

# Clacular resúmenes
epif_summary <- summary(lambda_epif)
terr_summary <- summary(lambda_terr)

# Unire los resúmenes en un solo data frame
combined_df <- rbind(Epífita = epif_summary, Terrestre = terr_summary)

# Convertir a data frame y añadir columna de hábitat
combined_df <- as.data.frame(combined_df)
combined_df$Habit <- rownames(combined_df)

# Reordenar columnas
combined_df <- combined_df[, c("Habit", names(epif_summary))]

# Crear la tabla con flextable
flextable(combined_df)

Habit

Min.

1st Qu.

Median

Mean

3rd Qu.

Max.

Epífita

0.3887968

0.9690608

0.9950628

0.9776130

1.004671

1.359231

Terrestre

0.4088863

0.9295530

0.9992454

0.9988654

1.043194

1.776031

Para visualizar los datos en una figura de ggplot2, hay que convertir estas filas en un data.frame y añadir una columna con el tipo de habitad, renombrar la columna lambda y unir los dos data.frames en uno solo.

Código
df_Lamb_epif = as.data.frame(lambda_epif)
df_Lamb_terr = as.data.frame(lambda_terr)

Crear una columna con el tipo de hábitat y renombrar la columna lambda

Código
df_Lamb_epi = df_Lamb_epif %>%
    add_column(Habit_Type = "Epífitas") %>%
    rename(lambda = lambda_epif)

df_Lamb_terr = as.data.frame(lambda_terr)
df_Lamb_terr = df_Lamb_terr %>%
    add_column(Habit_Type = "Terrestre") %>%
    rename(lambda = lambda_terr)

Unir los dos data.frame en uno solo

Código
ALL_Lambdas = rbind(df_Lamb_epi, df_Lamb_terr)  # unir los dos data frame en uno

Visualizar el crecimiento poblacional por tipo de hábitat

Código
ggplot(ALL_Lambdas, aes(lambda, fill = Habit_Type)) + geom_histogram(colour = "white") +
    facet_wrap(~Habit_Type) + rlt_style_fill() + scale_x_continuous(n.breaks = 8) +
    theme(axis.text.x = element_text(angle = 45, hjust = 1)) +
    ylab("Frecuencia")

Código
# ggsave('images/Terr_Epi_lambda.png')

17.3 Estimación del crecimiento promedio y evaluación de diferencias significativas

Para evaluar si existen diferencias significativas en los valores propios de lambda entre especies epífitas y terrestres, se emplea un modelo lineal utilizando la función lm. En este análisis, la variable Habit_Type se utiliza como predictor del valor propio dominante (\(\lambda\)), lo que permite estimar el efecto del tipo de hábitat sobre la tasa de crecimiento poblacional. Los resultados del modelo indican que las especies epífitas tienden a presentar valores de lambda más bajos en comparación con las especies terrestres. Para obtener los coeficientes específicos de cada grupo, se ajusta un segundo modelo excluyendo el intercepto mediante la inclusión de -1 en la fórmula. Esta parametrización permite calcular directamente el promedio de lambda para cada grupo funcional, facilitando la comparación entre ellos.

Código
model_lambda = lm(lambda ~ Habit_Type, data = ALL_Lambdas)
# summary(model_lambda)

model_lambda_epi_terr = lm(lambda ~ Habit_Type - 1, data = ALL_Lambdas)
# summary(model_lambda_epi_terr)

tidy_results = tidy(model_lambda_epi_terr)

flextable(tidy_results)

term

estimate

std.error

statistic

p.value

Habit_TypeEpífitas

0.9776130

0.007781499

125.633

0

Habit_TypeTerrestre

0.9988654

0.007387240

135.215

0


17.3.1 Visualización de las distribuciones de los lambda’s

Para representar gráficamente las distribuciones de los coeficientes estimados en el modelo lineal, se emplean las librerías ggdist y distributional, utilizando la función stat_halfeye. Esta función permite visualizar la forma y dispersión de las distribuciones de los parámetros, proporcionando una representación intuitiva de la incertidumbre asociada a cada estimación. Es importante destacar que stat_halfeye requiere especificar explícitamente la distribución de los datos; en este análisis, se asume que los valores propios de lambda (\(\lambda\)) siguen una distribución normal. La información utilizada para esta visualización proviene del modelo ajustado previamente (model_lambda), lo que permite comparar directamente los coeficientes entre grupos funcionales como epífitas y terrestres.

Código
model_lambda_epi_terr %>%
    tidy() %>%
    ggplot(aes(y = term)) + stat_halfeye(aes(xdist = dist_student_t(df = df.residual(model_lambda_epi_terr),
    mu = estimate, sigma = std.error)))

La gráfica anterior puede ocultar la dispersión de los datos, especialmente cuando hay sesgos. Para abordar esto, se pueden añadir los datos originales a la figura. En este caso, se ha incorporado un símbolo de barra | por cada valor de lambda en la parte inferior de la gráfica. Al observar esta nueva visualización, se nota que la dispersión varía significativamente si se compara la representación basada en el promedio y el error estándar con la distribución real de los datos, representada por los |. Esta figura permite apreciar mejor tanto la dispersión como la distribución de los datos. En comparación con la gráfica anterior, esta ofrece una perspectiva más completa, destacando los valores que se alejan del centro de la distribución.

Código
ALL_Lambdas %>%
    expand(Habit_Type) %>%
    augment(model_lambda, newdata = ., se_fit = TRUE) %>%
    ggplot(aes(y = Habit_Type, colour = Habit_Type)) + stat_halfeye(aes(xdist = dist_student_t(df = df.residual(model_lambda),
    mu = .fitted, sigma = .se.fit)), scale = 0.5) + geom_point(aes(x = lambda),
    data = ALL_Lambdas, pch = "|", size = 2, position = position_nudge(y = -0.15)) +
    theme(legend.position = c(0.1, 0.8)) + rlt_style_colour() +
    ylab("")


17.4 Mapa de distribución de los estudios.

La lista presentada corresponde a los datos extraídos de la base de datos COMPADRE, complementados con información obtenida directamente de los artículos científicos, con el objetivo de construir un mapa que muestre dónde se han realizado estudios de dinámica poblacional.

Lamentablemente, COMPADRE aún carece de muchos datos y detalles importantes que deberían incorporarse a su base. En esta sección, se realizó una búsqueda específica de estudios sobre orquídeas dentro de COMPADRE, extrayendo las coordenadas de latitud y longitud directamente de los artículos originales.

En los casos en que no se encontraron coordenadas exactas, pero sí se identificó el país o región del estudio, se utilizó Google Maps para estimar las coordenadas aproximadas del sitio de muestreo. Cuando no fue posible obtener ninguna información sobre la localización del estudio, esos casos fueron excluidos del mapa.

Agradezco a Diana Molina Ozuma por su valiosa colaboración en la búsqueda de las coordenadas de los sitios de estudio.

Código
Orchid_data_DOI_Diana_3a <- read_excel("data/Orchid_data_DOI_Diana_3a.xlsx")
Código
Lat_Long = Orchid_data_DOI_Diana_3a %>%
    select(SpeciesAccepted, Lon, Lat, OrganismType) |>
    distinct(SpeciesAccepted, Lon, Lat, OrganismType)

# write_csv(Lat_Long, 'data/Orchid_data_DOI_Diana_3a.csv')

17.4.1 Visualización de distribución geospatial

Para representar la distribución geográfica de las orquídeas registradas en la base de datos COMPADRE, se utilizó el paquete ggplot2. En esta visualización, se emplea la función borders, que incorpora los contornos de los países al mapa. Esta función se basa en el paquete maps, el cual proporciona los datos geográficos necesarios para delinear los límites nacionales, permitiendo contextualizar espacialmente los puntos de muestreo.

Código
ggplot2::ggplot(Lat_Long, aes(Lon, Lat, colour = OrganismType)) +
    annotation_borders(database = "world", fill = "grey80", col = NA) +
    geom_point(size = 1, alpha = 0.5) + theme(legend.position = c(0.15,
    0.2)) + rlt_style_colour()
Error in `map_data()`:
! The package "maps" is required for `map_data()`.
Código
# ggsave('orchid_map.jpg')

17.5 Mapa de distribución interactivo con Leaflet

Se utilizó el paquete Leaflet para crear un mapa interactivo que muestra los sitios de muestreo de las especies de orquídeas estudiadas en campo. Este enfoque permite explorar visualmente la distribución geográfica de las poblaciones incluidas en los estudios.

El mapa revela una marcada disparidad en los sitios de muestreo entre los dos tipos de orquídeas. Las poblaciones marcadas en rojo corresponden a especies epífitas, mientras que las azules representan especies terrestres. Se observa que las especies terrestres están principalmente distribuidas en Europa y América del Norte, con escasa representación en Asia y ninguna en África. Por otro lado, las especies epífitas se concentran en el Caribe y América Central (especialmente México), sin presencia en África, Asia ni Australia.

Además, el mapa es interactivo y permite hacer zoom para examinar áreas específicas con mayor detalle. Presiona sobre los puntos para obtener información adicional sobre el nombre científico de la especie muestreada en este sitio.

Código
PointUsePalette <- leaflet::colorFactor(
  palette = c("#009392", "#CF597E"),
  domain = c("Epiphyte", "Herbaceous perennial")
) # para asignar los colores a los factores (clase de Vida)

Orchid_map = leaflet(Lat_Long) %>% # los datos
  addTiles() %>%
  addCircleMarkers(
    lng = ~Lon, # la longitud
    lat = ~Lat, # la latitud
    radius = 2, # el tamaño del punto
    color = ~ PointUsePalette(OrganismType), # Para colorear los puntos por el tipo clase de vida
    popup = ~ paste0("<I>", SpeciesAccepted, "</I>") # para poner los nombres científicos en itálicos
  )

Orchid_map
Código
# htmltools::save_html(Orchid_map, file = "Orchid_map.html") # El script para crear un archivo aparte del mapa

Tremblay R, Ackerman J. 2001. Gene flow and effective population size in Lepanthes (Orchidaceae): a case for genetic drift. Biological Journal of the Linnean Society 72:47-62. DOI: 10.1006/bijl.2000.0485.
Tremblay R, McCarthy MA. 2014. Bayesian estimates of transition probabilities in seven small lithophytic orchid populations: maximizing data availability from many small samples. PLoS One 9:e102859.