Pruebas de Hipótesis e Intervalos de Confianza en R

Hoja de referencia — Maestría en Economía de la Salud · Bioestadística

R ≥ 4.0 1 y 2 Poblaciones Medias · Proporciones · Varianzas
1 Una Población — Medias
t
Prueba t — Una Muestra
H₀: μ = μ₀ · σ desconocida
t.test()
t.test(x,
       mu = μ₀,
       alternative = "two.sided",
       conf.level = 0.95)
# Hipótesis: ¿La estancia media es 5 días?
dias <- c(4,6,5,7,5,6,4,8,5,6,5,4,7,5,6)

t.test(dias,
       mu = 5,
       alternative = "two.sided",
       conf.level = 0.95)
t = 1.512, df = 14, p-value = 0.1525 IC 95%: [4.73, 6.00] media muestral: 5.40
Interpretación: p > 0.05 → No rechazamos H₀. No hay evidencia de que la estancia media difiera de 5 días.
IC
IC para μ — Una Muestra
Extraído del t.test() · σ desconocida
IC = x̄ ± t(α/2, n-1) · s/√n
# El IC ya está en t.test():
resultado <- t.test(x,
                    conf.level = 0.95)
resultado$conf.int  # extraer IC
gasto <- c(120,145,98,160,132,155,110,140,125,138)

res <- t.test(gasto, conf.level = 0.95)
cat("IC 95%:", res$conf.int)

# Cálculo manual:
n <- length(gasto)
 <- mean(gasto)
s  <- sd(gasto)
t_c <- qt(0.975, df = n - 1)
c( - t_c * s / sqrt(n),
   + t_c * s / sqrt(n))
IC 95%: [116.6, 149.8] media = 132.3
Parámetros de t.test()
Referencia rápida de argumentos
ArgumentoDescripción
xVector numérico de datos
ySegundo vector (2 muestras)
muValor H₀ de la media
alternative"two.sided" / "greater" / "less"
pairedTRUE para muestras pareadas
var.equalTRUE si varianzas iguales
conf.levelNivel de confianza (ej. 0.95)

res <- t.test(x)
res$statistic   # estadístico t
res$p.value     # valor-p
res$conf.int    # intervalo de confianza
res$estimate   # media(s) estimada(s)
res$parameter  # grados de libertad
2 Una Población — Proporciones
p
Prueba de Proporción — Una Muestra
H₀: p = p₀ · prueba z
prop.test()
prop.test(x,          # éxitos
          n,          # total
          p = p₀,    # H₀
          alternative = "two.sided",
          conf.level  = 0.95,
          correct     = TRUE)
# 180 de 300 pacientes adhieren al tratamiento
# H₀: p = 0.55 (referencia nacional)

prop.test(180, 300,
          p = 0.55,
          alternative = "two.sided",
          conf.level  = 0.95)
X² = 3.448, df = 1, p-value = 0.0633 IC 95%: [0.543, 0.656] prop. estimada: 0.600
Interpretación: p > 0.05 → No rechazamos H₀. La proporción no difiere significativamente de 0.55.
IC
IC para p — Una Muestra
Wilson (prop.test) · Wald · Exact Clopper-Pearson
# prop.test usa método Wilson por defecto
res <- prop.test(180, 300,
                  conf.level = 0.95)
res$conf.int  # IC Wilson
# binom.test para muestras pequeñas
binom.test(18, 30,
           p          = 0.55,
           conf.level = 0.95)
  <- 180 / 300
z  <- qnorm(0.975)
se <- sqrt( * (1 - ) / 300)
c( - z * se,  + z * se)
IC Wald 95%: [0.545, 0.655]
Usar Wilson para n > 30. Usar Clopper-Pearson para n pequeño o proporción cercana a 0 o 1.
pkg
Métodos Alternativos de IC
DescTools · binom · PropCIs
library(DescTools)

# BinomCI soporta múltiples métodos
BinomCI(180, 300,
        conf.level = 0.95,
        method = "wilson")
# method: "wald","wilson","clopper-pearson",
#         "jeffreys","agresti-coull"
MétodoUso recomendado
WilsonGeneral, n moderado-grande
Clopper-PearsonExacto, p extremas o n pequeño
Agresti-Coulln ≥ 10, buen desempeño general
JeffreysBayesiano, cobertura equilibrada
WaldSolo si np > 5 y n(1-p) > 5
3 Dos Poblaciones — Medias
F
Prueba de Levene
H₀: σ₁² = σ₂² — Paso previo obligatorio
leveneTest() · paquete car
library(car)

leveneTest(y ~ grupo,
           data   = mi_datos,
           center = "median") # más robusto
library(car)
costo  <- c(500,520,480,510,495,540,515,505,
           480,460,490,475,485,470,500,465)
hosp   <- factor(rep(c("A","B"), each=8))
datos  <- data.frame(costo, hosp)

leveneTest(costo ~ hosp,
           data   = datos,
           center = "median")
