Punto 1: Paquetes y datos
############################
# Punto 1: Paquetes y datos
############################
Cholula <- haven::read_sav("Cholula.sav")
# Leemos la base Cholula.sav en el objeto Cholula
str(Cholula)
## tibble [339 × 13] (S3: tbl_df/tbl/data.frame)
## $ Folio : num [1:339] 1 2 3 4 5 6 7 8 9 10 ...
## ..- attr(*, "format.spss")= chr "F8.0"
## $ CEDULA : num [1:339] 1 2 3 4 5 6 7 8 9 10 ...
## ..- attr(*, "format.spss")= chr "F4.0"
## ..- attr(*, "display_width")= int 12
## $ ORIGEN : chr [1:339] "Juvenil Cholula" "Juvenil Cholula" "Juvenil Cholula" "Juvenil Cholula" ...
## ..- attr(*, "format.spss")= chr "A34"
## ..- attr(*, "display_width")= int 34
## $ Origen2: dbl+lbl [1:339] 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, ...
## ..@ label : chr "Lugar de origen"
## ..@ format.spss: chr "F8.0"
## ..@ labels : Named num [1:6] 1 2 3 4 5 6
## .. ..- attr(*, "names")= chr [1:6] "Juvenil Cholula" "Juvenil San Nicolás de los Rancho" "Juvenil Santa Isabel Cholula" "Juvenil diversa procedencia" ...
## $ X11 : num [1:339] 1715 1701 1652 1691 1611 ...
## ..- attr(*, "label")= chr "Estatura total"
## ..- attr(*, "format.spss")= chr "F5.0"
## ..- attr(*, "display_width")= int 12
## $ X14 : num [1:339] 771 740 743 775 749 722 764 711 756 721 ...
## ..- attr(*, "label")= chr "Longitud del miembro superior"
## ..- attr(*, "format.spss")= chr "F4.0"
## ..- attr(*, "display_width")= int 12
## $ X15 : num [1:339] 318 324 322 342 320 335 329 293 321 316 ...
## ..- attr(*, "label")= chr "Longitud del brazo"
## ..- attr(*, "format.spss")= chr "F4.0"
## ..- attr(*, "display_width")= int 12
## $ X16 : num [1:339] 250 216 236 226 234 200 226 212 237 209 ...
## ..- attr(*, "label")= chr "Longitud del antebrazo"
## ..- attr(*, "format.spss")= chr "F4.0"
## ..- attr(*, "display_width")= int 12
## $ X17 : num [1:339] 203 200 185 207 195 187 209 206 198 196 ...
## ..- attr(*, "label")= chr "Longitud de la mano"
## ..- attr(*, "format.spss")= chr "F4.0"
## ..- attr(*, "display_width")= int 12
## $ X18 : num [1:339] 970 930 942 988 969 896 960 922 985 907 ...
## ..- attr(*, "label")= chr "Longitud del miembro inferior"
## ..- attr(*, "format.spss")= chr "F5.0"
## ..- attr(*, "display_width")= int 12
## $ X19 : num [1:339] 505 460 505 512 513 472 491 492 523 455 ...
## ..- attr(*, "label")= chr "Longitud del muslo"
## ..- attr(*, "format.spss")= chr "F4.0"
## ..- attr(*, "display_width")= int 12
## $ X20 : num [1:339] 378 382 355 400 363 356 383 347 381 380 ...
## ..- attr(*, "label")= chr "Longitud de la pierna"
## ..- attr(*, "format.spss")= chr "F4.0"
## ..- attr(*, "display_width")= int 12
## $ X21 : num [1:339] 260 267 255 256 242 262 259 247 271 242 ...
## ..- attr(*, "label")= chr "Longitud del pie"
## ..- attr(*, "format.spss")= chr "F4.0"
## ..- attr(*, "display_width")= int 12
# Mostramos la estructura de la base para ver tipos de variables y nombres
Punto 2: Selección de variables y matriz de correlación
##########################################################
# Punto 2: Selección de variables y matriz de correlación
##########################################################
Cholula_num <- Cholula %>%
dplyr::select(X11, X14, X15, X16, X17, X18, X19, X20, X21)
# Formamos un subconjunto con estatura (X11) y longitudes de miembros (X14–X21)
cor_matrix <- cor(Cholula_num,
use = "pairwise.complete.obs",
method = "pearson")
# Calculamos la matriz de correlaciones de Pearson entre estatura y longitudes
cor_matrix
## X11 X14 X15 X16 X17 X18 X19
## X11 1.0000000 0.8401463 0.7351209 0.6111161 0.5606026 0.8990134 0.7759657
## X14 0.8401463 1.0000000 0.8863770 0.7433535 0.6493355 0.8541076 0.7541795
## X15 0.7351209 0.8863770 1.0000000 0.4918167 0.4531205 0.7526854 0.6734044
## X16 0.6111161 0.7433535 0.4918167 1.0000000 0.2160375 0.6317514 0.5592674
## X17 0.5606026 0.6493355 0.4531205 0.2160375 1.0000000 0.5436485 0.4626479
## X18 0.8990134 0.8541076 0.7526854 0.6317514 0.5436485 1.0000000 0.9038890
## X19 0.7759657 0.7541795 0.6734044 0.5592674 0.4626479 0.9038890 1.0000000
## X20 0.8026338 0.7709947 0.6730754 0.5930300 0.4244075 0.8324711 0.5880057
## X21 0.7018212 0.6855002 0.5568904 0.4846391 0.5567604 0.6594519 0.5553377
## X20 X21
## X11 0.8026338 0.7018212
## X14 0.7709947 0.6855002
## X15 0.6730754 0.5568904
## X16 0.5930300 0.4846391
## X17 0.4244075 0.5567604
## X18 0.8324711 0.6594519
## X19 0.5880057 0.5553377
## X20 1.0000000 0.6066530
## X21 0.6066530 1.0000000
# Mostramos la matriz completa de correlaciones
round(cor_matrix, 3)
## X11 X14 X15 X16 X17 X18 X19 X20 X21
## X11 1.000 0.840 0.735 0.611 0.561 0.899 0.776 0.803 0.702
## X14 0.840 1.000 0.886 0.743 0.649 0.854 0.754 0.771 0.686
## X15 0.735 0.886 1.000 0.492 0.453 0.753 0.673 0.673 0.557
## X16 0.611 0.743 0.492 1.000 0.216 0.632 0.559 0.593 0.485
## X17 0.561 0.649 0.453 0.216 1.000 0.544 0.463 0.424 0.557
## X18 0.899 0.854 0.753 0.632 0.544 1.000 0.904 0.832 0.659
## X19 0.776 0.754 0.673 0.559 0.463 0.904 1.000 0.588 0.555
## X20 0.803 0.771 0.673 0.593 0.424 0.832 0.588 1.000 0.607
## X21 0.702 0.686 0.557 0.485 0.557 0.659 0.555 0.607 1.000
# Redondeamos la matriz de correlaciones a tres decimales para interpretarla
pairs(Cholula_num)

