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