Levene's Test: F(1,14) = 1.204, p-value = 0.2905
Decisión: p = 0.29 > 0.05 → No rechazamos H₀. Varianzas iguales. Usar var.equal = TRUE en t.test().

var.test(x1, x2)  # asume normalidad estricta
Levene es más robusto ante no-normalidad que var.test(). Preferir Levene en la práctica.
t₂
t-test — Muestras Independientes
H₀: μ₁ = μ₂ · σ conocida o desconocida
t.test(x1, x2,
       alternative = "two.sided",
       var.equal   = TRUE,
       conf.level  = 0.95)
# Pooled t-test (Student)
t.test(x1, x2,
       var.equal  = FALSE,  # default
       conf.level = 0.95)
# Welch t-test (ajusta gl)
hosp_a <- c(500,520,480,510,495,540,515,505)
hosp_b <- c(480,460,490,475,485,470,500,465)

# Levene no rechazó → var.equal = TRUE
t.test(hosp_a, hosp_b,
       var.equal  = TRUE,
       conf.level = 0.95)
t = 3.682, df = 14, p-value = 0.0024 IC 95%: [12.5, 50.3] μ_A = 508.1, μ_B = 478.1
Interpretación: p = 0.002 < 0.05 → Rechazamos H₀. El costo promedio difiere entre hospitales (~$30 diferencia).
t-test Pareado + IC Diferencia
H₀: μd = 0 · antes-después
t.test(x1, x2,
       paired      = TRUE,
       alternative = "two.sided",
       conf.level  = 0.95)
# Equivale a t.test(x1-x2, mu=0)
antes  <- c(140,138,145,142,150,148,135,143)
despues <- c(132,130,138,136,142,140,128,136)

t.test(antes, despues,
       paired     = TRUE,
       conf.level = 0.95)
t = 14.64, df = 7, p-value = 2.19e-06 IC 95% de la diferencia: [6.55, 8.70] media de diferencias: 7.625
Interpretación: p < 0.001 → La intervención reduce significativamente la PA en promedio 7.6 mmHg (IC: 6.6 a 8.7).

# Se obtiene directamente de t.test()$conf.int
t.test(x1, x2)$conf.int
4 Dos Poblaciones — Proporciones
p₂
Prueba Diferencia de Proporciones
H₀: p₁ = p₂ · prueba chi²
prop.test() con vectores
prop.test(c(x1, x2),
          c(n1, n2),
          alternative = "two.sided",
          conf.level  = 0.95,
          correct     = TRUE)
# Subsidiado: 45/200 rehospitalizados
# Contributivo: 30/250 rehospitalizados

prop.test(c(45, 30),
          c(200, 250),
          alternative = "two.sided",
          conf.level  = 0.95)
X² = 6.185, df = 1, p-value = 0.0129 IC 95% de (p1-p2): [0.016, 0.133] p̂1 = 0.225, p̂2 = 0.120
Interpretación: p = 0.013 < 0.05 → La tasa de rehospitalización difiere significativamente entre regímenes. El régimen subsidiado tiene ~10.5 pp más de rehospitalización.
IC
IC para p₁ − p₂
Diferencia de proporciones
p1 <- 45/200;  p2 <- 30/250
n1 <- 200;     n2 <- 250
z  <- qnorm(0.975)
se <- sqrt(p1*(1-p1)/n1 + p2*(1-p2)/n2)
dif <- p1 - p2
c(dif - z*se, dif + z*se)
IC 95%: [0.022, 0.188]

tabla <- matrix(c(45,155,30,220),
                nrow = 2)
chisq.test(tabla, correct = FALSE)
fisher.test(tabla) # si frecuencias < 5
Usar fisher.test() cuando alguna celda esperada es < 5 (muestras pequeñas o proporciones extremas).
Árbol de Decisión
¿Qué prueba usar?
SituaciónFunción R
μ, 1 muestra, σ desconocidat.test(x, mu=μ₀)
μ₁-μ₂, var. igualest.test(x,y, var.equal=T)
μ₁-μ₂, var. desigualest.test(x,y, var.equal=F)
μd, pareadast.test(x,y, paired=T)
p, 1 muestra, n grandeprop.test(x,n,p=p₀)
p, 1 muestra, n pequeñobinom.test(x,n,p=p₀)
p₁-p₂, muestras grandesprop.test(c(x1,x2),c(n1,n2))
p₁-p₂, celdas < 5fisher.test(tabla)
σ₁² = σ₂² (normalidad)var.test(x,y)
σ₁² = σ₂² (robusto)leveneTest(y~g, data=df)
5 Hipótesis Unilateral · Supuestos · Funciones de Distribución
H₁
Pruebas Unilaterales
H₁: μ > μ₀ o H₁: μ < μ₀
t.test(x,
       mu          = 5,
       alternative = "greater")
t.test(x,
       mu          = 5,
       alternative = "less")
gasto <- c(120,145,98,160,132,155,110,140,125,138)

t.test(gasto,
       mu          = 130,
       alternative = "greater",
       conf.level  = 0.95)
