1. Configuración Inicial

1.1 Directorio y Paquetes

# Defino mi directorio de trabajo
setwd("C:/Users/linda/OneDrive/Escritorio/ESTADISTICA")

# Abriendo paquete pacman
library(pacman)

# Cargar paquetes necesarios
p_load(haven, dplyr, ggplot2, MASS, effsize)

1.2 Carga de Datos

# El archivo está en formato SPSS
Hombro <- read_sav("Datos hombro.sav")

# Definimos como factor la variable sexoN
Hombro$sexoN <- factor(Hombro$sexoN,
                       levels = c(1, 2),
                       labels = c("Hombre", "Mujer"))

# Frecuencias de sexo
table(Hombro$sexoN)
## 
## Hombre  Mujer 
##     50     30

1.3 Preparación de Datos

# Omitimos los NA de la tabla
HombroS <- na.omit(Hombro[, c("sexoN", "LMCD", "C12CD")])

2. Estadística Descriptiva

2.1 Longitud Máxima de Clavícula Derecha (LMCD)

Hombro %>%
  group_by(sexoN) %>%
  summarise(
    n = sum(!is.na(LMCD)),
    media = mean(LMCD, na.rm = TRUE),
    sd = sd(LMCD, na.rm = TRUE)
  ) %>%
  mutate(across(c(media, sd), ~round(.x, 2)))
## # A tibble: 2 × 4
##   sexoN      n media    sd
##   <fct>  <int> <dbl> <dbl>
## 1 Hombre    35  151. 10.2 
## 2 Mujer     25  131.  7.56

2.2 Circunferencia de Punto Medio Clavícula Derecha (C12CD)

Hombro %>%
  group_by(sexoN) %>%
  summarise(
    n = sum(!is.na(C12CD)),
    media = mean(C12CD, na.rm = TRUE),
    sd = sd(C12CD, na.rm = TRUE)
  ) %>%
  mutate(across(c(media, sd), ~round(.x, 2)))
## # A tibble: 2 × 4
##   sexoN      n media    sd
##   <fct>  <int> <dbl> <dbl>
## 1 Hombre    46  35.9  2.33
## 2 Mujer     29  30.3  2.83

3. Visualización Exploratoria

3.1 Gráfica de Densidad - LMCD

ggplot(Hombro, aes(x = LMCD, fill = sexoN)) +
  geom_density(alpha = 0.5) +
  labs(
    title = "Gráfica 1. Longitud máxima de clavícula derecha",
    x = "Longitud máxima de clavícula derecha (mm)",
    y = "Densidad"
  ) +
  theme_minimal()

3.2 Boxplot - LMCD

ggplot(Hombro, aes(x = sexoN, y = LMCD, fill = sexoN)) +
  geom_boxplot(alpha = 0.7) +
  labs(
    title = "Longitud máxima de clavícula derecha",
    x = "Sexo",
    y = " "
  ) +
  theme_minimal()


4. Tamaño del Efecto (d de Cohen)

4.1 LMCD

cohen.d(Hombro$LMCD, Hombro$sexoN, na.rm = TRUE)
## 
## Cohen's d
## 
## d estimate: 2.148866 (large)
## 95 percent confidence interval:
##    lower    upper 
## 1.493929 2.803803

4.2 C12CD

cohen.d(Hombro$C12CD, Hombro$sexoN, na.rm = TRUE)
## 
## Cohen's d
## 
## d estimate: 2.231244 (large)
## 95 percent confidence interval:
##    lower    upper 
## 1.635303 2.827185

5. Pruebas t de Student

5.1 Comparación para LMCD

# Varianzas iguales
t.test(LMCD ~ sexoN, data = Hombro, var.equal = TRUE)
## 
##  Two Sample t-test
## 
## data:  LMCD by sexoN
## t = 8.2061, df = 58, p-value = 2.767e-11
## alternative hypothesis: true difference in means between group Hombre and group Mujer is not equal to 0
## 95 percent confidence interval:
##  14.91249 24.53489
## sample estimates:
## mean in group Hombre  mean in group Mujer 
##             151.0263             131.3026
# Varianzas diferentes (Welch)
t.test(LMCD ~ sexoN, data = Hombro, var.equal = FALSE)
## 
##  Welch Two Sample t-test
## 
## data:  LMCD by sexoN
## t = 8.6158, df = 57.876, p-value = 5.838e-12
## alternative hypothesis: true difference in means between group Hombre and group Mujer is not equal to 0
## 95 percent confidence interval:
##  15.14104 24.30633
## sample estimates:
## mean in group Hombre  mean in group Mujer 
##             151.0263             131.3026

