generar_poblacion <- function(tamano_poblacion, prob_enfermos) {
poblacion <- rbinom(n = tamano_poblacion, size = 1, prob = prob_enfermos)
return(poblacion)
}
poblacion_50 <- generar_poblacion(1000, 0.5)
poblacion_10 <- generar_poblacion(1000, 0.1)
poblacion_90 <- generar_poblacion(1000, 0.9)
calcular_proporcion_muestral <- function(tamano_muestra, poblacion) {
muestra <- sample(poblacion, size = tamano_muestra)
proporcion_muestral <- mean(muestra)
return(proporcion_muestral)
}
calcular_proporciones_muestrales <- function(iteraciones, poblacion, tamano_muestra) {
proporciones_muestrales <- c()
for(i in 1:iteraciones) {
proporcion_muestral <- calcular_proporcion_muestral(poblacion = poblacion, tamano_muestra = tamano_muestra)
proporciones_muestrales <- append(proporciones_muestrales, proporcion_muestral)
}
return(proporciones_muestrales)
}
calcular_proporciones_muestrales_m_muestras <- function(muestras_titulos, poblacion, iteraciones, tamano_muestras) {
result <- data.frame(id = 1:iteraciones)
info <- data.frame(titulos = muestras_titulos, tamano = tamano_muestras)
for(i in 1:nrow(info)) {
result[[info[i, 1]]] <- calcular_proporciones_muestrales(poblacion = poblacion, iteraciones = iteraciones, tamano_muestra = info[i, 2])
}
return(result)
}
calcular_shapiro_test <- function(df_data) {
result <- data.frame(muestra_n = colnames(df_data)[2:length(df_data)])
result$shapiro_w <- 0
result$shapiro_p_value <- 0
for(i in 1:nrow(result)) {
test <- shapiro.test(df_data[[result[i, 1]]])
result$shapiro_w[i] <- test$statistic
result$shapiro_p_value[i] <- test$p.value
}
result$normal <- result$shapiro_p_value > 0.05
return(result)
}
Visualizando el Teorema del Límite Central
El Teorema del Límite Central (TLC) es una piedra angular de la estadística, estableciendo una poderosa relación entre el tamaño de la muestra y la distribución de las estadísticas de la muestra. Afirma que a medida que aumenta el tamaño de la muestra, la distribución de las medias de la muestra, independientemente de la distribución de la población subyacente (normal o no normal), tiende a converger hacia una distribución normal, también conocida como distribución gaussiana. Este fenómeno nos permite hacer inferencias sobre los parámetros de la población, como la media de la población, analizando las estadísticas de la muestra, incluso sin un conocimiento completo de la distribución de la población en sí. Este estudio utiliza simulaciones por computadora para investigar el comportamiento del TLC con respecto a las proporciones de la muestra. Exploraremos cómo las proporciones de la muestra, calculadas a partir de poblaciones con diferentes prevalencias de enfermedades (10%, 50% y 90%), se aproximan a la normalidad bajo diferentes condiciones de tamaño de la muestra.
Métodos:
Generación de Población:
Crear poblaciones simuladas de 1000 individuos con diferentes proporciones de plantas “enfermas”: 10%, 50% y 90%. Estas proporciones variadas nos permitirán examinar la robustez del TLC bajo diferentes escenarios.
Se extraerá aleatoriamente una muestra de tamaño ‘n’ de una población dada y se determinará la proporción de la muestra (p) de individuos “enfermos”.
Se realizará el proceso de muestreo 500 veces para cada uno de los siguientes tamaños de muestra: 5, 10, 15, 20, 30, 50, 60, 100, 200, 500. En los cuales se registran los valores de p resultantes para cada tamaño de muestra.
Resultados
Inicialmente generaremos una muestra aleatoria de 500 individuos y estimaremos la proporción muestra:
#Generamos un primer caso para evaluar
estimacion_1 <- calcular_proporcion_muestral(poblacion = poblacion_50, tamano_muestra = 500)
cat(paste("La proporción muestral es de:", estimacion_1))
## La proporción muestral es de: 0.5
La proporción calculada es muy cercana al 50%, dado que el tamaño de la muestra es considerable y los resultados son muy buenos, siendo muy cercanos al 50% original de probabilidad de enfermos que tiene la población.
500 Estimaciones con n = 500
Cada vez que seleccionamos una muestra aleatoria la estimación de la proporción muestral puede ser diferente, por lo que cada vez que se realice este proceso obtendremos resultados diferentes, así que para ir más allá realizaremos 500 estimaciónes con diferentes muestras de 500 individuos para ver el comportamiento de todas las estimaciones obtenidas.
#Realizar 500 estimaciones con n = 500
estimacion_1 <- calcular_proporciones_muestrales(iteraciones = 500, poblacion = poblacion_50, tamano_muestra = 500)
resumen_estimacion_1 <- summary(estimacion_1)
resumen_estimacion_1
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.4500 0.4900 0.5020 0.5017 0.5120 0.5500
variabilidad = data.frame(desviacion_estandar = sd(estimacion_1), varianza = var(estimacion_1))
variabilidad
## desviacion_estandar varianza
## 1 0.01585839 0.0002514886
hist(estimacion_1)
boxplot(estimacion_1,
main = "Boxplot de Ejemplo", # Título del gráfico
ylab = "Valores", # Etiqueta del eje y
col = "lightblue", # Color del boxplot
border = "blue", # Color del borde del boxplot
horizontal = FALSE # Si quieres un boxplot horizontal, cambia a TRUE
)
cat(paste("Indice de simetria:", skewness(estimacion_1)))
## Indice de simetria: 0.0992491189616578
qqnorm(estimacion_1, main="n=500") ; qqline(estimacion_1, col="red")
Los graficos y los datos presentados anteriormente muestran una distribución muy similar a la normal, el histograma toma una forma similar a la campana de Gauss, aunque si bien es similar, se puede encontrar algo sesgada en cuanto a la simetria. La variabilidad de estas estimaciones es muy baja, mostrando unos datos estables y la proporción se encuentra muy cercana al 50%.
Esto evidencia el cumplimiento del teorema del limite central, ya que aunque no se puede calcular una proporción muestral perfecta sin sesgo, se consiguen valores muy aceptables y en algunos casos muy exactos a la población.
Analisis para n = 5, 10, 15, 20, 30, 50, 60, 100, 200, 500
Realizaremos el mismo analisis para diferentes tamaño de muestras.
proporciones <- calcular_proporciones_muestrales_m_muestras(poblacion = poblacion_50,
iteraciones = 500,
muestras_titulos = c("5", "10", "15", "20", "30", "50", "60", "100", "200", "500"),
tamano_muestras = c(5, 10, 15, 20, 30, 50, 60, 100, 200, 500))
#Test de normalidad
histograma_n_5 <- hist(proporciones$"5")
histograma_n_10 <- hist(proporciones$"10")
histograma_n_15 <- hist(proporciones$"15")
histograma_n_20 <- hist(proporciones$"20")
histograma_n_30 <- hist(proporciones$"30")
histograma_n_50 <- hist(proporciones$"50")
histograma_n_60 <- hist(proporciones$"60")
histograma_n_100 <- hist(proporciones$"100")
histograma_n_200 <- hist(proporciones$"200")
histograma_n_500 <- hist(proporciones$"500")
Los histogramas anteriores nos muestran la distribución de los datos para las 500 estimaciones de cada una de los tamaños de muestra, en la grafica de n = 5, puede verse la anormalidad de los datos ya que la muestra es muy pequeña y a medida que se emplea una muestra más grande, la forma del histograma va asemejandose a la distribución normal. Graficamente podemos inferir que para las muestras de n = 100 en adelante se obtiene una distribución mucho más similar a la normal.
qqnorm(proporciones$"5", main="n = 5") ; qqline(proporciones$"5", col="red")
qqnorm(proporciones$"10", main="n = 10") ; qqline(proporciones$"10", col="red")
qqnorm(proporciones$"15", main="n = 15") ; qqline(proporciones$"15", col="red")
qqnorm(proporciones$"20", main="n = 20") ; qqline(proporciones$"20", col="red")
qqnorm(proporciones$"30", main="n = 30") ; qqline(proporciones$"30", col="red")
qqnorm(proporciones$"50", main="n = 50") ; qqline(proporciones$"50", col="red")
qqnorm(proporciones$"60", main="n = 60") ; qqline(proporciones$"60", col="red")
qqnorm(proporciones$"100", main="n = 100") ; qqline(proporciones$"100", col="red")
qqnorm(proporciones$"200", main="n = 200") ; qqline(proporciones$"200", col="red")
qqnorm(proporciones$"500", main="n = 500") ; qqline(proporciones$"500", col="red")
Los graficos Q - Q anteriores nos permiten comparar la distribución de la proporción muestral con la distribución teorica normal, cuanto mejor se adapten los puntos a la recta en el grafico, más semejanza tendrá con la distribución teorica.
Es facil identificar que para tamaños de muestra muy pequeños, los datos no se adaptan correctamente a la recta, a medida que la muestra es más grande, está puede adoptar mucho mejor la forma de la recta.
Para los valores n = 100 en adelante se presentan los mejores resultados.
test_50 <- calcular_shapiro_test(proporciones)
kable(test_50)
| muestra_n | shapiro_w | shapiro_p_value | normal |
|---|---|---|---|
| 5 | 0.9281699 | 0.0000000 | FALSE |
| 10 | 0.9608781 | 0.0000000 | FALSE |
| 15 | 0.9725885 | 0.0000000 | FALSE |
| 20 | 0.9799220 | 0.0000022 | FALSE |
| 30 | 0.9856890 | 0.0000791 | FALSE |
| 50 | 0.9889651 | 0.0008085 | FALSE |
| 60 | 0.9924422 | 0.0124480 | FALSE |
| 100 | 0.9945117 | 0.0702566 | TRUE |
| 200 | 0.9935987 | 0.0326059 | FALSE |
| 500 | 0.9934039 | 0.0276904 | FALSE |
La tabla anterior nos muestra los resultados de los test de normalidad para cada uno de los tamaños de las muestras, empleando un nivel de significancia del 5% y revisando el valor p del test de Shapiro, obtenemos que en muchas ocasiones las muestras de tamaño n = 200 en adelante consiguen aprobar el test, en algunas ocasiones las muestra de n = 100 también consiguen aprobar el test y las muestras de tamaño menores son definitivamente rechazadas durante el test, indicando que no se ajustan a una distribución normal.
Analisis con Poblaciones de 1000 individuos con 10% y 90% de probabilidad de enfermos
Adicionalmente a los analisis anteriores con una población con probabilidad del 50% de individuos enfermos, ahora para profundizar en nuestro analisis verificaremos el teorema con poblaciones diferentes y diferentes probabilidades para complementar todo nuestro analisis.
Población con probabilidad del 10% de enfermos
proporciones_10 <- calcular_proporciones_muestrales_m_muestras(poblacion = poblacion_10,
iteraciones = 500,
muestras_titulos = c("5", "10", "15", "20", "30", "50", "60", "100", "200", "500"),
tamano_muestras = c(5, 10, 15, 20, 30, 50, 60, 100, 200, 500))
#Test de normalidad
qqnorm(proporciones_10$"5", main="n = 5") ; qqline(proporciones_10$"5", col="red")
qqnorm(proporciones_10$"10", main="n = 10") ; qqline(proporciones_10$"10", col="red")
qqnorm(proporciones_10$"15", main="n = 15") ; qqline(proporciones_10$"15", col="red")
qqnorm(proporciones_10$"20", main="n = 20") ; qqline(proporciones_10$"20", col="red")
qqnorm(proporciones_10$"30", main="n = 30") ; qqline(proporciones_10$"30", col="red")
qqnorm(proporciones_10$"50", main="n = 50") ; qqline(proporciones_10$"50", col="red")
qqnorm(proporciones_10$"60", main="n = 60") ; qqline(proporciones_10$"60", col="red")
qqnorm(proporciones_10$"100", main="n = 100") ; qqline(proporciones_10$"100", col="red")
qqnorm(proporciones_10$"200", main="n = 200") ; qqline(proporciones_10$"200", col="red")
qqnorm(proporciones_10$"500", main="n = 500") ; qqline(proporciones_10$"500", col="red")
mean(proporciones_10$"500")
## [1] 0.09904
Los graficos anteriores nos muestran el ajuste de la distribución de las estimaciones obtenidas para cada tamaño de muestra, para una población con probabilidad del 10% de enfermos parece tener una dificultad para adaptarse a la recta de los diagramas. Evaluaremos estos datos con la prueba de shapiro más adelante.
test_10 <- calcular_shapiro_test(proporciones_10)
kable(test_10)
| muestra_n | shapiro_w | shapiro_p_value | normal |
|---|---|---|---|
| 5 | 0.6966373 | 0.0000000 | FALSE |
| 10 | 0.8320747 | 0.0000000 | FALSE |
| 15 | 0.8900605 | 0.0000000 | FALSE |
| 20 | 0.9278539 | 0.0000000 | FALSE |
| 30 | 0.9482046 | 0.0000000 | FALSE |
| 50 | 0.9536539 | 0.0000000 | FALSE |
| 60 | 0.9730394 | 0.0000001 | FALSE |
| 100 | 0.9852371 | 0.0000585 | FALSE |
| 200 | 0.9928584 | 0.0175641 | FALSE |
| 500 | 0.9926587 | 0.0148845 | FALSE |
Para esta prueba, analizamos con un nivel de significancia del 5% y comparamos cada valor p para verficiar si es mayor a 0.05, con el fin de determinar si puede considerarse distribución normal con un nivel de confianza del 95%.
Para este caso, ninguno de los tamaños de muestra consiguio superar el test, pero cabe resaltar que a medida que crece nuestro valor n, se acerca mucho más a la distribución normal, siendo el valor p de n = 500 bastante cercano a superar la prueba.
Población con 90% de probabilidad de enfermos
Para complementar el analisis anterior, se procede a revisar un caso al otro lado de la moneda, ya que está vez la probabilidad de enfermos estará en el 90%.
proporciones_90 <- calcular_proporciones_muestrales_m_muestras(poblacion = poblacion_90,
iteraciones = 500,
muestras_titulos = c("5", "10", "15", "20", "30", "50", "60", "100", "200", "500"),
tamano_muestras = c(5, 10, 15, 20, 30, 50, 60, 100, 200, 500))
#Test de normalidad
qqnorm(proporciones_90$"5", main="n = 5") ; qqline(proporciones_90$"5", col="red")
qqnorm(proporciones_90$"10", main="n = 10") ; qqline(proporciones_90$"10", col="red")
qqnorm(proporciones_90$"15", main="n = 15") ; qqline(proporciones_90$"15", col="red")
qqnorm(proporciones_90$"20", main="n = 20") ; qqline(proporciones_90$"20", col="red")
qqnorm(proporciones_90$"30", main="n = 30") ; qqline(proporciones_90$"30", col="red")
qqnorm(proporciones_90$"50", main="n = 50") ; qqline(proporciones_90$"50", col="red")
qqnorm(proporciones_90$"60", main="n = 60") ; qqline(proporciones_90$"60", col="red")
qqnorm(proporciones_90$"100", main="n = 100") ; qqline(proporciones_90$"100", col="red")
qqnorm(proporciones_90$"200", main="n = 200") ; qqline(proporciones_90$"200", col="red")
qqnorm(proporciones_90$"500", main="n = 500") ; qqline(proporciones_90$"500", col="red")
test_90 <- calcular_shapiro_test(proporciones_90)
kable(test_90)
| muestra_n | shapiro_w | shapiro_p_value | normal |
|---|---|---|---|
| 5 | 0.7084149 | 0.0000000 | FALSE |
| 10 | 0.8526478 | 0.0000000 | FALSE |
| 15 | 0.8924276 | 0.0000000 | FALSE |
| 20 | 0.9234767 | 0.0000000 | FALSE |
| 30 | 0.9495074 | 0.0000000 | FALSE |
| 50 | 0.9682861 | 0.0000000 | FALSE |
| 60 | 0.9773439 | 0.0000005 | FALSE |
| 100 | 0.9859295 | 0.0000931 | FALSE |
| 200 | 0.9928569 | 0.0175422 | FALSE |
| 500 | 0.9946149 | 0.0766115 | TRUE |
En este caso para la población con probabilidad del 90%, las muestras de tamaño n = 500 en algunas ocasiones consigue superar el test con un 95% de confianza y para las muestras de n = 200 se encuentra muy cerca. Resulta ser un caso muy similar al de la población de 10% de probabilidad.
Esto nos hace pensar que probablemente cuando la probabilidad en una población está muy cerca a los extremos se requiere una muestra más grande para que se ajuste a una distribución normal, en este caso, la distrubición más cercana a la normal fue para población con una probabilidad de enfermos del 50%.