t = 0.396, df = 9, p-value = 0.3514 IC 95% inferior: [119.1, Inf]
Interpretación: p = 0.35 > 0.05 → No rechazamos H₀. No hay evidencia de que el costo promedio supere USD 130.
Verificación de Normalidad
Supuesto de la prueba t · Shapiro-Wilk
shapiro.test(x)
# H₀: los datos son normales
# p > 0.05 → no rechazamos normalidad
ks.test(x, "pnorm",
        mean(x), sd(x))
qqnorm(x); qqline(x, col="red")
# Puntos sobre la línea → normalidad
dias <- c(4,6,5,7,5,6,4,8,5,6,5,4,7,5,6)
shapiro.test(dias)
W = 0.9551, p-value = 0.6057 → No se rechaza normalidad
Si se rechaza normalidad: usar prueba de Wilcoxon wilcox.test() como alternativa no paramétrica.
Φ
Funciones de Distribución en R
Cuantiles y valores críticos
# Normal estándar z
qnorm(0.975)           # z = 1.96
qnorm(0.95)            # z = 1.645

# t de Student
qt(0.975, df=14)       # t_{0.025, 14}
qt(0.95,  df=29)       # unilateral

# Chi-cuadrado
qchisq(0.95, df=1)     # χ²_crit = 3.84

# F de Fisher
qf(0.95, df1=1, df2=28)
# Bilateral desde estadístico t
2 * pt(-abs(t_stat), df=n-1)

# Unilateral derecha desde z
1 - pnorm(z_stat)

PrefijoDescripción
q___Cuantil (valor crítico)
p___Prob. acumulada (valor-p)
d___Densidad de probabilidad
r___Generación de números aleatorios
6 Flujo de Trabajo Completo — Ejemplo Integrado
Protocolo Completo: Comparación de Medias
Dos grupos independientes · Paso a paso
# ─────────────────────────────────────────────
# CONTEXTO: Comparar gasto promedio en salud
# entre beneficiarios de dos EPS
# ─────────────────────────────────────────────

# PASO 1 — Cargar datos
eps_a <- c(850,920,780,1050,890,960,810,990,870,930)
eps_b <- c(720,680,760,710,740,695,770,725,745,715)

# PASO 2 — Estadísticos descriptivos
summary(eps_a); summary(eps_b)
sd(eps_a);     sd(eps_b)

# PASO 3 — Verificar normalidad
shapiro.test(eps_a)  # p = 0.88 → normal
shapiro.test(eps_b)  # p = 0.74 → normal

# PASO 4 — Prueba de Levene (igualdad de varianzas)
library(car)
gasto <- c(eps_a, eps_b)
grupo <- factor(rep(c("A","B"), each=10))
leveneTest(gasto ~ grupo,
           center = "median")
# F = 0.53, p = 0.475 → varianzas iguales

# PASO 5 — Prueba t (Student, var.equal=TRUE)
resultado <- t.test(eps_a, eps_b,
                    var.equal  = TRUE,
                    conf.level = 0.95)

# PASO 6 — Reportar resultados
cat("t =", resultado$statistic,
    "\np =", resultado$p.value,
    "\nIC 95%:", resultado$conf.int)
t = 9.014, df = 18, p-value = 4.39e-08 IC 95%: [132.1, 215.9] μ_A = 905, μ_B = 726
Conclusión: p < 0.001. Los beneficiarios de la EPS A tienen un gasto promedio mensual entre COP 132 y COP 216 mayor que los de la EPS B (IC 95%).
Protocolo Completo: Comparación de Proporciones
Dos grupos · Tabla 2×2
# ─────────────────────────────────────────────
# CONTEXTO: ¿Difiere la cobertura de vacunación
# entre zonas urbana y rural?
# ─────────────────────────────────────────────

# Datos:
# Urbana: 320/400 vacunados  → p̂₁ = 0.80
# Rural:  210/350 vacunados  → p̂₂ = 0.60

# PASO 1 — prop.test bilateral
res <- prop.test(
  c(320, 210),
  c(400, 350),
  alternative = "two.sided",
  conf.level  = 0.95,
  correct     = TRUE
)
print(res)
X² = 37.78, df = 1, p-value = 7.93e-10 IC 95% (p1-p2): [0.136, 0.267] p̂1 = 0.80, p̂2 = 0.60
# PASO 2 — Tabla de contingencia + chi²
tab <- matrix(
  c(320, 80, 210, 140),
  nrow = 2,
  dimnames = list(
    c("Vacunado", "No vacunado"),
    c("Urbano",   "Rural")
  )
)
chisq.test(tab)

# PASO 3 — Razón de Odds (odds ratio)
library(epitools)
oddsratio(tab)  # OR + IC
X² = 38.29, df = 1, p-value < 2.2e-16 OR = 2.67 (IC 95%: 1.91, 3.73)
Conclusión: La cobertura de vacunación urbana supera a la rural en 20 pp (IC 95%: 13.6 a 26.7). Los urbanos tienen 2.67 veces más odds de estar vacunados.