Introducción

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.


PARTE 1 — Intervalos de Confianza

1.1 ¿Qué significa “95% de confianza”? Simulación de cobertura

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.

1.2 Relación entre error de estimación y nivel de confianza

“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)

1.3 Intervalo de confianza para una proporción — Ejemplo

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)

PARTE 2 — Pruebas de Hipótesis y el Valor p

2.1 El estadístico de prueba bajo H0 — Ejemplo de las horas trabajadas

Ejemplo (“Pruebas de Hipótesis”):

  • H0: μ = 23 hs semanales (no trabajan más que antes)
  • H1: μ > 23 hs semanales (trabajan más) → prueba de una cola a derecha
  • Población Normal, σ = 4, muestra n = 49, media muestral observada = 24 hs
  • α = 0,05
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)

2.2 Simulación del Error de Tipo I (¿realmente α controla el riesgo?)

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 )

2.3 Simulación de la Potencia de la prueba (1-β)

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)

2.4 ¿Qué es realmente el Valor p?

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.

2.4.1 Valor p en el ejemplo de las horas trabajadas (una cola)

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)

2.4.2 Valor p en una prueba de dos colas

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.

2.4.3 La gran idea que resume todo: la distribución del valor p

Esta es la simulación más importante para que el valor p deje de ser “una fórmula” y pase a ser intuitivo:

  • Si H0 es VERDADERA, el valor p tiene distribución Uniforme(0,1) — es decir, es “igual de probable” que dé 0,03 que 0,72 que 0,95. Por eso, si fijamos α=0,05, la probabilidad de que el valor p nos “engañe” (dé < 0,05 aunque H0 sea cierta) es exactamente 0,05: el Error de Tipo I.
  • Si H0 es FALSA, el valor p tiende a acumularse cerca de 0 (cuanto más lejos esté la verdad de H0, más probable que el valor p sea chico).
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

2.5 Prueba de hipótesis para una proporción

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

Cierre: método del valor crítico vs. método del valor p

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