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