5.2 Comparación para C12CD

# Varianzas iguales
t.test(C12CD ~ sexoN, data = Hombro, var.equal = TRUE)
## 
##  Two Sample t-test
## 
## data:  C12CD by sexoN
## t = 9.4101, df = 73, p-value = 3.183e-14
## alternative hypothesis: true difference in means between group Hombre and group Mujer is not equal to 0
## 95 percent confidence interval:
##  4.454997 6.849137
## sample estimates:
## mean in group Hombre  mean in group Mujer 
##             35.93832             30.28626
# Varianzas diferentes (Welch)
t.test(C12CD ~ sexoN, data = Hombro, var.equal = FALSE)
## 
##  Welch Two Sample t-test
## 
## data:  C12CD by sexoN
## t = 9.0054, df = 51.263, p-value = 3.866e-12
## alternative hypothesis: true difference in means between group Hombre and group Mujer is not equal to 0
## 95 percent confidence interval:
##  4.392204 6.911930
## sample estimates:
## mean in group Hombre  mean in group Mujer 
##             35.93832             30.28626

6. Análisis Discriminante Lineal (LDA)

6.1 LDA con LMCD únicamente

# Eliminar NAs de forma explícita
Hombro_sinNA <- na.omit(Hombro[, c("sexoN", "LMCD")])

# Ajustar el modelo discriminante D = a*LMCD + b
lda1 <- lda(sexoN ~ LMCD, data = Hombro_sinNA)
a <- coef(lda1)

# Predicciones
pred <- predict(lda1)
pred0 <- predict(lda1, newdata = data.frame(LMCD = 0))
b <- pred0$x

# Centroides por grupo
centroide_H <- mean(pred$x[Hombro_sinNA$sexoN == "Hombre"])
centroide_M <- mean(pred$x[Hombro_sinNA$sexoN == "Mujer"])

# Punto de corte
cutoff <- mean(c(centroide_H, centroide_M))

# Mostrar función discriminante
cat("Función discriminante: D(x) = ", round(a, 4), " * LMCD + ", round(b, 4), "\n")
## Función discriminante: D(x) =  0.1089  * LMCD +  -15.5587
cat("Punto de corte=", round(cutoff, 4), "Si D>", round(cutoff, 4), "es Hombre\n")
## Punto de corte= -0.1791 Si D> -0.1791 es Hombre
# Tabla de clasificación
tabla_clas <- table(Observado = Hombro_sinNA$sexoN,
                    Predicho = pred$class)
print(tabla_clas)
##          Predicho
## Observado Hombre Mujer
##    Hombre     32     3
##    Mujer       3    22
prop_clas <- sum(diag(tabla_clas)) / sum(tabla_clas) * 100
cat("\nEl porcentaje de clasificación correcta es ", round(prop_clas, 1), "%\n")
## 
## El porcentaje de clasificación correcta es  90 %

6.2 LDA con C12CD únicamente

# Eliminar NAs
Hombro_sinNA2 <- na.omit(Hombro[, c("sexoN", "C12CD")])

# Ajustar modelo
lda1_c12cd <- lda(sexoN ~ C12CD, data = Hombro_sinNA2)
a <- coef(lda1_c12cd)

# Predicciones
pred <- predict(lda1_c12cd)
pred0 <- predict(lda1_c12cd, newdata = data.frame(C12CD = 0))
b <- pred0$x

# Centroides
centroide_H <- mean(pred$x[Hombro_sinNA2$sexoN == "Hombre"])
centroide_M <- mean(pred$x[Hombro_sinNA2$sexoN == "Mujer"])
cutoff <- mean(c(centroide_H, centroide_M))

6.3 LDA Multivariado (LMCD + C12CD)

# Eliminar NAs
Hombro_sinNA <- na.omit(Hombro[, c("sexoN", "LMCD", "C12CD")])

# Ajustar modelo D = a1*LMCD + a2*C12CD + c
lda2 <- lda(sexoN ~ LMCD + C12CD, data = Hombro_sinNA)

# Coeficientes
a1 <- coef(lda2)[1]
a2 <- coef(lda2)[2]

