Problema 3: Teorema del Límite Central

a. Población de árboles de Molinillo (Magnolia resupinatifolia) en el Parque Nacional Natural Serranía de Los Yariguíes

Creamos una población simulada de árboles de Molinillo (Magnolia resupinatifolia) en el Parque Nacional Natural Serranía de Los Yariguíes. Para ello, se generaron coordenadas aleatorias dentro del área del parque y se asignó el estado de “enfermo” a la mitad de los árboles.

# Limites del Parque Nacional Natural (pnn)
pnn <- st_read("~/Documents/Workshop/Rproj/Nexus_databases/Parques_Nacionales_Naturales_de_Colombia/") %>% 
filter(Nombre=="SERRANÍA DE LOS YARIGUÍES")

# Coordenadas aletorias
set.seed(123)  # seed
coords <- st_sample(pnn, size = 1000, type = "random") 
rm(pnn)

# Convertir los puntos a un data frame y agregar atributos de estado enfermo/sano

pob_mol <- st_as_sf(coords) %>%
  mutate(
    id = paste0("Molinillo", 1:1000),
    especie = "Magnolia resupinatifolia",
    familia = "Magnoliaceae",
    estado = rep(c("sano", "enfermo"), each = 500))
mapview(pob_mol, zcol = "estado", legend = TRUE,
                       col.regions = c("#f4a284","#3a66ac"),
                       cex = 2, label = pob_mol$id,
                       map.types = "OpenStreetMap")
b. Proporción muestral

La función sample_prop está diseñada para obtener una muestra aleatoria de una población simulada de árboles de Molinillo (Magnolia resupinatifolia) en el Parque Nacional Natural Serranía de Los Yariguíes y calcular la proporción de árboles enfermos en dicha muestra. La función toma como entrada la población completa y el tamaño de la muestra deseado (n). Utilizando la función sample_n de dplyr, se extrae una muestra aleatoria de n árboles, y luego se calcula la proporción de individuos cuyo estado es “enfermo”.

sample_prop <- function(pob, n) {
  sample <- pob %>% sample_n(n)
  prop <- mean(sample$estado == "enfermo")
  return(paste0("Proporción arboles enfermos en muestra n= ", n , ": ", prop))
}

sample_prop(pob_mol,500)
## [1] "Proporción arboles enfermos en muestra n= 500: 0.494"
c. Simulación proporción muestral

En el contexto de los datos de la simulación sim500, el gráfico Q-Q permite evaluar si las proporciones muestrales obtenidas en las 500 simulaciones siguen una distribución normal. En el gráfico, los puntos se alinean a lo largo de la línea diagonal, que representa la distribución normal teórica. Este alineamiento sugiere que, con un tamaño de muestra suficientemente grande, como 𝑛=500, la distribución de las proporciones muestrales se aproxima a una distribución normal. Este comportamiento es consistente con el Teorema del Límite Central, que establece que la distribución de la media muestral tiende a ser normal cuando el tamaño de muestra es grande, independientemente de la distribución de la población.

# Función para calcular la proporción muestral
sample_prop <- function(pob, n) {
  sample <- pob %>% sample_n(n)
  prop <- mean(sample$estado == "enfermo")
  return(prop)
}

# Simulación 500 repeticiones
sim500 <- foreach(i = 1:500, .combine = 'rbind') %do% {
p <- sample_prop(pob_mol, 500)
  # Almacenar los resultados
  tibble(
    sim = i,
    meanp = p,               
  )
}
# Gráficos Cuantil-Cuantil (QQ plots)
library(ggpubr)
ggqqplot(sim500, x = "meanp",
         ggtheme = theme_pubclean(), 
         xlab = "Cuantiles teóricos", ylab = "Cuantiles observados",
         color="#f4a284")

d. Simulación diferentes tamaños de muestra

Los resultados muestran que la media meanp de las proporciones muestrales se mantiene cercana a 0.5 en todos los tamaños de muestra, mientras que la desviación estándar disminuye conforme aumenta el tamaño de la muestra, indicando menor variabilidad y mayor consistencia en las estimaciones. Las pruebas de normalidad revelan que, en tamaños de muestra pequeños, las proporciones no siguen una distribución normal y presentan más sesgo y variabilidad; sin embargo, a medida que el tamaño de la muestra incrementa, las proporciones muestrales tienden a ajustarse mejor a la normalidad, en línea con el Teorema del Límite Central, aunque este ajuste no siempre es perfecto, destacando la importancia del tamaño de muestra en la precisión y comportamiento de las estimaciones.