# Generamos una matriz de gráficos de dispersión básica entre todas las variables
Punto 3: Elección de la variable predictora de la estatura
##############################################################
# Punto 3: Elección de la variable predictora de la estatura
##############################################################
vars_interes <- c("X11", "X20")
# Definimos un vector con las variables de interés: estatura X11 y longitud de la pierna X20
cor_longitud <- sapply(Cholula[vars_interes],
function(x) cor(Cholula$X11, x,
use = "pairwise.complete.obs"))
# Calculamos la correlación de estatura con cada variable del vector de interés
cor_longitud
## X11 X20
## 1.0000000 0.8026338
# Mostramos las correlaciones para decidir qué longitud se asocia más con la estatura
Punto 4: Descriptivos de estatura (X11) y pierna (X20)
##########################################################
# Punto 4: Descriptivos de estatura (X11) y pierna (X20) #
##########################################################
res_X11 <- Cholula %>%
summarise(
n = sum(!is.na(X11)),
media = mean(X11, na.rm = TRUE),
sd = sd(X11, na.rm = TRUE)
) %>%
mutate(across(c(media, sd), ~ round(.x, 2)))
# Calculamos tamaño de muestra, media y desviación estándar de la estatura X11
res_X11
## # A tibble: 1 × 3
## n media sd
## <int> <dbl> <dbl>
## 1 339 1611. 59.3
# Mostramos el resumen descriptivo de X11
res_X20 <- Cholula %>%
summarise(
n = sum(!is.na(X20)),
media = mean(X20, na.rm = TRUE),
sd = sd(X20, na.rm = TRUE)
) %>%
mutate(across(c(media, sd), ~ round(.x, 2)))
# Calculamos tamaño de muestra, media y desviación estándar de la longitud de la pierna X20
res_X20
## # A tibble: 1 × 3
## n media sd
## <int> <dbl> <dbl>
## 1 337 350. 23.1
# Mostramos el resumen descriptivo de X20
Punto 5: Normalidad de X11 y X20 (opcional)
###############################################
# Punto 5: Normalidad de X11 y X20 (opcional)
###############################################
p_norm_X11 <- shapiro.test(Cholula$X11)$p.value
# Calculamos el p-valor de la prueba de Shapiro–Wilk para la estatura X11
p_norm_X20 <- shapiro.test(Cholula$X20)$p.value
# Calculamos el p-valor de la prueba de Shapiro–Wilk para la longitud de la pierna X20
p_norm_X11
## [1] 0.001739112
p_norm_X20
## [1] 3.535345e-07
# Mostramos los p-valores para comentar si las distribuciones se alejan de la normalidad
Punto 6: Gráfico de dispersión estatura vs longitud
###########################################################
# Punto 6: Gráfico de dispersión estatura vs longitud #
###########################################################
ggplot(Cholula, aes(x = X20, y = X11)) +
geom_point(alpha = 0.6, color = "steelblue") +
geom_smooth(method = "lm", se = FALSE, color = "red") +
labs(title = "Relación entre estatura (X11) y longitud de la pierna (X20)",
x = "Longitud de la pierna (X20)",
y = "Estatura (X11)") +
theme_minimal(base_size = 13)