print(lda2)
## Call:
## lda(sexoN ~ LMCD + C12CD, data = Hombro_sinNA)
## 
## Prior probabilities of groups:
##    Hombre     Mujer 
## 0.5833333 0.4166667 
## 
## Group means:
##            LMCD    C12CD
## Hombre 151.0263 35.77151
## Mujer  131.3026 30.31206
## 
## Coefficients of linear discriminants:
##              LD1
## LMCD  -0.0727066
## C12CD -0.2559868
# Predicciones
pred2 <- predict(lda2)

# Matriz de confusión
cat("\nMatriz de Confusión:\n")
## 
## Matriz de Confusión:
print(table(Real = Hombro_sinNA$sexoN, Predicho = pred2$class))
##         Predicho
## Real     Hombre Mujer
##   Hombre     34     1
##   Mujer       1    24
# Porcentaje de acierto
porcentaje_acierto <- mean(pred2$class == Hombro_sinNA$sexoN) * 100
cat("\nPorcentaje de acierto:", round(porcentaje_acierto, 2), "%\n")
## 
## Porcentaje de acierto: 96.67 %
# Intercepto
b <- predict(lda2, newdata = data.frame(LMCD = 0, C12CD = 0))$x

# Centroides
centroide_H <- mean(pred2$x[Hombro_sinNA$sexoN == "Hombre"])
centroide_M <- mean(pred2$x[Hombro_sinNA$sexoN == "Mujer"])
cutoff <- mean(c(centroide_H, centroide_M))

cat("\nFunción discriminante: D(x) = ", round(a1, 4), " * LMCD + ", 
    round(a2, 4), " * C12CD +", round(b, 4), "\n")
## 
## Función discriminante: D(x) =  -0.0727  * LMCD +  -0.256  * C12CD + 18.9578
cat("Punto de corte=", round(cutoff, 4), "Si D>", round(cutoff, 4), "es Hombre\n")
## Punto de corte= 0.236 Si D> 0.236 es Hombre

Gráfica de Dispersión

ggplot(Hombro_sinNA, aes(x = LMCD, y = C12CD, color = sexoN)) +
  geom_point(size = 3) +
  theme_minimal() +
  labs(title = "Discriminante lineal: LMCD vs C12CD",
       x = "LMCD (mm)",
       y = "C12CD (mm)")

Distribución sobre LD1

LD1 <- pred2$x[, 1]

ggplot(data.frame(LD1, sexoN = Hombro_sinNA$sexoN),
       aes(x = LD1, fill = sexoN)) +
  geom_density(alpha = 0.4) +
  geom_vline(xintercept = cutoff, linetype = "dashed") +
  scale_x_continuous(limits = c(-5, 5)) +
  theme_minimal() +
  labs(
    title = "Distribución sobre la función discriminante",
    x = "LD1 (puntuación discriminante)",
    y = "Densidad"
  )


7. Ejemplo de Aplicación - LDA

# Coeficientes del modelo
a1 <- -0.0727    # coeficiente LMCD
a2 <- -0.256     # coeficiente C12CD
c <- 18.9578     # intercepto
cutoff <- 0.236  # punto de corte

# Valores nuevos para clasificar
LMCD_nuevo <- 140
C12CD_nuevo <- 35

# Calcular la función discriminante
D_x <- a1 * LMCD_nuevo + a2 * C12CD_nuevo + c

cat("Valor de D(x) para LMCD=140 y C12CD=35:", round(D_x, 4), "\n")
## Valor de D(x) para LMCD=140 y C12CD=35: -0.1802
# Clasificación
if (D_x > cutoff) {
  cat("Clasificación: Hombre\n")
} else {
  cat("Clasificación: Mujer\n")
}
## Clasificación: Mujer

8. Regresión Logística

8.1 Modelo con LMCD únicamente

# Omitir datos perdidos
Hombro_sinNA <- na.omit(Hombro[, c("sexoN", "LMCD", "C12CD")])

# Ajustar modelo logístico binario
modelo1 <- glm(sexoN ~ LMCD,
               data = Hombro_sinNA,
               family = binomial(link = "logit"))

summary(modelo1)
## 
## Call:
## glm(formula = sexoN ~ LMCD, family = binomial(link = "logit"), 
##     data = Hombro_sinNA)
## 
## Coefficients:
##             Estimate Std. Error z value Pr(>|z|)    
## (Intercept) 41.72697   10.79320   3.866 0.000111 ***
## LMCD        -0.29945    0.07717  -3.880 0.000104 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 81.503  on 59  degrees of freedom
## Residual deviance: 32.430  on 58  degrees of freedom
## AIC: 36.43
## 
## Number of Fisher Scoring iterations: 6
# Probabilidades de ser "Hombre"
Hombro_sinNA$prob_Hombre2 <- predict(modelo1, type = "response")

