Es frecuente tomar muestras poblacionales que no son normales, cualquiera que sea la distribución de la polbación con tal que tenga varianza finita, la media muestral tendrá aproximadamente, para muestras grandes, la distribución normal. Esta propiedad se conoce como teorema central del límite.
Algunos autores afirman que esta aproximación es bastante buena a partir del umbral n > 30.
A continuación se presenta, paso a paso, un caso de simulación para verificar el Teorema del Límite Central
SimularPoblacion=function(N, porcentaje_S, porcentaje_E)
{
Poblacion=c(rep("Sana", N * porcentaje_S), rep("Enferma", N * porcentaje_E))
return(Poblacion)
}
N=1000
porcentaje_S=0.5
porcentaje_E=0.5
Poblacion=SimularPoblacion(N, porcentaje_S, porcentaje_E)
Así se obtiene una población simulada de 1000 plantas de las cuales el 50% están Sanas y el 50% están Enfermas, se crea el vector Poblacion para guardar el resultado y el resumen se puede ver en la siguiente tabla.
table(Poblacion)
## Poblacion
## Enferma Sana
## 500 500
De la población generada se obtiene una muestra aleatoria, inicialmente de 40 plantas, n = 40.
ExtraeMuestra=function(n)
{
Muestra=sample(Poblacion, n)
return(Muestra)
}
n=40
ExtraeMuestra(n)
## [1] "Enferma" "Sana" "Sana" "Enferma" "Enferma" "Enferma" "Sana"
## [8] "Sana" "Sana" "Enferma" "Sana" "Sana" "Sana" "Sana"
## [15] "Enferma" "Sana" "Enferma" "Sana" "Enferma" "Sana" "Enferma"
## [22] "Sana" "Sana" "Sana" "Sana" "Enferma" "Enferma" "Enferma"
## [29] "Sana" "Sana" "Sana" "Sana" "Sana" "Enferma" "Sana"
## [36] "Sana" "Sana" "Enferma" "Sana" "Enferma"
A partir de la muestra obtenida, de tamaño n=40, se calcula un estimador para la proporción de las plantas enfermas, a continuación se muestra el resultado, se evidencia que está cercano a la proporción de la población.
Muestra=ExtraeMuestra(n)
ProporcionMuestral=sum(Muestra == "Enferma")/n
ProporcionMuestral
## [1] 0.5
Ahora se crea un vector denominado estimador0 para guardar los resultados de las proporciones muestrales Pn calculadas a partir de 500 muestras aleatorias de tamaño n=40. Se presentan los resultados de la proporción muestral para las primeras 5 muestras.
estimador0=numeric()
for(i in 1:500)
{
Pn=sum(ExtraeMuestra(n) == "Enferma")/n
estimador0=c(estimador0, Pn)
}
head(estimador0)
## [1] 0.550 0.400 0.450 0.550 0.525 0.500
Para analizar el comportamiento de la distribución de las 500 proporciones muestrales inicialmente se obtiene un resumen estadístico de la variable aleatoria Media de la proporción muestral.
#install.packages("summarytools")
summarytools::descr(estimador0)
## Descriptive Statistics
## estimador0
## N: 500
##
## estimador0
## ----------------- ------------
## Mean 0.50
## Std.Dev 0.08
## Min 0.22
## Q1 0.45
## Median 0.50
## Q3 0.55
## Max 0.70
## MAD 0.07
## IQR 0.10
## CV 0.16
## Skewness -0.14
## SE.Skewness 0.11
## Kurtosis -0.11
## N.Valid 500.00
## Pct.Valid 100.00
Ahora se gráfica el histograma con la curva de densidad, resaltando en color verde la posición del promedio de las 500 medias muestrales de la proporción de plnatas enfermas.
hist(estimador0, prob=TRUE, main="Histograma y Densidad con n=40")
line=mean(estimador0)
abline(v=line, col="green", lwd=3)
lines(density(estimador0), col="blue", lwd=3)
De acuerdo a las estadísticas de la variable aleatoria Media de la Proporción Muestral, calculada a partir de 500 muestras aleatorias de tamaño n=40, se observa que se aproxima bastante a la proporción de la población 0.5, con base en el coeficiente de asimetría, la desviación estándar y en la representación gráfica del histograma se aprecia que la distribución tiende a ser simétrica con una variabilidad que sigue a la variabilidad de la distribución normal.
De esta forma se puede empezar a verificar el Teorema del Límite Central porque al distribución de probabilidad de la variable aleatoria Media de la Proporción Muestral, para una selección de 500 muestras aleatorias de tamaño n=40 (en general, considerada grande por ser mayor a 30) sigue aproximadamente una distribución de probabilidad normal con una media que se aproxima al parámetro poblacional de 0.5
Ahora, para una verificación más formal del Teorema del Límite Central, se van a comparar los resultados de simulaciones con 500 iteraciones para 10 tamaños diferentes de la muestra aleatoria (n=5, 10, 15, 20, 30, 50, 60, 100, 200 y 500).
Para la comparación se tiene en cuenta para cada tamaño de muestra: el histograma con la curva de densidad de probabilidad, el gráfico de normalidad Q-Q Plot, el test de normalidad Shapiro-Wilk y las principales medidas estadísticas de la variable aleatoria Media de la Proporción Muestral Tamaño de muestra, Media, Mediana, Desviación Estándar, Mínimo y Máximo.
Al finalizar se presenta un resumen comparativo de los gráficos y de las medidas estadísticas de cada escenario para sustentar la verificación del Teorema del Límite Central.
ExtraeMuestraA1=function(nA1)
{
MuestraA1=sample(Poblacion, nA1)
return(MuestraA1)
}
nA1=5
estimadorA1=numeric()
for(i in 1:500)
{
PnA1=sum(ExtraeMuestraA1(nA1) == "Enferma")/nA1
estimadorA1=c(estimadorA1, PnA1)
}
ResultadoA1=data.frame("Escenario"="A1", "Tamaño"=nA1, "Media"=mean(estimadorA1), "Mediana"=median(estimadorA1), "Desviación"=sd(estimadorA1), "Mín."=min(estimadorA1), "Máx."=max(estimadorA1))
ResultadoA1
## Escenario Tamaño Media Mediana Desviación Mín. Máx.
## 1 A1 5 0.498 0.4 0.2231044 0 1
shapiro.test(estimadorA1)
##
## Shapiro-Wilk normality test
##
## data: estimadorA1
## W = 0.92934, p-value = 1.306e-14
par(cex=0.5, cex.axis=0.5, cex.lab=0.5, cex.main=0.5, cex.sub=0.5, mfrow=c(1, 2), mai=c(0.5, 0.5, 0.5, 0.5))
hist(estimadorA1, main="n=5", xlab=" ", ylab=" ", freq=FALSE)
lines(density(estimadorA1), col="blue")
qqnorm(estimadorA1, main="n=5", xlab=" ", ylab=" "); qqline(estimadorA1, col="red")
ExtraeMuestraA2=function(nA2)
{
MuestraA2=sample(Poblacion, nA2)
return(MuestraA2)
}
nA2=10
estimadorA2=numeric()
for(i in 1:500)
{
PnA2=sum(ExtraeMuestraA2(nA2) == "Enferma")/nA2
estimadorA2=c(estimadorA2, PnA2)
}
ResultadoA2=data.frame("Escenario"="A2", "Tamaño"=nA2, "Media"=mean(estimadorA2), "Mediana"=median(estimadorA2), "Desviación"=sd(estimadorA2), "Mín."=min(estimadorA2), "Máx."=max(estimadorA2))
ResultadoA2
## Escenario Tamaño Media Mediana Desviación Mín. Máx.
## 1 A2 10 0.5032 0.5 0.1563286 0.1 0.9
shapiro.test(estimadorA2)
##
## Shapiro-Wilk normality test
##
## data: estimadorA2
## W = 0.96052, p-value = 2.534e-10
par(cex=0.5, cex.axis=0.5, cex.lab=0.5, cex.main=0.5, cex.sub=0.5, mfrow=c(1, 2), mai=c(0.5, 0.5, 0.5, 0.5))
hist(estimadorA2, main="n=10", xlab=" ", ylab=" ", freq=FALSE)
lines(density(estimadorA2), col="blue")
qqnorm(estimadorA2, main="n=10", xlab=" ", ylab=" "); qqline(estimadorA2, col="red")
ExtraeMuestraA3=function(nA3)
{
MuestraA3=sample(Poblacion, nA3)
return(MuestraA3)
}
nA3=15
estimadorA3=numeric()
for(i in 1:500)
{
PnA3=sum(ExtraeMuestraA3(nA3) == "Enferma")/nA3
estimadorA3=c(estimadorA3, PnA3)
}
ResultadoA3=data.frame("Escenario"="A3", "Tamaño"=nA3, "Media"=mean(estimadorA3), "Mediana"=median(estimadorA3), "Desviación"=sd(estimadorA3), "Mín."=min(estimadorA3), "Máx."=max(estimadorA3))
ResultadoA3
## Escenario Tamaño Media Mediana Desviación Mín. Máx.
## 1 A3 15 0.5032 0.5333333 0.1333283 0.1333333 0.8666667
shapiro.test(estimadorA3)
##
## Shapiro-Wilk normality test
##
## data: estimadorA3
## W = 0.97596, p-value = 2.521e-07
par(cex=0.5, cex.axis=0.5, cex.lab=0.5, cex.main=0.5, cex.sub=0.5, mfrow=c(1, 2), mai=c(0.5, 0.5, 0.5, 0.5))
hist(estimadorA3, main="n=15", xlab=" ", ylab=" ", freq=FALSE)
lines(density(estimadorA3), col="blue")
qqnorm(estimadorA3, main="n=15", xlab=" ", ylab=" "); qqline(estimadorA3, col="red")
ExtraeMuestraA4=function(nA4)
{
MuestraA4=sample(Poblacion, nA4)
return(MuestraA4)
}
nA4=20
estimadorA4=numeric()
for(i in 1:500)
{
PnA4=sum(ExtraeMuestraA4(nA4) == "Enferma")/nA4
estimadorA4=c(estimadorA4, PnA4)
}
ResultadoA4=data.frame("Escenario"="A4", "Tamaño"=nA4, "Media"=mean(estimadorA4), "Mediana"=median(estimadorA4), "Desviación"=sd(estimadorA4), "Mín."=min(estimadorA4), "Máx."=max(estimadorA4))
ResultadoA4
## Escenario Tamaño Media Mediana Desviación Mín. Máx.
## 1 A4 20 0.5011 0.5 0.1127351 0.2 0.85
shapiro.test(estimadorA4)
##
## Shapiro-Wilk normality test
##
## data: estimadorA4
## W = 0.97991, p-value = 2.186e-06
par(cex=0.5, cex.axis=0.5, cex.lab=0.5, cex.main=0.5, cex.sub=0.5, mfrow=c(1, 2), mai=c(0.5, 0.5, 0.5, 0.5))
hist(estimadorA4, main="n=20", xlab=" ", ylab=" ", freq=FALSE)
lines(density(estimadorA4), col="blue")
qqnorm(estimadorA4, main="n=20", xlab=" ", ylab=" "); qqline(estimadorA4, col="red")
ExtraeMuestraA5=function(nA5)
{
MuestraA5=sample(Poblacion, nA5)
return(MuestraA5)
}
nA5=30
estimadorA5=numeric()
for(i in 1:500)
{
PnA5=sum(ExtraeMuestraA5(nA5) == "Enferma")/nA5
estimadorA5=c(estimadorA5, PnA5)
}
ResultadoA5=data.frame("Escenario"="A5", "Tamaño"=nA5, "Media"=mean(estimadorA5), "Mediana"=median(estimadorA5), "Desviación"=sd(estimadorA5), "Mín."=min(estimadorA5), "Máx."=max(estimadorA5))
ResultadoA5
## Escenario Tamaño Media Mediana Desviación Mín. Máx.
## 1 A5 30 0.4993333 0.5 0.09337674 0.2666667 0.8
shapiro.test(estimadorA5)
##
## Shapiro-Wilk normality test
##
## data: estimadorA5
## W = 0.98588, p-value = 9.031e-05
par(cex=0.5, cex.axis=0.5, cex.lab=0.5, cex.main=0.5, cex.sub=0.5, mfrow=c(1, 2), mai=c(0.5, 0.5, 0.5, 0.5))
hist(estimadorA5, main="n=30", xlab=" ", ylab=" ", freq=FALSE)
lines(density(estimadorA5), col="blue")
qqnorm(estimadorA5, main="n=30", xlab=" ", ylab=" "); qqline(estimadorA5, col="red")
ExtraeMuestraA6=function(nA6)
{
MuestraA6=sample(Poblacion, nA6)
return(MuestraA6)
}
nA6=50
estimadorA6=numeric()
for(i in 1:500)
{
PnA6=sum(ExtraeMuestraA6(nA6) == "Enferma")/nA6
estimadorA6=c(estimadorA6, PnA6)
}
ResultadoA6=data.frame("Escenario"="A6", "Tamaño"=nA6, "Media"=mean(estimadorA6), "Mediana"=median(estimadorA6), "Desviación"=sd(estimadorA6), "Mín."=min(estimadorA6), "Máx."=max(estimadorA6))
ResultadoA6
## Escenario Tamaño Media Mediana Desviación Mín. Máx.
## 1 A6 50 0.5022 0.5 0.06760103 0.3 0.66
shapiro.test(estimadorA6)
##
## Shapiro-Wilk normality test
##
## data: estimadorA6
## W = 0.98852, p-value = 0.0005794
par(cex=0.5, cex.axis=0.5, cex.lab=0.5, cex.main=0.5, cex.sub=0.5, mfrow=c(1, 2), mai=c(0.5, 0.5, 0.5, 0.5))
hist(estimadorA6, main="n=50", xlab=" ", ylab=" ", freq=FALSE)
lines(density(estimadorA6), col="blue")
qqnorm(estimadorA6, main="n=50", xlab=" ", ylab=" "); qqline(estimadorA6, col="red")
ExtraeMuestraA7=function(nA7)
{
MuestraA7=sample(Poblacion, nA7)
return(MuestraA7)
}
nA7=60
estimadorA7=numeric()
for(i in 1:500)
{
PnA7=sum(ExtraeMuestraA7(nA7) == "Enferma")/nA7
estimadorA7=c(estimadorA7, PnA7)
}
ResultadoA7=data.frame("Escenario"="A7", "Tamaño"=nA7, "Media"=mean(estimadorA7), "Mediana"=median(estimadorA7), "Desviación"=sd(estimadorA7), "Mín."=min(estimadorA7), "Máx."=max(estimadorA7))
ResultadoA7
## Escenario Tamaño Media Mediana Desviación Mín. Máx.
## 1 A7 60 0.5019 0.5 0.06098219 0.3333333 0.6833333
shapiro.test(estimadorA7)
##
## Shapiro-Wilk normality test
##
## data: estimadorA7
## W = 0.99039, p-value = 0.0024
par(cex=0.5, cex.axis=0.5, cex.lab=0.5, cex.main=0.5, cex.sub=0.5, mfrow=c(1, 2), mai=c(0.5, 0.5, 0.5, 0.5))
hist(estimadorA7, main="n=60", xlab=" ", ylab=" ", freq=FALSE)
lines(density(estimadorA7), col="blue")
qqnorm(estimadorA7, main="n=60", xlab=" ", ylab=" "); qqline(estimadorA7, col="red")
ExtraeMuestraA8=function(nA8)
{
MuestraA8=sample(Poblacion, nA8)
return(MuestraA8)
}
nA8=100
estimadorA8=numeric()
for(i in 1:500)
{
PnA8=sum(ExtraeMuestraA8(nA8) == "Enferma")/nA8
estimadorA8=c(estimadorA8, PnA8)
}
ResultadoA8=data.frame("Escenario"="A8", "Tamaño"=nA8, "Media"=mean(estimadorA8), "Mediana"=median(estimadorA8), "Desviación"=sd(estimadorA8), "Mín."=min(estimadorA8), "Máx."=max(estimadorA8))
ResultadoA8
## Escenario Tamaño Media Mediana Desviación Mín. Máx.
## 1 A8 100 0.50186 0.5 0.04939251 0.37 0.66
shapiro.test(estimadorA8)
##
## Shapiro-Wilk normality test
##
## data: estimadorA8
## W = 0.99418, p-value = 0.05314
par(cex=0.5, cex.axis=0.5, cex.lab=0.5, cex.main=0.5, cex.sub=0.5, mfrow=c(1, 2), mai=c(0.5, 0.5, 0.5, 0.5))
hist(estimadorA8, main="n=100", xlab=" ", ylab=" ", freq=FALSE)
lines(density(estimadorA8), col="blue")
qqnorm(estimadorA8, main="n=100", xlab=" ", ylab=" "); qqline(estimadorA8, col="red")
ExtraeMuestraA9=function(nA9)
{
MuestraA9=sample(Poblacion, nA9)
return(MuestraA9)
}
nA9=200
estimadorA9=numeric()
for(i in 1:500)
{
PnA9=sum(ExtraeMuestraA9(nA9) == "Enferma")/nA9
estimadorA9=c(estimadorA9, PnA9)
}
ResultadoA9=data.frame("Escenario"="A9", "Tamaño"=nA9, "Media"=mean(estimadorA9), "Mediana"=median(estimadorA9), "Desviación"=sd(estimadorA9), "Mín."=min(estimadorA9), "Máx."=max(estimadorA9))
ResultadoA9
## Escenario Tamaño Media Mediana Desviación Mín. Máx.
## 1 A9 200 0.50096 0.5025 0.03168416 0.41 0.615
shapiro.test(estimadorA9)
##
## Shapiro-Wilk normality test
##
## data: estimadorA9
## W = 0.99494, p-value = 0.1007
par(cex=0.5, cex.axis=0.5, cex.lab=0.5, cex.main=0.5, cex.sub=0.5, mfrow=c(1, 2), mai=c(0.5, 0.5, 0.5, 0.5))
hist(estimadorA9, main="n=200", xlab=" ", ylab=" ", freq=FALSE)
lines(density(estimadorA9), col="blue")
qqnorm(estimadorA9, main="n=200", xlab=" ", ylab=" "); qqline(estimadorA9, col="red")
ExtraeMuestraA10=function(nA10)
{
MuestraA10=sample(Poblacion, nA10)
return(MuestraA10)
}
nA10=500
estimadorA10=numeric()
for(i in 1:500)
{
PnA10=sum(ExtraeMuestraA10(nA10) == "Enferma")/nA10
estimadorA10=c(estimadorA10, PnA10)
}
ResultadoA10=data.frame("Escenario"="A10", "Tamaño"=nA10, "Media"=mean(estimadorA10), "Mediana"=median(estimadorA10), "Desviación"=sd(estimadorA10), "Mín."=min(estimadorA10), "Máx."=max(estimadorA10))
ResultadoA10
## Escenario Tamaño Media Mediana Desviación Mín. Máx.
## 1 A10 500 0.500284 0.5 0.0162251 0.458 0.552
shapiro.test(estimadorA10)
##
## Shapiro-Wilk normality test
##
## data: estimadorA10
## W = 0.99376, p-value = 0.0373
par(cex=0.5, cex.axis=0.5, cex.lab=0.5, cex.main=0.5, cex.sub=0.5, mfrow=c(1, 2), mai=c(0.5, 0.5, 0.5, 0.5))
hist(estimadorA10, main="n=500", xlab=" ", ylab=" ", freq=FALSE)
lines(density(estimadorA10), col="blue")
qqnorm(estimadorA10, main="n=500", xlab=" ", ylab=" "); qqline(estimadorA10, col="red")
rbind(ResultadoA1, ResultadoA2, ResultadoA3, ResultadoA4, ResultadoA5, ResultadoA6, ResultadoA7, ResultadoA8, ResultadoA9, ResultadoA10)
## Escenario Tamaño Media Mediana Desviación Mín. Máx.
## 1 A1 5 0.4980000 0.4000000 0.22310435 0.0000000 1.0000000
## 2 A2 10 0.5032000 0.5000000 0.15632862 0.1000000 0.9000000
## 3 A3 15 0.5032000 0.5333333 0.13332826 0.1333333 0.8666667
## 4 A4 20 0.5011000 0.5000000 0.11273513 0.2000000 0.8500000
## 5 A5 30 0.4993333 0.5000000 0.09337674 0.2666667 0.8000000
## 6 A6 50 0.5022000 0.5000000 0.06760103 0.3000000 0.6600000
## 7 A7 60 0.5019000 0.5000000 0.06098219 0.3333333 0.6833333
## 8 A8 100 0.5018600 0.5000000 0.04939251 0.3700000 0.6600000
## 9 A9 200 0.5009600 0.5025000 0.03168416 0.4100000 0.6150000
## 10 A10 500 0.5002840 0.5000000 0.01622510 0.4580000 0.5520000
EscenarioA=c("A1", "A2", "A3", "A4", "A5", "A6", "A7", "A8", "A9", "A10")
Tamaño=c(5, 10, 15, 20, 30, 50, 60, 100, 200, 500)
SWA=c(0.93025, 0.96724, 0.97631, 0.97316, 0.98550, 0.99120, 0.99117, 0.99401, 0.99318, 0.99519)
PValorA=c(1.662*10^-14, 4.001*10^-9, 3.023*10^-7, 6.133*10^-8, 0.0000695, 0.0045570, 0.0044510, 0.0460100, 0.023, 0.1239)
MarcoSWA=data.frame(EscenarioA, Tamaño, SWA, PValorA)
MarcoSWA
## EscenarioA Tamaño SWA PValorA
## 1 A1 5 0.93025 1.662e-14
## 2 A2 10 0.96724 4.001e-09
## 3 A3 15 0.97631 3.023e-07
## 4 A4 20 0.97316 6.133e-08
## 5 A5 30 0.98550 6.950e-05
## 6 A6 50 0.99120 4.557e-03
## 7 A7 60 0.99117 4.451e-03
## 8 A8 100 0.99401 4.601e-02
## 9 A9 200 0.99318 2.300e-02
## 10 A10 500 0.99519 1.239e-01
Con la revisión y análisis de los resultados de la simulación con 500 corridas para diferentes tamaños de muestra n=(5, 10, 15, 20, 30, 50, 60, 100, 200, 500), provenientes de una población con distribución binomial, fue posible verificar el Teorema del Límite Central porque con el caso presentado en este documento se comprueba la convergencia del estimador de la proporción muestral a la distribución normal. En los 10 escenarios simulados el estimador de la proporción muestral es muy aproximado al parámetro poblacional de 0.5, verificando la insesgadez de los estimadores. A medida que se aumenta el tamaño de la muestra, con simulación de 500 corridas, se reduce la variabilidad de la variable aleatoria Media de la Proporción Muestral medido por la desviación estándar y el rango, para este último caso, pasa de un rango de 1 para el tamaño n=5 a 0.1 para el tamaño n=500. Además, los gráficos Q-Q Plot y la prueba Shapiro-Wilk (el desempeño de esta prueba mejora a medida que aumenta el tamaño de la muestra n), para muestras grandes (n > 30) apoyan la confirmación de la normalidad de la distribución de probabilidad de la variable aleatoria estudiada.