En este laboratorio afianzaremos algunos conceptos vistos en clase.
Antes de iniciar, abrimos las librerias que usaremos en el laboratorio
ggplot2, dplyr, ggfortify,
rio, describe y establecemos el directorio de
trabajo.
Usaremos la base de datos de Bihar
Bihar_sample_data.csv, un estado muy poblado de India. La
base ha sido obtenida de kaggle. La
base de datos cuenta con 39553. Para fines del laboratorio, se asumirá
que ese es el total de la población de Bihar.
En la población de Bihar, contamos con personas que miden en promedio 142.79 cm, con una desviación estándar de 23.64cm.
poblacion <- data.frame(
Data = "Poblacion",
Media = mean(bihardata$height_cm, na.rm = TRUE),
Desviacion = sd(bihardata$height_cm, na.rm = TRUE)
)
De esa población extaeremos tres muestras de 25 personas cada una. Posteriormente calcularemos los promedios de cada una de las muestras.
muestra1 <- bihardata %>% sample_n(25)
muestra2 <- bihardata %>% sample_n(25)
muestra3 <- bihardata %>% sample_n(25)
Ahora comparemos las desviaciones y medias de cada una de las muestras, con la base original.
resumen1 <- data.frame(
Data = "Muestra 1",
Media = mean(muestra1$height_cm, na.rm = TRUE),
Desviacion = sd(muestra1$height_cm, na.rm = TRUE)
)
resumen2 <- data.frame(
Data = "Muestra 2",
Media = mean(muestra2$height_cm, na.rm = TRUE),
Desviacion = sd(muestra2$height_cm, na.rm = TRUE)
)
resumen3 <- data.frame(
Data = "Muestra 3",
Media = mean(muestra3$height_cm, na.rm = TRUE),
Desviacion = sd(muestra3$height_cm, na.rm = TRUE)
)
compara_muestras <- bind_rows(resumen1, resumen2, resumen3, poblacion)
compara_muestras
## Data Media Desviacion
## 1 Muestra 1 139.6650 26.20442
## 2 Muestra 2 135.0381 32.54066
## 3 Muestra 3 134.8091 25.44559
## 4 Poblacion 142.7897 23.64446
Conociendo los valores de la población (142.79 cm, con una desviación
estándar de 23.64cm) y asumiendo que cuentan con una distribución
normal, también es posible simular tres muestras aleatorias con la
función rnorm (la cual genera valores aleatorios).
n = 25 #el tamaño de la muestra o números aleatorios es 25.
muestra4 = rnorm(n, 142.79, 23.64)
media4 = mean(muestra4)
sd4 = sd(muestra4)
media4
## [1] 144.2543
sd4
## [1] 18.58449
Cada media muestras nos da un valor diferente al valor de la
población, debido a que hemos escogido muestras aleatorias.
Ojo: Como no hemos colocado una
semilla/seed a cada unx le saldrá un dato diferente.
Existe un número infinito de muestras posibles con una población
de + 30000.¨ En el mundo real es prácticamente imposible
encuestar a más d de una muestra; sin embargo, los software estadísticos
permiten explorar estas situaciones hipotéticas.
A continuación, obtendremos 1000 muestras de 381 personas cada una.
set.seed(121) # reproducibilidad
muchas_medias <- replicate(
1000,
{
muestra <- bihardata %>% dplyr::sample_n(381)
mean(muestra$height_cm, na.rm = TRUE)
}
)
muchas_sd <- replicate(
1000,
{
muestra <- bihardata %>% dplyr::sample_n(381)
sd(muestra$height_cm, na.rm = TRUE)
}
)
Calculamos la media y la desviación estándar de las primeras 30 medias muestrales.
muchas_medias[1:30] #me da los primeros 30 resultados
## [1] 142.0971 144.8053 142.8722 140.1701 142.1773 142.7437 139.7869 141.1883
## [9] 143.5907 144.9570 141.3676 143.6898 142.5032 142.6428 143.3834 142.0762
## [17] 144.1827 143.8006 142.4127 146.5233 143.3394 144.2413 141.4088 140.6282
## [25] 140.9187 144.2244 144.0631 142.4437 143.3509 143.9225
mean(muchas_medias)
## [1] 142.8406
muchas_sd[1:30] #me da los primeros 30 resultados
## [1] 24.25002 21.94223 24.63595 22.43434 23.01065 24.21410 24.97757 23.32347
## [9] 22.56644 23.34809 24.94898 24.45440 22.43331 23.17635 24.44269 22.59011
## [17] 23.84270 22.53383 22.36512 23.18931 23.43796 24.26372 24.12480 23.47989
## [25] 24.42610 23.41619 24.10483 25.23307 24.49333 24.80412
sd(muchas_sd)
## [1] 1.229039
Para representar gráficamente cada una de las medias muestrales se realizará un histograma. Este histograma se compara con la curva de denisdad de la población real.
media <- 142.79 # media poblacional
sd <- 23.64 #desviacion poblacional
n <- 381 # muestra
error_std <- sd/sqrt(381) #calculo de error estandar
hist(muchas_medias,
xlab = "Media muestral",
ylab = "Densidad",
col = "lightcyan",
xlim = c(130, 155),
ylim = c(0, 0.4),
freq = FALSE,
main = "Histograma de las medias muestrales observadas\n en 1000 muestras de tamaño 381")
curve(dnorm(x, mean = media, sd = error_std),
col = "blue", lwd = 2, add = TRUE)
Como es posible observar, las medias muestrales siguen una
distribución aproximadamente normal. Además, en la mayoría de los casos,
estas se encuentran dentro de dos desviaciones estándar respecto a la
media poblacional.
¿Qué pasa si reducimos o aumentamos el tamaño de las muestras?
¿Cuánto más grande es la muestra se encuentra más cerca o más lejos de
la media poblacional?
Ejercicio1 Replica el proceso, obteniendo 500 muestras
de 20 cada una.
Ejercicio2 Replica el proceso, obteniendo 500 muestras
de 500 cada una.
En un muestreo aleatorio simple, todos los eleentos tienen la misma probabilidad de ser seleccionados. Asimismo, cada muestra posible del mismo tamaño tiene la misma probabilidad de ocurrir.
mas <- sample(1:nrow(bihardata), size = 100, replace = FALSE) # Puede ser sin remplazo o con remplazo.
mas # aparece la ubicación en las bases de los casos seleccionados.
## [1] 20798 37815 23565 37188 18168 11093 31395 15239 9429 28540 34647 10600
## [13] 8133 30759 26914 32664 35607 18735 10946 34681 8895 38173 22543 25839
## [25] 513 37750 33018 26837 8127 9884 18001 14729 27498 18265 21681 16302
## [37] 11055 23712 16035 14419 1710 2449 15985 6504 32115 39171 29241 29087
## [49] 18366 28010 1446 23382 29302 34717 6238 3322 2702 4899 15765 5419
## [61] 23198 33548 9052 36147 21403 29615 8160 931 21824 17079 22965 12906
## [73] 13210 34903 32487 17461 24589 37436 29165 25931 26513 15048 10833 23185
## [85] 8979 5596 34617 19794 21896 8498 12009 27601 4389 16769 12960 38447
## [97] 37475 10903 30893 34464
Imaginemos que queremos hacer seleccionar una poroporcion de casos (5%)
prop <- bihardata %>%
sample_frac(0.05)
Quiero asegurarme de identificar a personas de manera que pueda abarcar a todas las alturas posibles. Para esto, voy a ordenrar la data según altura.
bihardata <- bihardata %>%
arrange(height_cm)
Observamos que varias personas miden “1cm”. Probablemente, este sea un error. Vamos a cerrar nuestro rango a personas que miden menos de 1 metro (100cm).
bihardata100 <- subset(bihardata, height_cm > 100)
Con la población que me interesa, procedo a hacer el muestreo
aleatorio sistemático, de manera que pueda tener una muestra de 380
personas.
En este caso no me interesa que la muestra se parezca a la población en
términos de altura; sino, que priorizo garantizar que se encuentren
representadas las diferentes variedades de alturas.
sis <- sys.sample(N=nrow(bihardata100),n=380)
muestrasis <- bihardata100[sis, ]
plot(density(bihardata100$height_cm, na.rm = TRUE),
main = "Distribución de Alturas",
xlab = "Altura (cm)",
col = "blue",
lwd = 2)
lines(density(muestrasis$height_cm, na.rm = TRUE),
col = "green4",
lwd = 2)
legend("topright", legend = c("bihardata100", "muestrasis"),
col = c("blue", "green4"), lwd = 2)
Dividiremos a la población en tres estratos según su grupo etario.
bihardata <- bihardata %>%
filter(!is.na(age)) %>% # elimina filas con NA en age
mutate(grupo_edad = cut(age,
breaks = c(-Inf, 17, 65, Inf),
labels = c("Menores de 18", "18 a 65", "65 o más")))
Estratos <- bihardata %>%
group_by(grupo_edad) %>%
summarise(n = n(), .groups = "drop") %>%
mutate(p = n / sum(n))
Asignación de la muestra proporcional a estratos
nsizeProp<-nstrata(n=380,wh=Estratos[,3],method="proportional")
nsizeProp<-nstrata(n=380,wh=Estratos[,3],method="proportional")
Ejercicio3 Aplicar un diseño de muestreo en dos etapas: Estratificación por sexo y Selección sistemática según peso.