# Clasificación usando 0.5 como punto de corte
Hombro_sinNA$predicho2 <- ifelse(Hombro_sinNA$prob_Hombre2 >= 0.5, "Hombre", "Mujer")

# Matriz de confusión
cat("\nMatriz de Confusión:\n")
## 
## Matriz de Confusión:
print(table(Real = Hombro_sinNA$sexoN, Predicho2 = Hombro_sinNA$predicho2))
##         Predicho2
## Real     Hombre Mujer
##   Hombre      3    32
##   Mujer      22     3
# Porcentaje de acierto
porcentaje <- mean(Hombro_sinNA$sexoN == Hombro_sinNA$predicho2) * 100
cat("\nPorcentaje de clasificación correcta:", round(porcentaje, 2), "%\n")
## 
## Porcentaje de clasificación correcta: 10 %

Gráfica de Probabilidades (LMCD)

ggplot(Hombro_sinNA, aes(x = prob_Hombre2, fill = sexoN)) +
  geom_density(alpha = 0.45, linewidth = 1) +
  geom_vline(xintercept = 0.5, color = "red", linetype = "dashed", linewidth = 1) +
  scale_fill_manual(values = c("Hombre" = "#1f77b4", "Mujer" = "#ff7f0e")) +
  theme_minimal(base_size = 14) +
  labs(
    title = "Distribución de las probabilidades predichas de ser Hombre",
    subtitle = "Modelo logístico con LMCD",
    x = "Probabilidad predicha: P(Hombre)",
    y = "Densidad",
    fill = "Sexo real"
  ) +
  theme(
    plot.title = element_text(face = "bold"),
    legend.position = "top"
  )

Coeficientes del Modelo

coef(modelo1)
## (Intercept)        LMCD 
##  41.7269684  -0.2994501

Ejemplo de Aplicación (LMCD = 120 mm)

# Coeficientes
coef_glm_lmcd <- coef(modelo1)

# Valor hipotético
LMCD_hipotetico_glm <- 120

# Calcular logit y probabilidad
logit_ejemplo_glm_lmcd <- coef_glm_lmcd[1] + (coef_glm_lmcd[2] * LMCD_hipotetico_glm)
prob_ejemplo_glm_lmcd <- exp(logit_ejemplo_glm_lmcd) / (1 + exp(logit_ejemplo_glm_lmcd))
clasificacion_glm_lmcd <- ifelse(prob_ejemplo_glm_lmcd >= 0.5, "Hombre", "Mujer")

cat(paste0("Ejemplo de Aplicación (LMCD=", LMCD_hipotetico_glm, " mm):\n"))
## Ejemplo de Aplicación (LMCD=120 mm):
cat("Probabilidad de ser Hombre:", round(prob_ejemplo_glm_lmcd, 4), "\n")
## Probabilidad de ser Hombre: 0.997
cat("Clasificación:", clasificacion_glm_lmcd, "\n")
## Clasificación: Hombre

Gráfica Simplificada

ggplot(Hombro_sinNA, aes(x = prob_Hombre2, fill = sexoN)) +
  geom_density(alpha = 0.4) +
  geom_vline(xintercept = 0.5, linetype = "dashed", color = "black") +
  labs(
    title = "Probabilidades Predichas de ser Hombre (LMCD)",
    x = "P(Hombre)",
    y = "Densidad"
  ) +
  theme_minimal()


8.2 Modelo con LMCD y C12CD

# Ajustar modelo logístico binario con ambas variables
modelo2 <- glm(sexoN ~ LMCD + C12CD,
               data = Hombro_sinNA,
               family = binomial(link = "logit"))

summary(modelo2)
## 
## Call:
## glm(formula = sexoN ~ LMCD + C12CD, family = binomial(link = "logit"), 
##     data = Hombro_sinNA)
## 
## Coefficients:
##             Estimate Std. Error z value Pr(>|z|)   
## (Intercept)  69.0885    22.9591   3.009  0.00262 **
## LMCD         -0.3067     0.1117  -2.747  0.00602 **
## C12CD        -0.8022     0.3405  -2.356  0.01847 * 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 81.503  on 59  degrees of freedom
## Residual deviance: 18.731  on 57  degrees of freedom
## AIC: 24.731
## 
## Number of Fisher Scoring iterations: 8
# Probabilidades de ser "Hombre"
Hombro_sinNA$prob_Hombre <- predict(modelo2, type = "response")