# Definir los tamaños de muestra
sample_size <- c(5, 10, 15, 20, 30, 50, 60, 100, 200, 500)
# Lista resultados

simqq_list <- list()
# Loop
foreach(i = sample_size) %do% {
set.seed(123)
  
# Proporciones muestrales
  data_p <- 
  tibble(
  p = replicate(500, sample_prop(pob_mol, i))
  )
  
# Gráfico Q-Q 
simqq <- ggqqplot(
 data = data_p, x = "p",
 ggtheme = theme_pubclean(),
 xlab = "Cuantiles teóricos", ylab = "Cuantiles observados",
 color = "#f4a284") + 
 ggtitle(paste("Q-Q Plot para n =", i))
 simqq <- simqq + theme(
 plot.title = element_text(size = 4)
  )
  
# Lista
simqq_list[[paste0("simqq_", i)]] <- simqq

}
do.call(grid.arrange, c(simqq_list, ncol = 5)) 

e. Simulación diferentes proporciones de arboles enfermos

Al analizar los gráficos y la tabla del test de Shapiro con proporciones extremas (10% y 90% de plantas enfermas), se observa que, a medida que aumenta el tamaño de muestra, las distribuciones de los datos son más dispersas y el valor p no supera el nivel de significancia (alpha), por lo que no se cumple la normalidad. El Teorema del Límite Central aplica principalmente a la media de los datos, y para proporciones alejadas del 50% es necesario un tamaño de muestra mayor para aproximarse a la normalidad. Las simulaciones mostraron que solo un tamaño de muestra de n = 500 logró normalidad para proporciones del 10% y 90%, lo que resalta la importancia de muestras más grandes en casos extremos.

#Crear poblaciones simuladas con 10% y 90% de molinillos enfermos

pob_mol10 <- st_as_sf(coords) %>%
  mutate(
    id = paste0("Molinillo", 1:1000),
    especie = "Magnolia resupinatifolia",
    familia = "Magnoliaceae",
    estado = c(rep("enfermo", 100), rep("sano", 900)))


pob_mol90 <- st_as_sf(coords) %>%
  mutate(
    id = paste0("Molinillo", 1:1000),
    especie = "Magnolia resupinatifolia",
    familia = "Magnoliaceae",
    estado = c(rep("enfermo", 900), rep("sano", 100)))


## Listas resultados
simqq_list_10 <- list()
simqq_list_90 <- list()

# Loop
foreach(i = sample_size) %do% {
  set.seed(123)

# Proporciones muestrales
data_p <- tibble(
 p = replicate(500, sample_prop(pob_mol10, i))
 )

# Gráfico Q-Q 
  simqq <- ggqqplot(
  data = data_p, x = "p",
  ggtheme = theme_pubclean(),
  xlab = "Cuantiles teóricos", ylab = "Cuantiles observados",
  color = "#eebdac"
  ) + ggtitle(paste("Q-Q Plot para n =", i))
  
simqq <- simqq + theme(
plot.title = element_text(size = 4)
  )
# Lista
simqq_list_10[[paste0("simqq_10_", i)]] <- simqq
}
# Generar gráficos Q-Q para pob_mol90
foreach(i = sample_size) %do% {
set.seed(123)
  
# Proporciones muestrales
data_p <- tibble(
  p = replicate(500, sample_prop(pob_mol90, i))
  )

# Gráfico Q-Q 
  simqq <- ggqqplot(
    data = data_p, x = "p",
    ggtheme = theme_pubclean(),
    xlab = "Cuantiles teóricos", ylab = "Cuantiles observados",
    color = "#e9612f"
  ) + 
    ggtitle(paste("Q-Q Plot para n =", i))

  simqq <- simqq + theme(
  plot.title = element_text(size = 4)
  )
  
  # Guardar gráfico en la lista
  simqq_list_90[[paste0("simqq_90_", i)]] <- simqq
}
do.call(grid.arrange, c(simqq_list_10, ncol = 5))  

do.call(grid.arrange, c(simqq_list_90, ncol = 5))