Este documento acompaña las clases de Estimación por Intervalos y Pruebas de Hipótesis. En vez de quedarnos solo con las fórmulas, vamos a simular miles de muestras para ver con los datos qué significan realmente conceptos como “95% de confianza”, “nivel de significación α”, “Error de Tipo I y II” y, sobre todo, el famoso valor p.
La idea clave (Diapo 2 de “Estimación”): el intervalo es aleatorio (depende de la muestra), no el parámetro. “95% de confianza” significa que si repetimos el proceso de muestreo muchas veces, aproximadamente el 95% de los intervalos construidos van a contener al verdadero μ poblacional.
Vamos a simular esto con el ejemplo del Ejemplo 1 de la cátedra: horas semanales de trabajo de los empleados. Supongamos (para poder simular) que en la población real μ = 24 hs y σ = 4 hs.
mu_real <- 24 # parámetro poblacional verdadero (desconocido en la práctica)
sigma_real <- 4
n <- 49
confianza <- 0.95
alpha <- 1 - confianza
z_critico <- qnorm(1 - alpha/2) # 1,96 para 95%
k <- 200 # cantidad de muestras / intervalos simulados
medias <- replicate(k, mean(rnorm(n, mu_real, sigma_real)))
error <- z_critico * sigma_real / sqrt(n)
li <- medias - error
ls <- medias + error
contiene <- (li <= mu_real) & (ls >= mu_real)
cat("Proporción de intervalos que SÍ contienen a mu =", mean(contiene), "\n")
## Proporción de intervalos que SÍ contienen a mu = 0.94
cat("(el valor teórico esperado es", confianza, ")\n")
## (el valor teórico esperado es 0.95 )
df <- data.frame(id = 1:k, li = li, ls = ls, media = medias, contiene = contiene)
# Para que el gráfico sea legible, mostramos los primeros 100
df100 <- df[1:100, ]
ggplot(df100, aes(x = id, y = media, color = contiene)) +
geom_hline(yintercept = mu_real, linetype = "dashed", color = "black", linewidth = 0.8) +
geom_errorbar(aes(ymin = li, ymax = ls), width = 0) +
geom_point(size = 0.8) +
scale_color_manual(values = c("TRUE" = "#2C7FB8", "FALSE" = "#D7263D"),
labels = c("TRUE" = "Contiene a \u03bc", "FALSE" = "NO contiene a \u03bc")) +
coord_flip() +
labs(title = "100 intervalos de confianza del 95%, cada uno de una muestra distinta",
subtitle = paste0("Línea negra: \u03bc real = ", mu_real,
" | Rojo: intervalos que 'fallan' (debería ser ~5%)"),
x = "N° de muestra/intervalo", y = "Horas semanales", color = "") +
theme_minimal(base_size = 13) +
theme(axis.text.y = element_blank())
Para discutir en clase: ¿por qué no da exactamente
95,00%? Porque es una simulación con un número finito de repeticiones
(error de simulación) — a medida que aumentás k, la
proporción converge cada vez más a 0,95.
“el error de estimación crece al aumentar la confianza, lo cual
implica pérdida de precisión”. Ejemplo: n = 30,
Sn-1 = 2,3 galones.
n2 <- 30
s2 <- 2.3
niveles <- c(0.80, 0.90, 0.95, 0.99, 0.999)
errores <- qt(1 - (1 - niveles)/2, df = n2 - 1) * s2 / sqrt(n2) # usamos t porque sigma desconocido
data.frame(Nivel_confianza = niveles, Error_de_estimacion = round(errores, 3))
## Nivel_confianza Error_de_estimacion
## 1 0.800 0.551
## 2 0.900 0.713
## 3 0.950 0.859
## 4 0.990 1.157
## 5 0.999 1.537
ggplot(data.frame(niveles, errores), aes(x = niveles, y = errores)) +
geom_line(color = "#2C7FB8", linewidth = 1.1) +
geom_point(color = "#D7263D", size = 2.5) +
labs(title = "A mayor confianza, mayor error de estimación (menor precisión)",
x = "Nivel de confianza (1-\u03b1)", y = "Error de estimación (e)") +
theme_minimal(base_size = 13)
Sobre 100 personas que recibieron un sobre para recaudar fondos, 20
contribuyeron. Estimamos p con 95% de confianza y simulamos
la cobertura igual que en 1.1, pero ahora con una
Binomial.
p_real <- 0.20 # supongamos que este es el verdadero p (para simular)
n3 <- 100
z95 <- qnorm(0.975)
k3 <- 500
exitos <- rbinom(k3, n3, p_real)
ps <- exitos / n3
error3 <- z95 * sqrt(ps * (1 - ps) / n3)
li3 <- ps - error3
ls3 <- ps + error3
contiene3 <- (li3 <= p_real) & (ls3 >= p_real)
cat("Proporción de intervalos que contienen a p =", round(mean(contiene3), 3),
" (teórico: 0.95)\n")
## Proporción de intervalos que contienen a p = 0.934 (teórico: 0.95)
Ejemplo (“Pruebas de Hipótesis”):
mu0 <- 23 # valor de H0
sigma <- 4
n <- 49
xbarra <- 24 # media observada en la muestra
alpha <- 0.05
z_obs <- (xbarra - mu0) / (sigma / sqrt(n))
z_crit <- qnorm(1 - alpha) # una cola a derecha
cat("Z observado =", round(z_obs, 3), "\n")
## Z observado = 1.75
cat("Valor crítico (una cola, alfa=0.05) =", round(z_crit, 3), "\n")
## Valor crítico (una cola, alfa=0.05) = 1.645
cat("¿Se rechaza H0? ", z_obs > z_crit, "\n")
## ¿Se rechaza H0? TRUE
xs <- seq(-4, 4, length.out = 400)
dens <- data.frame(x = xs, y = dnorm(xs))
ggplot(dens, aes(x = x, y = y)) +
geom_area(data = subset(dens, x >= z_crit), fill = "#D7263D", alpha = 0.35) +
geom_line(color = "black", linewidth = 0.8) +
geom_vline(xintercept = z_obs, color = "#2C7FB8", linewidth = 1.1, linetype = "dashed") +
annotate("text", x = z_obs, y = 0.35, label = paste0("Z obs = ", round(z_obs,2)),
color = "#2C7FB8", hjust = -0.1, fontface = "bold") +
annotate("text", x = z_crit + 0.6, y = 0.05, label = paste0("Región de\nRechazo\n(\u03b1=0.05)"),
color = "#D7263D", size = 3.2) +
labs(title = "Distribución de Z bajo el supuesto de que H0 es cierta",
subtitle = "Si Z observado cae en la zona roja, se rechaza H0",
x = "Z", y = "densidad") +
theme_minimal(base_size = 13)
Fijate qué pasa si H0 es verdadera (μ real = 23) y repetimos el experimento miles de veces: ¿en qué proporción rechazamos H0 “por error”? Debería acercarse a α = 0,05.
set.seed(123)
mu0 <- 23
sigma <- 4
n <- 49
alpha <- 0.05
z_crit <- qnorm(1 - alpha)
k <- 5000
medias_sim <- replicate(k, mean(rnorm(n, mean = mu0, sd = sigma))) # H0 VERDADERA
z_sim <- (medias_sim - mu0) / (sigma / sqrt(n))
rechazos <- z_sim > z_crit
cat("Proporción de rechazos de H0 cuando H0 es VERDADERA:", mean(rechazos), "\n")
## Proporción de rechazos de H0 cuando H0 es VERDADERA: 0.0518
cat("(esto ES el Error de Tipo I; el valor teórico es alfa =", alpha, ")\n")
## (esto ES el Error de Tipo I; el valor teórico es alfa = 0.05 )
Ahora simulamos qué pasa si H1 es la realidad (por ejemplo μ real = 25, como en la diapo 24). La probabilidad de rechazar H0 correctamente es la potencia de la prueba.
set.seed(456)
mu_real_H1 <- 25 # el verdadero promedio es 25, distinto del mu0=23 que pone a prueba H0
medias_sim2 <- replicate(k, mean(rnorm(n, mean = mu_real_H1, sd = sigma)))
z_sim2 <- (medias_sim2 - mu0) / (sigma / sqrt(n))
rechazos2 <- z_sim2 > z_crit
potencia_simulada <- mean(rechazos2)
# Cálculo teórico de la potencia (1-beta)
z_beta_teo <- (mu0 + z_crit * sigma/sqrt(n) - mu_real_H1) / (sigma/sqrt(n))
potencia_teorica <- 1 - pnorm(z_beta_teo)
cat("Potencia simulada (1-beta):", round(potencia_simulada, 3), "\n")
## Potencia simulada (1-beta): 0.971
cat("Potencia teórica (1-beta):", round(potencia_teorica, 3), "\n")
## Potencia teórica (1-beta): 0.968
xs <- seq(19, 29, length.out = 500)
d_h0 <- dnorm(xs, mu0, sigma/sqrt(n))
d_h1 <- dnorm(xs, mu_real_H1, sigma/sqrt(n))
punto_critico_xbar <- mu0 + z_crit * sigma/sqrt(n)
df_plot <- data.frame(x = rep(xs, 2), y = c(d_h0, d_h1),
hipotesis = rep(c("Bajo H0 (\u03bc=23)", "Bajo H1 real (\u03bc=25)"), each = length(xs)))
ggplot(df_plot, aes(x = x, y = y, color = hipotesis, fill = hipotesis)) +
geom_line(linewidth = 1) +
geom_area(data = subset(df_plot, hipotesis == "Bajo H1 real (\u03bc=25)" & x > punto_critico_xbar),
alpha = 0.35, color = NA) +
geom_vline(xintercept = punto_critico_xbar, linetype = "dashed", color = "black") +
annotate("text", x = punto_critico_xbar, y = max(d_h0)*1.05,
label = "punto crítico", size = 3.2, hjust = -0.05) +
labs(title = "Potencia de la prueba = área bajo H1 a la derecha del punto crítico",
subtitle = "El área sombreada es 1-\u03b2 (probabilidad de rechazar H0 cuando H1 es verdadera)",
x = expression(bar(X)), y = "densidad", color = "", fill = "") +
theme_minimal(base_size = 13)
Definición de la cátedra (Diapo 5 y 33): “nivel de significación observado: es el mínimo nivel al cual H0 puede ser rechazada para un conjunto de datos dado”.
Dicho de otra forma: el valor p es la probabilidad de obtener, bajo el supuesto de que H0 es cierta, un resultado tan extremo (o más) que el observado en la muestra.
z_obs <- (24 - 23) / (4/sqrt(49))
valor_p <- 1 - pnorm(z_obs) # cola derecha
cat("Z observado =", round(z_obs,3), "\n")
## Z observado = 1.75
cat("Valor p =", round(valor_p, 4), "\n")
## Valor p = 0.0401
cat("¿Se rechaza a alfa=0.05? ", valor_p < 0.05, "\n")
## ¿Se rechaza a alfa=0.05? TRUE
xs <- seq(-4, 4, length.out = 400)
dens <- data.frame(x = xs, y = dnorm(xs))
ggplot(dens, aes(x = x, y = y)) +
geom_area(data = subset(dens, x >= z_obs), fill = "#F4A300", alpha = 0.55) +
geom_line(color = "black") +
geom_vline(xintercept = z_obs, color = "#2C7FB8", linewidth = 1) +
annotate("text", x = z_obs, y = 0.3, label = paste0("Z obs=", round(z_obs,2),
"\nValor p = área naranja = ", round(valor_p,4)),
hjust = -0.05, color = "#2C7FB8", size = 3.3) +
labs(title = "El valor p es el ÁREA bajo la curva, más allá del estadístico observado",
subtitle = "Cuanto más chico el área (valor p), más 'raro' es el resultado si H0 fuera cierta",
x = "Z", y = "densidad") +
theme_minimal(base_size = 13)
H0: μ = 16 onzas, H1: μ ≠ 16 onzas. Muestra: n=36, media=16,12, σ=0,4.
mu0 <- 16; sigma <- 0.4; n <- 36; xbarra <- 16.12
z_obs <- (xbarra - mu0)/(sigma/sqrt(n))
valor_p_dos_colas <- 2 * (1 - pnorm(abs(z_obs)))
cat("Z observado =", round(z_obs, 3), "\n")
## Z observado = 1.8
cat("Valor p (dos colas) =", round(valor_p_dos_colas, 4), "\n")
## Valor p (dos colas) = 0.0719
for (a in c(0.01, 0.05, 0.10)) {
cat(" alfa =", a, "-> ¿se rechaza H0?", valor_p_dos_colas < a, "\n")
}
## alfa = 0.01 -> ¿se rechaza H0? FALSE
## alfa = 0.05 -> ¿se rechaza H0? FALSE
## alfa = 0.1 -> ¿se rechaza H0? TRUE
Este es exactamente el resultado de la diapo 46: valor p ≈ 0,0718 → no se rechaza a α=0,05 pero sí se rechazaría a α=0,10.
Esta es la simulación más importante para que el valor p deje de ser “una fórmula” y pase a ser intuitivo:
set.seed(789)
mu0 <- 23; sigma <- 4; n <- 49
k <- 10000
# Caso A: H0 verdadera (mu real = 23)
medias_A <- replicate(k, mean(rnorm(n, mu0, sigma)))
z_A <- (medias_A - mu0)/(sigma/sqrt(n))
pvalues_A <- 1 - pnorm(z_A)
# Caso B: H0 falsa (mu real = 25, como el ejemplo de potencia)
medias_B <- replicate(k, mean(rnorm(n, 25, sigma)))
z_B <- (medias_B - mu0)/(sigma/sqrt(n))
pvalues_B <- 1 - pnorm(z_B)
df_p <- data.frame(pvalue = c(pvalues_A, pvalues_B),
caso = rep(c("H0 verdadera (\u03bc=23)", "H0 falsa (\u03bc real=25)"), each = k))
ggplot(df_p, aes(x = pvalue, fill = caso)) +
geom_histogram(aes(y = after_stat(density)), bins = 40, alpha = 0.7,
position = "identity", color = "white") +
geom_vline(xintercept = 0.05, linetype = "dashed", color = "black") +
facet_wrap(~caso, ncol = 1) +
labs(title = "Distribución del valor p en 10.000 réplicas del experimento",
subtitle = "Si H0 es verdadera: Uniforme(0,1) | Si H0 es falsa: se concentra cerca de 0",
x = "valor p", y = "densidad") +
theme_minimal(base_size = 13) +
theme(legend.position = "none")
cat("Proporción de valores p < 0.05 cuando H0 es VERDADERA:", mean(pvalues_A < 0.05),
" (debería ser ~ 0.05, el Error Tipo I)\n")
## Proporción de valores p < 0.05 cuando H0 es VERDADERA: 0.0517 (debería ser ~ 0.05, el Error Tipo I)
cat("Proporción de valores p < 0.05 cuando H0 es FALSA (potencia):", mean(pvalues_B < 0.05), "\n")
## Proporción de valores p < 0.05 cuando H0 es FALSA (potencia): 0.9673
El 15% histórico de éxito; en una muestra de 200, 45 respondieron con contribución. H0: p=0,15 vs H1: p>0,15.
p0 <- 0.15; n <- 200; exitos <- 45
ps <- exitos/n
z_obs <- (ps - p0)/sqrt(p0*(1-p0)/n)
valor_p <- 1 - pnorm(z_obs)
cat("Ps observado =", ps, "\n")
## Ps observado = 0.225
cat("Z observado =", round(z_obs,3), "\n")
## Z observado = 2.97
cat("Valor p =", format(valor_p, scientific = FALSE), "\n")
## Valor p = 0.001486855
cat("¿Se rechaza H0 al 5%?", valor_p < 0.05, "\n")
## ¿Se rechaza H0 al 5%? TRUE
Ambos métodos son equivalentes y siempre llevan a la misma decisión (Diapo 5):
| Método del valor crítico | Método del valor p |
|---|---|
| Se fija α antes de ver los datos | Se calcula el valor p a partir de los datos |
| Se compara el estadístico observado contra un punto crítico | Se compara el valor p directamente contra α |
| Rechazo si el estadístico cae en la región crítica | Rechazo si valor p < α |
| No dice “qué tan cerca” estuvo la decisión | Permite saber para qué α se hubiera rechazado |