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.
# ============================================================
# 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.
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.
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.
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.
# 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.
# 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.
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.