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
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
##
## Cohen's d
##
## d estimate: 2.148866 (large)
## 95 percent confidence interval:
## lower upper
## 1.493929 2.803803
##
## 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
##
## 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
##
## 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
##
## 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
# 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
## 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 %
# 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))# 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
##
## Matriz de Confusión:
## 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
## Punto de corte= 0.236 Si D> 0.236 es Hombre
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)")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"
)# 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
# 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:
## 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 %
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
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):
## Probabilidad de ser Hombre: 0.997
## Clasificación: Hombre
# 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:
## 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 %
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"
)# 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 %
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:
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