# Clasificación usando 0.5 como punto de corte
Hombro_sinNA$predicho <- ifelse(Hombro_sinNA$prob_Hombre >= 0.5, "Hombre", "Mujer")

# Matriz de confusión
cat("\nMatriz de Confusión:\n")
## 
## Matriz de Confusión:
print(table(Real = Hombro_sinNA$sexoN, Predicho = Hombro_sinNA$predicho))
##         Predicho
## Real     Hombre Mujer
##   Hombre      1    34
##   Mujer      24     1
# Porcentaje de acierto
porcentaje <- mean(Hombro_sinNA$sexoN == Hombro_sinNA$predicho) * 100
cat("\nPorcentaje de clasificación correcta:", round(porcentaje, 2), "%\n")
## 
## Porcentaje de clasificación correcta: 3.33 %

Gráfica de Probabilidades (Modelo Completo)

ggplot(Hombro_sinNA, aes(x = prob_Hombre, fill = sexoN)) +
  geom_density(alpha = 0.4) +
  geom_vline(xintercept = 0.5, linetype = "dashed") +
  theme_minimal() +
  labs(
    title = "Probabilidades predichas de ser Hombre",
    subtitle = "Modelo con LMCD y C12CD",
    x = "P(Hombre)",
    y = "Densidad"
  )

Coeficientes del Modelo

coef(modelo2)
## (Intercept)        LMCD       C12CD 
##  69.0884686  -0.3067252  -0.8022468

9. Ejemplo de Aplicación - Regresión Logística

# 1. Extraer coeficientes del modelo
b0 <- coef(modelo2)[1]
b1 <- coef(modelo2)[2]
b2 <- coef(modelo2)[3]

# 2. Valores específicos para clasificar
LMCD_val <- 10
C12CD_val <- 30

# 3. Calcular logit y probabilidad
logit_p <- b0 + b1 * LMCD_val + b2 * C12CD_val
probabilidad <- exp(logit_p) / (1 + exp(logit_p))

cat("Probabilidad predicha de ser Hombre =", round(probabilidad, 4), "\n")
## Probabilidad predicha de ser Hombre = 1
# 4. Clasificación según punto de corte = 0.5
clasificacion <- ifelse(probabilidad >= 0.5, "Hombre", "Mujer")
cat("Clasificación predicha =", clasificacion, "\n\n")
## Clasificación predicha = Hombre
# 5. Porcentaje de clasificación correcta del modelo completo
Hombro_sinNA$prob_Hombre <- predict(modelo2, type = "response")
Hombro_sinNA$predicho <- ifelse(Hombro_sinNA$prob_Hombre >= 0.5, "Hombre", "Mujer")

porcentaje_clasificacion <- mean(Hombro_sinNA$sexoN == Hombro_sinNA$predicho) * 100

cat("Porcentaje de clasificación correcta del modelo =",
    round(porcentaje_clasificacion, 2), "%\n")
## Porcentaje de clasificación correcta del modelo = 3.33 %

10. Resumen y Conclusiones

Este documento presenta un análisis completo de clasificación de sexo basado en medidas de la clavícula derecha tomando en cuenta la longitud máxima de clavícula y la circunferencia media:

Métodos Utilizados:

  1. Análisis Discriminante Lineal (LDA)
    • Modelo univariado con LMCD
    • Modelo univariado con C12CD
    • Modelo multivariado con LMCD + C12CD
  2. Regresión Logística
    • Modelo con LMCD
    • Modelo con LMCD + C12CD

Variables Analizadas:

  • LMCD: Longitud Máxima de Clavícula Derecha (mm)
  • C12CD: Circunferencia del Punto Medio de Clavícula Derecha (mm)
  • sexoN: Variable dependiente (Hombre/Mujer)

Interpretación:

Congujando ambas medidas en este modelo multivariado, el porcentaje de clasificación para estimación de sexo correcta es de 90 % La Función discriminante: D(x) = -0.0727 * LMCD + -0.256 *C12CD + 18.9578 con un punto de corte= 0.236 Si D> 0.236 si es Hombre. Por lo que, este modelo comprueba la viabilidad de estimar el sexo de un individuo a través de dos medidas de la clavícula derecha.


Fecha de análisis: 2025-11-30