# Construimos un diagrama de dispersión de estatura contra longitud de la pierna
# y superponemos la recta de regresión lineal ajustada
Punto 7: Modelo de regresión lineal simple
###############################################
# Punto 7: Modelo de regresión lineal simple #
###############################################
modelo_est <- lm(X11 ~ X20, data = Cholula)
# Ajustamos un modelo de regresión lineal donde la estatura X11 depende de la longitud de la pierna X20
modelo_est
##
## Call:
## lm(formula = X11 ~ X20, data = Cholula)
##
## Coefficients:
## (Intercept) X20
## 890.030 2.059
# Mostramos la forma general del modelo (coeficientes sin detalles)
summary(modelo_est)
##
## Call:
## lm(formula = X11 ~ X20, data = Cholula)
##
## Residuals:
## Min 1Q Median 3Q Max
## -153.19 -20.60 -0.71 20.99 105.58
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 890.0304 29.3368 30.34 <2e-16 ***
## X20 2.0589 0.0836 24.63 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 35.46 on 335 degrees of freedom
## (2 observations deleted due to missingness)
## Multiple R-squared: 0.6442, Adjusted R-squared: 0.6432
## F-statistic: 606.6 on 1 and 335 DF, p-value: < 2.2e-16
# Mostramos el resumen del modelo: intercepto, pendiente, R² y pruebas de significancia
Punto 8: Diagnóstico básico de los supuestos del modelo
##########################################################
# Punto 8: Diagnóstico básico de los supuestos del modelo
##########################################################
plot(modelo_est, which = 1)

# Graficamos residuos vs valores ajustados para revisar linealidad y homocedasticidad
plot(modelo_est, which = 2)

# Graficamos el Q-Q plot de residuos para revisar aproximación a normalidad
shapiro.test(residuals(modelo_est))
##
## Shapiro-Wilk normality test
##
## data: residuals(modelo_est)
## W = 0.98818, p-value = 0.007676
# Aplicamos Shapiro–Wilk a los residuos para evaluar normalidad de los errores
Punto 9: Ejemplo de predicción de estatura con el modelo
###########################################################
# Punto 9: Ejemplo de predicción de estatura con el modelo
###########################################################
nuevo_pierna <- data.frame(X20 = 340)
# Definimos un valor hipotético de longitud de la pierna (por ejemplo 340 mm)
pred_nueva_est <- predict(modelo_est,
newdata = nuevo_pierna,
interval = "prediction")
# Calculamos la estatura predicha y el intervalo de predicción para ese valor de longitud
pred_nueva_est
## fit lwr upr
## 1 1590.065 1520.188 1659.943
# Mostramos la estatura estimada (columna fit) y el rango de valores plausibles
# para un individuo con X20 = 340 mm (columnas lwr y upr)
Punto 10: Ecuación de la recta de regresión
##############################################
# Punto 10: Ecuación de la recta de regresión
##############################################
coef(modelo_est)
## (Intercept) X20
## 890.030381 2.058927
# Obtenemos los coeficientes del modelo: intercepto (B0) y pendiente (B1)
B0 <- coef(modelo_est)[1]
B1 <- coef(modelo_est)[2]
# Guardamos intercepto y pendiente en objetos separados para formatear la ecuación
cat("Ecuación de regresión estimada:\n",
"Estatura (X11) = ",
round(B0, 2), " + ",
round(B1, 3), " * Longitud de pierna (X20)\n")
## Ecuación de regresión estimada:
## Estatura (X11) = 890.03 + 2.059 * Longitud de pierna (X20)
# Imprimimos la ecuación final de la recta de regresión con coeficientes redondeados