library(tidyverse)
library(knitr)
Tenemos en R el data frame quakes que registra sismos en cierta área alrededor de FIJI a partir de 1964, que consideraremos como población.
# Usamos el dataset 'quakes' de R y le añadimos un ID
poblacion_quakes <- quakes %>%
mutate(id = row_number())
# Definir N (Tamaño de la población)
N_quakes <- nrow(poblacion_quakes)
Primero, definimos nuestra población (N = r N_quakes) y fijamos una semilla (set.seed(123)) para que el muestreo sea reproducible. Luego, extraemos la muestra de n = 150.
# Fijar semilla para reproducibilidad
set.seed(123)
n_quakes <- 150
# Extraer la muestra aleatoria simple
muestra_quakes <- poblacion_quakes %>%
sample_n(size = n_quakes, replace = FALSE)
# Estimar la media poblacional usando la media muestral
media_muestral_mag <- mean(muestra_quakes$mag)
# Comparar con la media poblacional real (parámetro)
media_poblacional_mag <- mean(poblacion_quakes$mag)
cat(sprintf("La media muestral (nuestro estimador) es: %f . \n",round(media_muestral_mag, 4) ))
## La media muestral (nuestro estimador) es: 4.580000 .
cat(sprintf("El parámetro real de la población es: %f . \n",round(media_poblacional_mag, 4) ))
## El parámetro real de la población es: 4.620400 .
Usamos la fórmula del Error Estándar (SE) para la media, \(SE(\bar{x}) = \frac{s}{\sqrt{n}}\), donde \(s\) es la desviación estándar de la muestra.
# Calcular la desviación estándar de la muestra
s_mag <- sd(muestra_quakes$mag)
# Calcular el Error Estándar
se_media_mag <- s_mag / sqrt(n_quakes)
cat(sprintf("El error estándar del promedio muestral es: %f . \n",round(se_media_mag, 4) ))
## El error estándar del promedio muestral es: 0.032400 .
Usamos la fórmula del Intervalo de Confianza: \(\bar{x} \pm z_{\alpha/2} \cdot SE(\bar{x})\)
# Nivel de confianza y valor Z
confianza_mag <- 0.90
alfa_mag <- 1 - confianza_mag
z_valor_mag <- qnorm(1 - (alfa_mag / 2))
# Calcular el margen de error
margen_error_mag <- z_valor_mag * se_media_mag
# Calcular el Intervalo de Confianza
ic_lim_inf_mag <- media_muestral_mag - margen_error_mag
ic_lim_sup_mag <- media_muestral_mag + margen_error_mag
cat(sprintf("El intervalo de confianza del 90%% para la media de la magnitud es: [%.4f, %.4f].", ic_lim_inf_mag, ic_lim_sup_mag))
## El intervalo de confianza del 90% para la media de la magnitud es: [4.5268, 4.6332].
Ahora estimaremos una proporción (p), no una media.
# 1. Calcular Proporción POBLACIONAL (Parámetro 'p')
p_poblacional_grave <- poblacion_quakes %>%
summarise(
total_graves = sum(mag >= 5),
p_grave = total_graves / n()
) %>%
pull(p_grave)
# 2. Calcular Proporción MUESTRAL (Estimador 'p_gorro')
p_muestral_grave <- muestra_quakes %>%
summarise(
total_graves = sum(mag >= 5),
p_grave = total_graves / n()
) %>%
pull(p_grave)
cat(sprintf("La proporción poblacional real (parámetro) es: %.4f\n", p_poblacional_grave))
## La proporción poblacional real (parámetro) es: 0.1980
cat(sprintf("La proporción muestral (estimador) es: %.4f\n", p_muestral_grave))
## La proporción muestral (estimador) es: 0.2000
Usamos la fórmula del Error Estándar (SE) para una proporción, \(SE(\hat{p}) = \sqrt{\frac{\hat{p}(1-\hat{p})}{n}}\).
# Usamos el estimador p_muestral (p_gorro) para la fórmula
p_hat <- p_muestral_grave
q_hat <- 1 - p_hat
se_proporcion_grave <- sqrt((p_hat * q_hat) / n_quakes)
cat(sprintf("El error estándar del estadístico de proporción es: %.4f.\n", se_proporcion_grave))
## El error estándar del estadístico de proporción es: 0.0327.
Suponga que tenemos la siguiente población con información del peso y dieta para pollos df <- data.frame(peso = ChickWeight\(weight, dieta = ChickWeight\)Diet).
# Definir nuestra población
poblacion_chick <- data.frame(peso = ChickWeight$weight, dieta = ChickWeight$Diet)
# Calcular parámetros poblacionales generales
N_chick <- nrow(poblacion_chick)
media_poblacional_peso <- mean(poblacion_chick$peso)
# Calcular parámetros de los ESTRATOS (Dieta)
# Necesitamos Nh (tamaño) y Sh (DE) de cada estrato para la asignación
poblacion_estratos_info <- poblacion_chick %>%
group_by(dieta) %>%
summarise(
Nh = n(), # N_h: Tamaño del estrato
Sh = sd(peso) # S_h: Desviación Estándar del estrato
) %>%
mutate(
Wh = Nh / N_chick # W_h: Peso del estrato (Nh / N)
)
Primero, realizamos un Muestreo Aleatorio Simple (MAS) para tener una estimación base.
# Fijar semilla para reproducibilidad
set.seed(456)
n_chick_mas <- 120
# Extraer la muestra aleatoria simple
muestra_chick_mas <- poblacion_chick %>%
sample_n(size = n_chick_mas, replace = FALSE)
# Estimar la media poblacional usando la media muestral
media_muestral_mas <- mean(muestra_chick_mas$peso)
cat(sprintf("La media poblacional real (Parámetro) es: %.4f\n", media_poblacional_peso))
## La media poblacional real (Parámetro) es: 121.8183
cat(sprintf("La media muestral (Estimador MAS) es: %.4f\n", media_muestral_mas))
## La media muestral (Estimador MAS) es: 120.9250
Ahora aplicaremos Muestreo Estratificado, usando la dieta como estrato. Usaremos el mismo tamaño total de muestra n = 120 para poder comparar los métodos.
cat("La tabla de parámetros de nuestros estratos (calculada de la población) es:\n")
## La tabla de parámetros de nuestros estratos (calculada de la población) es:
kable(poblacion_estratos_info,
digits = 4,
col.names = c("Estrato (Dieta)", "N_h (Tamaño)", "S_h (DE)", "W_h (Peso)"))
| Estrato (Dieta) | N_h (Tamaño) | S_h (DE) | W_h (Peso) |
|---|---|---|---|
| 1 | 220 | 56.6566 | 0.3806 |
| 2 | 120 | 71.6075 | 0.2076 |
| 3 | 120 | 86.5418 | 0.2076 |
| 4 | 118 | 68.8287 | 0.2042 |
Asignación Proporcional: \(n_h = n \cdot W_h\)
Asignación Óptima (Neyman): \(n_h = n \cdot \frac{N_h S_h}{\sum N_k S_k}\)
n_total_estratificado <- 120
calculos_asignacion <- poblacion_estratos_info %>%
mutate(
# 1. Asignación Proporcional
nh_prop = n_total_estratificado * Wh,
# 2. Asignación Óptima (Neyman)
Nh_x_Sh = Nh * Sh,
sum_Nh_Sh = sum(Nh_x_Sh),
nh_opt = n_total_estratificado * (Nh_x_Sh / sum_Nh_Sh)
)
# El redondeo puede causar que la suma no sea exactamente n_total.
# Lo ajustamos redondeando y asegurando que la suma sea 120.
calculos_asignacion <- calculos_asignacion %>%
mutate(
nh_prop = round(nh_prop),
nh_opt = round(nh_opt)
)
# Ajuste por redondeo (si n_prop no suma 120, se ajusta)
if (sum(calculos_asignacion$nh_prop) != n_total_estratificado) {
diff <- n_total_estratificado - sum(calculos_asignacion$nh_prop)
calculos_asignacion$nh_prop[which.max(calculos_asignacion$nh_prop)] <-
calculos_asignacion$nh_prop[which.max(calculos_asignacion$nh_prop)] + diff
}
if (sum(calculos_asignacion$nh_opt) != n_total_estratificado) {
diff <- n_total_estratificado - sum(calculos_asignacion$nh_opt)
calculos_asignacion$nh_opt[which.max(calculos_asignacion$nh_opt)] <-
calculos_asignacion$nh_opt[which.max(calculos_asignacion$nh_opt)] + diff
}
cat("Tabla de Asignación de Muestras (n=120):\n")
## Tabla de Asignación de Muestras (n=120):
kable(calculos_asignacion %>% select(dieta, Nh, Sh, nh_prop, nh_opt),
digits = 2,
col.names = c("Estrato", "N_h", "S_h", "n_h (Prop)", "n_h (Óptima)"))
| Estrato | N_h | S_h | n_h (Prop) | n_h (Óptima) |
|---|---|---|---|---|
| 1 | 220 | 56.66 | 46 | 38 |
| 2 | 120 | 71.61 | 25 | 26 |
| 3 | 120 | 86.54 | 25 | 31 |
| 4 | 118 | 68.83 | 24 | 25 |
Ahora extraemos las muestras de la población poblacion_chick basándonos en los tamaños nh_prop y nh_opt que calculamos.
# Fijamos una nueva semilla para este muestreo
set.seed(789)
# 1. Muestra Proporcional
# Agrupamos por dieta y tomamos el n_h correspondiente a ese grupo
muestra_prop <- poblacion_chick %>%
group_by(dieta) %>%
sample_n(
# Busca el 'nh_prop' para el grupo (dieta) actual
size = calculos_asignacion$nh_prop[match(cur_group()$dieta, calculos_asignacion$dieta)],
replace = FALSE
) %>%
ungroup()
# 2. Muestra Óptima
muestra_opt <- poblacion_chick %>%
group_by(dieta) %>%
sample_n(
# Busca el 'nh_opt' para el grupo (dieta) actual
size = calculos_asignacion$nh_opt[match(cur_group()$dieta, calculos_asignacion$dieta)],
replace = FALSE
) %>%
ungroup()
cat(sprintf("Tamaño de la muestra proporcional: %d\n", nrow(muestra_prop)))
## Tamaño de la muestra proporcional: 120
cat(sprintf("Tamaño de la muestra óptima: %d\n", nrow(muestra_opt)))
## Tamaño de la muestra óptima: 120
Ahora calculamos la media muestral para cada estrato (\(\bar{y}_h\)) de ambas muestras.
# Medias de estratos de la muestra PROPORCIONAL
medias_estratos_prop <- muestra_prop %>%
group_by(dieta) %>%
summarise(media_estrato_h = mean(peso))
cat("Medias de Estratos (Muestra Proporcional):\n")
## Medias de Estratos (Muestra Proporcional):
kable(medias_estratos_prop,
digits = 4,
col.names = c("Estrato", "Media Muestral (y_bar_h)"))
| Estrato | Media Muestral (y_bar_h) |
|---|---|
| 1 | 98.0652 |
| 2 | 116.7200 |
| 3 | 141.8000 |
| 4 | 135.6250 |
# Medias de estratos de la muestra ÓPTIMA
medias_estratos_opt <- muestra_opt %>%
group_by(dieta) %>%
summarise(media_estrato_h = mean(peso))
cat("\nMedias de Estratos (Muestra Óptima):\n")
##
## Medias de Estratos (Muestra Óptima):
kable(medias_estratos_opt,
digits = 4,
col.names = c("Estrato", "Media Muestral (y_bar_h)"))
| Estrato | Media Muestral (y_bar_h) |
|---|---|
| 1 | 107.5000 |
| 2 | 106.1923 |
| 3 | 146.6452 |
| 4 | 127.9200 |
Finalmente, estimamos la media poblacional general (\(\bar{y}_{st}\)) usando la fórmula: \(\bar{y}_{st} = \sum_{h=1}^{L} W_h \cdot \bar{y}_h\)
Usamos los pesos \(W_h\) de la población (que calculamos en poblacion_estratos_info) y las medias \(\bar{y}_h\) de cada muestra (calculadas en el paso 4).
# Unir los pesos (Wh) con las medias de estratos (y_bar_h)
# --- Estimación Proporcional ---
est_final_prop <- medias_estratos_prop %>%
# Unimos con la tabla de info de estratos para obtener Wh
left_join(poblacion_estratos_info %>% select(dieta, Wh), by = "dieta") %>%
# Calculamos el producto ponderado
mutate(Wh_x_media_h = Wh * media_estrato_h)
# La estimación general es la suma de los productos ponderados
media_general_prop <- sum(est_final_prop$Wh_x_media_h)
# --- Estimación Óptima ---
est_final_opt <- medias_estratos_opt %>%
left_join(poblacion_estratos_info %>% select(dieta, Wh), by = "dieta") %>%
mutate(Wh_x_media_h = Wh * media_estrato_h)
media_general_opt <- sum(est_final_opt$Wh_x_media_h)
cat(sprintf("La media poblacional real (Parámetro) es: %.4f\n", media_poblacional_peso))
## La media poblacional real (Parámetro) es: 121.8183
cat(sprintf("La estimación general con Muestreo Proporcional es: %.4f\n", media_general_prop))
## La estimación general con Muestreo Proporcional es: 118.6860
cat(sprintf("La estimación general con Muestreo Óptimo es: %.4f\n", media_general_opt))
## La estimación general con Muestreo Óptimo es: 119.5243
cat(sprintf("(Nota: En este caso, la Muestra Óptima dio una estimación ligeramente más cercana al parámetro real que la Proporcional. El Muestreo Aleatorio Simple (MAS) del punto 2 dio %.4f).\n", media_muestral_mas))
## (Nota: En este caso, la Muestra Óptima dio una estimación ligeramente más cercana al parámetro real que la Proporcional. El Muestreo Aleatorio Simple (MAS) del punto 2 dio 120.9250).