#Paquetes

library(lsm)        # Para acceder a la base de datos survey
library(knitr)      # Para construir tablas
library(kableExtra) # Para mejorar la presentación de las tablas

Funciones para intervalos de confianza

Este script define tres funciones en R (ic_media_z, ic_media_t, ic_proporcion) que calculan intervalos de confianza para una media (con σ conocida o desconocida) y para una proporción, mostrando los resultados en tablas

# ============================================================
# 1. Intervalo Z para una media con sigma conocida
# ============================================================

ic_media_z <- function(media, sigma, n, conf = 0.95,
                       digitos = 4) {
  
  alpha <- 1 - conf
  z <- qnorm(1 - alpha / 2)
  error_estandar <- sigma / sqrt(n)
  margen_error <- z * error_estandar
  
  inferior <- media - margen_error
  superior <- media + margen_error
  
  resultado <- data.frame(
    Medida = c(
      "Media",
      "\u03c3",
      "Error estándar",
      "n",
      "Grado de confianza",
      "Valor crítico",
      "Margen de error",
      "Extremo inferior",
      "Extremo superior",
      "Intervalo"
    ),
    
    Resultado = c(
      round(media, digitos),
      round(sigma, digitos),
      round(error_estandar, digitos),
      n,
      round(conf, digitos),
      round(z, digitos),
      round(margen_error, digitos),
      round(inferior, digitos),
      round(superior, digitos),
      paste0(
        round(media, digitos),
        " ± ",
        round(margen_error, digitos)
      )
    ),
    
    check.names = FALSE
  )
  
  knitr::kable(
    resultado,
    format = "html",
    col.names = c("Medida", "Valor"),
    align = c("l", "r")
  )
}

# ============================================================
# 2. Intervalo t para una media con sigma desconocida
# ============================================================

ic_media_t <- function(media, s, n, conf = 0.95,
                       digitos = 4) {
  
  alpha <- 1 - conf
  gl <- n - 1
  t_critico <- qt(1 - alpha / 2, df = gl)
  error_estandar <- s / sqrt(n)
  margen_error <- t_critico * error_estandar
  
  inferior <- media - margen_error
  superior <- media + margen_error
  
  resultado <- data.frame(
    Medida = c(
      "Media",
      "s",
      "Error estándar",
      "n",
      "Grados de libertad",
      "Grado de confianza",
      "Valor crítico",
      "Margen de error",
      "Extremo inferior",
      "Extremo superior",
      "Intervalo"
    ),
    
    Resultado = c(
      round(media, digitos),
      round(s, digitos),
      round(error_estandar, digitos),
      n,
      gl,
      round(conf, digitos),
      round(t_critico, digitos),
      round(margen_error, digitos),
      round(inferior, digitos),
      round(superior, digitos),
      paste0(
        round(media, digitos),
        " ± ",
        round(margen_error, digitos)
      )
    ),
    
    check.names = FALSE
  )
  
  knitr::kable(
    resultado,
    format = "html",
    col.names = c("Medida", "Valor"),
    align = c("l", "r")
  )
}


# ============================================================
# 3. Intervalo Z para una proporción
# ============================================================

ic_proporcion <- function(exitos, n, conf = 0.95,
                          digitos = 4) {
  
  if (exitos < 0 || exitos > n) {
    stop("El número de éxitos debe estar entre 0 y n.")
  }
  
  alpha <- 1 - conf
  z <- qnorm(1 - alpha / 2)
  
  proporcion <- exitos / n
  error_estandar <- sqrt(proporcion * (1 - proporcion) / n)
  margen_error <- z * error_estandar
  
  inferior <- max(0, proporcion - margen_error)
  superior <- min(1, proporcion + margen_error)
  
  resultado <- data.frame(
    Medida = c(
      "Éxitos",
      "n",
      "Proporción",
      "Error estándar",
      "Grado de confianza",
      "Valor crítico",
      "Margen de error",
      "Extremo inferior",
      "Extremo superior",
      "Intervalo"
    ),
    
    Resultado = c(
      exitos,
      n,
      round(proporcion, digitos),
      round(error_estandar, digitos),
      round(conf, digitos),
      round(z, digitos),
      round(margen_error, digitos),
      round(inferior, digitos),
      round(superior, digitos),
      paste0(
        round(proporcion, digitos),
        " ± ",
        round(margen_error, digitos)
      )
    ),
    
    check.names = FALSE
  )
  
  knitr::kable(
    resultado,
    format = "html",
    col.names = c("Medida", "Valor"),
    align = c("l", "r")
  )
}

#Base de Datos

#Base de datos
datosCompleto <- lsm::survey

# Para algunos ejemplos de esta sección utilizaremos únicamente las primeras 100 observaciones
df1 <- datosCompleto[1:100,]

# Para otros ejemplos de esta sección utilizaremos únicamente las primeras 29 observaciones
df2 <- datosCompleto[1:29,]

# Dimensión de las dos bases de datos (observaciones, variables)
dim(datosCompleto)
## [1] 800  66
dim(df1)
## [1] 100  66
dim(df2)
## [1] 29 66

Verificación de datos

unique(df1$Height)
##  [1] 1.58 1.60 1.50 1.53 1.78 1.65 1.73 1.64 1.52 1.70 1.59 1.56 1.55 1.75 1.82
## [16] 1.62 1.80 1.86 1.77 1.68 1.57 1.63 1.61 1.66 1.71 1.67 1.69 1.72 1.74 1.76
## [31] 1.79 1.81 1.83 1.84 1.85 1.87 1.88
unique(df1$Smoke)
## [1] "No"  "Yes"

Intervalo para la media con T de Altura

Este código calcula un intervalo de confianza del 95% para la altura media de una muestra: primero elimina los valores faltantes (NA) de la columna Height, luego calcula la media y el tamaño de la muestra, y finalmente usa la función ic_media_z() para generar el intervalo de confianza.

# Elimina los valores perdidos (NA)
altura <- df1$Height[!is.na(df1$Height)] 

# Calcula media y tamaño
media_altura <- mean(altura)
n_altura <- length(altura)

# Calcula el intervalo
resultado <- ic_media_z(
  media = media_altura,
  sigma = 6,
  n = n_altura,
  conf = 0.95
)

resultado
Medida Valor
Media 1.6738
σ 6
Error estándar 0.6
n 100
Grado de confianza 0.95
Valor crítico 1.96
Margen de error 1.176
Extremo inferior 0.4978
Extremo superior 2.8498
Intervalo 1.6738 ± 1.176

Intervalo de confianza para Fuma

Este código calcula un intervalo de confianza del 95% para la proporción de estudiantes fumadores: elimina los valores faltantes (NA) de la columna Smoke, cuenta cuántos estudiantes tienen el valor “Smoke” (éxitos) y el total de la muestra, y usa ic_proporcion() para generar el intervalo de confianza de esa proporción.

# Elimina los valores perdidos (NA)
Fuma <- df1$Smoke[!is.na(df1$Smoke)]

# Calcula número de estudiantes de género Female (éxitos) y tamaño total de la muestra.
total_fuma <- sum(Fuma == "Smoke")
n_fuma <- length(Fuma)

# Calcula el intervalo
resultado <- ic_proporcion(

  exitos = total_fuma,
  n = n_fuma,
  conf = 0.95
)

resultado
Medida Valor
Éxitos 0
n 100
Proporción 0
Error estándar 0
Grado de confianza 0.95
Valor crítico 1.96
Margen de error 0
Extremo inferior 0
Extremo superior 0
Intervalo 0 ± 0