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
# ============================================================
# 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
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
Ejericio
#Base de datos
datosCompleto <- lsm::survey
# Para algunos ejemplos de esta sección utilizaremos únicamente las primeras 98 observaciones
df3 <- datosCompleto[1:98,]
# Para otros ejemplos de esta sección utilizaremos únicamente las primeras 30 observaciones
df4 <- datosCompleto[1:30,]
# Dimensión de las dos bases de datos (observaciones, variables)
dim(datosCompleto)
## [1] 800 66
dim(df3)
## [1] 98 66
dim(df4)
## [1] 30 66
Intervalo de confianza (con Z)
# Elimina los valores perdidos (NA)
economico <- df3$Economic[!is.na(df3$Economic)]
# Recodifica: 1 = "Good", 0 = "Regular" o "Bad"
economico <- ifelse(economico == "Good", 1, 0)
# Calcula la "media" (proporción) y el tamaño de la muestra
media_economico <- mean(economico)
n_economico <- length(economico)
# Calcula el intervalo (sigma asumida/conocida, igual que en el ejemplo de Height)
resultado <- ic_media_z(
media = media_economico,
sigma = 6,
n = n_economico,
conf = 0.95
)
resultado
|
Medida
|
Valor
|
|
Media
|
0.4082
|
|
σ
|
6
|
|
Error estándar
|
0.6061
|
|
n
|
98
|
|
Grado de confianza
|
0.95
|
|
Valor crítico
|
1.96
|
|
Margen de error
|
1.1879
|
|
Extremo inferior
|
-0.7798
|
|
Extremo superior
|
1.5961
|
|
Intervalo
|
0.4082 ± 1.1879
|
Con una confianza del 95%, la proporción de estudiantes con situación
económica Good estaría entre -0.7798 y 1.5961.
Intervalo de confianza (con T)
# Elimina los valores perdidos (NA)
economico <- df3$Economic[!is.na(df3$Economic)]
# Recodifica: 1 = "Good", 0 = "Regular" o "Bad"
economico_bin <- ifelse(economico == "Good", 1, 0)
# Calcula media, desviación estándar y tamaño
media_economico <- mean(economico_bin)
s_economico <- sd(economico_bin)
n_economico <- length(economico_bin)
# Calcula el intervalo
resultado <- ic_media_t(
media = media_economico,
s = s_economico,
n = n_economico,
conf = 0.95
)
resultado
|
Medida
|
Valor
|
|
Media
|
0.4082
|
|
s
|
0.494
|
|
Error estándar
|
0.0499
|
|
n
|
98
|
|
Grados de libertad
|
97
|
|
Grado de confianza
|
0.95
|
|
Valor crítico
|
1.9847
|
|
Margen de error
|
0.099
|
|
Extremo inferior
|
0.3091
|
|
Extremo superior
|
0.5072
|
|
Intervalo
|
0.4082 ± 0.099
|
Con una confianza del 95%, la proporción de estudiantes con situación
económica Good está entre 0.3091 y 0.5072.
Proporción
# Elimina los valores perdidos (NA)
escuela <- df4$School[!is.na(df4$School)]
# Calcula número de estudiantes de escuela pública (éxitos) y tamaño total de la muestra
exitos_escuela <- sum(escuela == "Public")
n_escuela <- length(escuela)
# Calcula el intervalo
resultado <- ic_proporcion(
exitos = exitos_escuela,
n = n_escuela,
conf = 0.95
)
resultado
|
Medida
|
Valor
|
|
Éxitos
|
15
|
|
n
|
30
|
|
Proporción
|
0.5
|
|
Error estándar
|
0.0913
|
|
Grado de confianza
|
0.95
|
|
Valor crítico
|
1.96
|
|
Margen de error
|
0.1789
|
|
Extremo inferior
|
0.3211
|
|
Extremo superior
|
0.6789
|
|
Intervalo
|
0.5 ± 0.1789
|
Con una confianza del 95%, la proporción de estudiantes de escuela
pública está entre 0.3211 y 0.6789.