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
Primero cargamos las librerías necesarias. 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
# ============================================================
# 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")
)
}
Aquí lo que hicimos fue definir las tres funciones que automatizan el cálculo de intervalos de confianza para diferentes situaciones: una media con desviación estándar poblacional ya conocida, una media con desviación estándar desconocida y también una proporción. Estas funciones permiten reducir errores en los cálculos.
#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
Primero, se carga la base de datos survey del paquete lsm y se construyen dos subconjuntos: uno con las primeras 100 observaciones y otro con las primeras 29. Se usa la función dim() para verificar el tamaño de cada conjunto. Esta función muestra el número de observaciones y variables disponibles para los análisis.
La base de datos original que usamos contiene 800 observaciones y 66 variables. Se generan dos muestras de trabajo con 100 y 29 observaciones, respectivamente. Ambas mantienen las mismas 66 variables para realizar los ejemplos del capítulo.
unique(df1$Gender)
## [1] "Female" "Male"
unique(df1$School)
## [1] "Private" "Public"
Aquí se utiliza la función unique() para identificar los valores disponibles dentro de las variables Gender y School, esto nos 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"
Luego se consultan 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.
# 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 |
Ahora se calcula un intervalo de confianza del 90% para la media de la variable Height utilizando la distribución normal Z. Aquí consideramos una desviación estándar poblacional conocida de 6. El intervalo obtenido nos 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 |
Aquí se obtiene un intervalo de confianza del 95% para la media de la variable Height utilizando la distribución t de Student. Esto se debe a que la desviación estándar poblacional es desconocida y se estima 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 |
Luego se calcula un intervalo de confianza del 95% para la proporción de estudiantes que reportan fumar dentro de la muestra seleccionada. Para ello, se identifica el número de casos positivos y el tamaño total de la muestra. Esto permite estimar el rango donde probablemente se encuentra la proporción real de fumadores en la población.
table(df1$Gender)
##
## Female Male
## 49 51
Por ultimo, se genera 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.