Carga de 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

Se cargan las librerías necesarias para el desarrollo de la actividad. El paquete lsm proporciona la base de datos survey, mientras que knitr y kableExtra permiten presentar los resultados en tablas con un formato más organizado y legible.

Funciones para intervalos de confianza

# ============================================================
# 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")
  )
}

Se definieron tres funciones que automatizan el cálculo de intervalos de confianza para diferentes situaciones: una media con desviación estándar poblacional conocida, una media con desviación estándar desconocida y una proporción. Estas funciones permiten obtener los resultados de manera uniforme y reducir errores en los cálculos.

Base de datos

Debajo del código donde cargas la 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

Se cargó la base de datos survey del paquete lsm y se construyeron dos subconjuntos de datos: uno con las primeras 100 observaciones y otro con las primeras 29. Posteriormente, se verificó el tamaño de cada conjunto mediante la función dim(), la cual muestra el número de observaciones y variables disponibles para los análisis.

La base de datos original contiene 800 observaciones y 66 variables. Además, se generaron dos muestras de trabajo con 100 y 29 observaciones, respectivamente, manteniendo las mismas 66 variables para realizar los ejemplos del capítulo.

Verificacion de datos

unique(df1$Gender)
## [1] "Female" "Male"
unique(df1$School)
## [1] "Private" "Public"

Se utilizaron las funciones unique() para identificar los valores disponibles dentro de las variables Gender y School. Esto permite verificar las categorías presentes en la base de datos antes de realizar los análisis estadísticos.

Nombres de variables

names(datosCompleto)
##  [1] "Observation"  "ID"           "Gender"       "Like"         "Age"         
##  [6] "Smoke"        "Height"       "Weight"       "BMI"          "School"      
## [11] "SES"          "Enrollment"   "Score"        "MotherHeight" "MotherAge"   
## [16] "MotherCHD"    "FatherHeight" "FatherAge"    "FatherCHD"    "Status"      
## [21] "SemAcum"      "Exam1"        "Exam2"        "Exam3"        "Exam4"       
## [26] "ExamAcum"     "Definitive"   "Expense"      "Income"       "Gas"         
## [31] "Course"       "Law"          "Economic"     "Race"         "Region"      
## [36] "EMO1"         "EMO2"         "EMO3"         "EMO4"         "EMO5"        
## [41] "GOAL1"        "GOAL2"        "GOAL3"        "Pre_STAT1"    "Pre_STAT2"   
## [46] "Pre_STAT3"    "Pre_STAT4"    "Post_STAT1"   "Post_STAT2"   "Post_STAT3"  
## [51] "Post_STAT4"   "Pre_IDARE1"   "Pre_IDARE2"   "Pre_IDARE3"   "Pre_IDARE4"  
## [56] "Pre_IDARE5"   "Post_IDARE1"  "Post_IDARE2"  "Post_IDARE3"  "Post_IDARE4" 
## [61] "Post_IDARE5"  "PSICO1"       "PSICO2"       "PSICO3"       "PSICO4"      
## [66] "PSICO5"

Se consultaron los nombres de las variables disponibles en la base de datos completa mediante la función names(). Esto permite conocer la estructura de la información y seleccionar las variables necesarias para los cálculos posteriores.

#Intervalo para la media (con Z)

# 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.90
)

resultado
Medida Valor
Media 1.6738
σ 6
Error estándar 0.6
n 100
Grado de confianza 0.9
Valor crítico 1.6449
Margen de error 0.9869
Extremo inferior 0.6869
Extremo superior 2.6607
Intervalo 1.6738 ± 0.9869

Se calculó un intervalo de confianza del 90% para la media de la variable Height utilizando la distribución normal Z, considerando una desviación estándar poblacional conocida de 6. El intervalo obtenido permite estimar el rango en el que probablemente se encuentra la verdadera media poblacional de la altura.

Intervalo para la media (con t)

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

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

# Calcula el intervalo
resultado <- ic_media_t(
  media = media_altura,
  s = s_altura,
  n = n_altura,
  conf = 0.95
)

resultado
Medida Valor
Media 1.6621
s 0.1061
Error estándar 0.0197
n 29
Grados de libertad 28
Grado de confianza 0.95
Valor crítico 2.0484
Margen de error 0.0404
Extremo inferior 1.6217
Extremo superior 1.7024
Intervalo 1.6621 ± 0.0404

Se obtuvo un intervalo de confianza del 95% para la media de la variable Height utilizando la distribución t de Student, debido a que la desviación estándar poblacional es desconocida y fue estimada mediante la desviación estándar de la muestra. El intervalo representa el rango donde se espera encontrar la media verdadera de la población.

Intervalo para una 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

Se calculó un intervalo de confianza del 95% para la proporción de estudiantes que reportan fumar dentro de la muestra seleccionada. Para ello, se identificó el número de casos positivos y el tamaño total de la muestra, permitiendo estimar el rango donde probablemente se encuentra la proporción real de fumadores en la población.

Tabla de genero

table(df1$Gender)
## 
## Female   Male 
##     49     51

Se generó una tabla de frecuencias para la variable Gender, con el objetivo de observar la distribución de los estudiantes según su género dentro de la muestra utilizada. Esta información permite conocer la composición de la muestra antes de realizar análisis posteriores.