El presente informe aplica diversas técnicas de análisis multivariado (Análisis Discriminante Lineal y Regresión Logística) sobre la base de datos antropométrica del hombro (Datos hombro.sav), utilizando las variables Longitud Máxima de la Clavícula Derecha (\(\text{LMCD}\)) y Circunferencia en el Punto Medio de la Clavícula Derecha (\(\text{C12CD}\)) con el objetivo de evaluar su capacidad para la determinación del sexo.
Se evalúa la existencia de diferencias estadísticamente significativas entre hombres y mujeres para las variables \(\text{LMCD}\) y \(\text{C12CD}\), seleccionando la prueba adecuada según el supuesto de normalidad (Prueba de Shapiro-Wilk).
# Función para realizar Shapiro-Wilk y elegir la prueba de comparación
comparar_por_sexo <- function(data, variable) {
grupo_H <- data[[variable]][data$sexoN == "Hombre"]
grupo_M <- data[[variable]][data$sexoN == "Mujer"]
# Shapiro-Wilk test for normality
p_norm_H <- shapiro.test(grupo_H)$p.value
p_norm_M <- shapiro.test(grupo_M)$p.value
# Seleccionar prueba
if (p_norm_H > 0.05 & p_norm_M > 0.05) {
# Paramétrico: t-test (asumiendo varianzas iguales por simplicidad)
test <- t.test(data[[variable]] ~ data$sexoN, var.equal = TRUE)
prueba_usada <- "t de Student"
} else {
# No paramétrico: U de Mann-Whitney (wilcox.test)
test <- wilcox.test(data[[variable]] ~ data$sexoN)
prueba_usada <- "U de Mann-Whitney"
}
resultados <- data.frame(
Variable = variable,
Media_Hombre = mean(grupo_H, na.rm = TRUE),
Media_Mujer = mean(grupo_M, na.rm = TRUE),
p_Shapiro_Hombre = p_norm_H,
p_Shapiro_Mujer = p_norm_M,
Prueba_Usada = prueba_usada,
p_Valor = test$p.value
)
return(resultados)
}
# Aplicar a LMCD y C12CD
res_lmcd <- comparar_por_sexo(Hombro_sinNA_LMCD_C12CD, "LMCD")
res_c12cd <- comparar_por_sexo(Hombro_sinNA_LMCD_C12CD, "C12CD")
# Combinar y mostrar resultados
tabla_comparacion <- bind_rows(res_lmcd, res_c12cd)
print(round(tabla_comparacion, 4))
Interpretación: Se debe interpretar si los valores p de las pruebas de comparación son menores a \(\alpha = 0.05\). Si lo son, se rechaza la hipótesis nula (\(\text{H}_{0}\)) de que no existen diferencias por sexo y se concluye que la media de la variable es significativamente diferente entre hombres y mujeres.
Conclusión clave: Se espera rechazar la hipótesis nula (\(\text{H}_{0}\))5, lo que confirma que las medias de \(\text{LMCD}\) y \(\text{C12CD}\) son significativamente diferentes entre hombres y mujeres, validando su uso en los modelos de determinación sexual.
Se ajusta un modelo de Análisis Discriminante Lineal (\(\text{LDA}\)) para clasificar el sexo utilizando únicamente la variable \(\text{LMCD}\).
# Ajustar el modelo LDA
lda_lmcd <- lda(sexoN ~ LMCD, data = Hombro_sinNA_LMCD_C12CD)
# Extraer coeficientes y constante (b)
a_lmcd <- coef(lda_lmcd)
pred0_lmcd <- predict(lda_lmcd, newdata = data.frame(LMCD = 0))
b_lmcd <- pred0_lmcd$x
# Predicciones y punto de corte (Cutoff)
pred_lmcd <- predict(lda_lmcd)
centroide_H_lmcd <- mean(pred_lmcd$x[Hombro_sinNA_LMCD_C12CD$sexoN == "Hombre"])
centroide_M_lmcd <- mean(pred_lmcd$x[Hombro_sinNA_LMCD_C12CD$sexoN == "Mujer"])
cutoff_lmcd <- mean(c(centroide_H_lmcd, centroide_M_lmcd))
# Tabla de clasificación y precisión
tabla_clas_lmcd <- table(Observado = Hombro_sinNA_LMCD_C12CD$sexoN, Predicho = pred_lmcd$class)
prop_clas_lmcd <- sum(diag(tabla_clas_lmcd)) / sum(tabla_clas_lmcd) * 100
# --- Resultados Textuales ---
cat("\n**Modelo Discriminante con LMCD**\n")
cat(paste0("Función discriminante: D(x) = ", round(a_lmcd[1], 4), " * LMCD + ", round(b_lmcd[1], 4), "\n"))
cat(paste0("Punto de corte: ", round(cutoff_lmcd[1], 4), ". Si D > ", round(cutoff_lmcd[1], 4), " se clasifica como Hombre.\n\n"))
cat("\n**Tabla de Clasificación**\n")
print(tabla_clas_lmcd)
cat(paste0("\n**Porcentaje de clasificación correcta:** ", round(prop_clas_lmcd, 2), "%\n\n"))
# Ejemplo de aplicación (LMCD hipotético, e.g., 150)
LMCD_hipotetico <- 150
D_ejemplo_lmcd <- (a_lmcd[1] * LMCD_hipotetico) + b_lmcd[1]
clasificacion_lmcd <- ifelse(D_ejemplo_lmcd > cutoff_lmcd, "Hombre", "Mujer")
cat(paste0("**Ejemplo de Aplicación** (LMCD=", LMCD_hipotetico, " mm):\n"))
cat(paste0("D = ", round(D_ejemplo_lmcd, 4), ". Clasificación: ", clasificacion_lmcd, "\n"))
# Crea el dataframe para el gráfico (Necesario para el siguiente chunk)
data_scores_lmcd <- data.frame(D_score = pred_lmcd$x, sexoN = Hombro_sinNA_LMCD_C12CD$sexoN)
# Gráfico para LDA (histograma de puntuaciones con corte)
ggplot(data_scores_lmcd, aes(x = D_score, fill = sexoN)) +
geom_density(alpha = 0.4) +
geom_vline(xintercept = cutoff_lmcd, linetype = "dashed", color = "black") +
labs(title = "Distribución de Puntuaciones Discriminantes (LMCD)",
x = "Puntuación Discriminante (D)",
y = "Densidad") +
theme_minimal()
Conclusión clave: El modelo multifactorial \((\text{LMCD} + \text{C12CD})\) debe ofrecer un mayor porcentaje de clasificación correcta que el modelo unifactorial, demostrando el valor predictivo conjunto de la longitud y la robustez de la clavícula.
Se ajusta un modelo \(\text{LDA}\) para clasificar el sexo utilizando las dos variables \(\text{LMCD}\) y \(\text{C12CD}\) simultáneamente.
# Ajustar el modelo LDA
lda_lmcd_c12cd <- lda(sexoN ~ LMCD + C12CD, data = Hombro_sinNA_LMCD_C12CD)
# Extraer coeficientes y constante (b)
a_lmcd_c12cd <- coef(lda_lmcd_c12cd)
pred0_lmcd_c12cd <- predict(lda_lmcd_c12cd, newdata = data.frame(LMCD = 0, C12CD = 0))
b_lmcd_c12cd <- pred0_lmcd_c12cd$x
# Predicciones y punto de corte
pred_lmcd_c12cd <- predict(lda_lmcd_c12cd)
centroide_H_lmcd_c12cd <- mean(pred_lmcd_c12cd$x[Hombro_sinNA_LMCD_C12CD$sexoN == "Hombre"])
centroide_M_lmcd_c12cd <- mean(pred_lmcd_c12cd$x[Hombro_sinNA_LMCD_C12CD$sexoN == "Mujer"])
cutoff_lmcd_c12cd <- mean(c(centroide_H_lmcd_c12cd, centroide_M_lmcd_c12cd))
# Tabla de clasificación y precisión
tabla_clas_lmcd_c12cd <- table(Observado = Hombro_sinNA_LMCD_C12CD$sexoN, Predicho = pred_lmcd_c12cd$class)
prop_clas_lmcd_c12cd <- sum(diag(tabla_clas_lmcd_c12cd)) / sum(tabla_clas_lmcd_c12cd) * 100
# --- Resultados ---
cat("\n**Modelo Discriminante con LMCD y C12CD**\n")
cat(paste0("Función discriminante: D(x) = ", round(a_lmcd_c12cd[1, 1], 4), " * LMCD + ", round(a_lmcd_c12cd[1, 2], 4), " * C12CD + ", round(b_lmcd_c12cd[1], 4), "\n"))
cat(paste0("Punto de corte: ", round(cutoff_lmcd_c12cd[1], 4), ". Si D > ", round(cutoff_lmcd_c12cd[1], 4), " se clasifica como Hombre.\n\n"))
cat("\n**Tabla de Clasificación**\n")
print(tabla_clas_lmcd_c12cd)
cat(paste0("\n**Porcentaje de clasificación correcta:** ", round(prop_clas_lmcd_c12cd, 2), "%\n\n"))
# Ejemplo de aplicación (hipotético: LMCD=150, C12CD=28)
LMCD_h <- 150
C12CD_h <- 28
D_ejemplo_multiple <- (a_lmcd_c12cd[1, 1] * LMCD_h) + (a_lmcd_c12cd[1, 2] * C12CD_h) + b_lmcd_c12cd[1]
clasificacion_multiple <- ifelse(D_ejemplo_multiple > cutoff_lmcd_c12cd, "Hombre", "Mujer")
cat(paste0("**Ejemplo de Aplicación** (LMCD=", LMCD_h, " mm, C12CD=", C12CD_h, " mm):\n"))
cat(paste0("D = ", round(D_ejemplo_multiple, 4), ". Clasificación: ", clasificacion_multiple, "\n"))
# Gráfico para LDA (histograma de puntuaciones con corte)
data_scores_lmcd_c12cd <- data.frame(D_score = pred_lmcd_c12cd$x, sexoN = Hombro_sinNA_LMCD_C12CD$sexoN)
ggplot(data_scores_lmcd_c12cd, aes(x = D_score, fill = sexoN)) +
geom_density(alpha = 0.4) +
geom_vline(xintercept = cutoff_lmcd_c12cd, linetype = "dashed", color = "black") +
labs(title = "Distribución de Puntuaciones Discriminantes (LMCD y C12CD)",
x = "Puntuación Discriminante (D)",
y = "Densidad") +
theme_minimal()
Se ajusta un modelo de Regresión Logística (\(\text{GLM}\)) para estimar la probabilidad de ser hombre en función de \(\text{LMCD}\).
# Ajustar el modelo logístico
glm_lmcd <- glm(sexoN ~ LMCD,
data = Hombro_sinNA_LMCD_C12CD,
family = binomial(link = "logit"))
# Coeficientes
coef_glm_lmcd <- coef(glm_lmcd)
# Predicciones y clasificación
Hombro_sinNA_LMCD_C12CD$prob_Hombre_glm_lmcd <- predict(glm_lmcd, type = "response")
Hombro_sinNA_LMCD_C12CD$predicho_glm_lmcd <-
ifelse(Hombro_sinNA_LMCD_C12CD$prob_Hombre_glm_lmcd >= 0.5, "Hombre", "Mujer")
# Tabla de clasificación y precisión
tabla_clas_glm_lmcd <- table(Real = Hombro_sinNA_LMCD_C12CD$sexoN,
Predicho = Hombro_sinNA_LMCD_C12CD$predicho_glm_lmcd)
prop_clas_glm_lmcd <- mean(Hombro_sinNA_LMCD_C12CD$sexoN == Hombro_sinNA_LMCD_C12CD$predicho_glm_lmcd) * 100
# --- Resultados ---
cat("\n**Modelo Logístico con LMCD**\n")
cat(paste0("Ecuación Logística: logit(p) = ", round(coef_glm_lmcd[1], 4), " + ",
round(coef_glm_lmcd[2], 4), " * LMCD\n\n"))
cat("\n**Resumen del Modelo**\n")
print(summary(glm_lmcd))
cat("\n**Tabla de Clasificación (Punto de corte p=0.5)**\n")
print(tabla_clas_glm_lmcd)
cat(paste0("\n**Porcentaje de clasificación correcta:** ", round(prop_clas_glm_lmcd, 2), "%\n\n"))
# Ejemplo de aplicación (LMCD hipotético, e.g., 140)
LMCD_hipotetico_glm <- 140
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"))
cat(paste0("logit(p) = ", round(logit_ejemplo_glm_lmcd, 4), ". P(Hombre) = ", round(prob_ejemplo_glm_lmcd, 4), " (", round(prob_ejemplo_glm_lmcd * 100, 2), "%). Clasificación: ", clasificacion_glm_lmcd, "\n"))
# Gráfico de densidades
ggplot(Hombro_sinNA_LMCD_C12CD, aes(x = prob_Hombre_glm_lmcd, 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()
Conclusión clave: Los modelos \(\text{GLM}\) proveen una estimación de probabilidad, lo que es útil en casos forenses. El modelo que combina ambas variables debe ser el más preciso.
Se ajusta un modelo de Regresión Logística (\(\text{GLM}\)) utilizando las dos variables \(\text{LMCD}\) y \(\text{C12CD}\).
# Ajustar el modelo logístico
glm_lmcd_c12cd <- glm(sexoN ~ LMCD + C12CD,
data = Hombro_sinNA_LMCD_C12CD,
family = binomial(link = "logit"))
# Coeficientes
coef_glm_lmcd_c12cd <- coef(glm_lmcd_c12cd)
# Predicciones y clasificación
Hombro_sinNA_LMCD_C12CD$prob_Hombre_glm_lmcd_c12cd <- predict(glm_lmcd_c12cd, type = "response")
Hombro_sinNA_LMCD_C12CD$predicho_glm_lmcd_c12cd <-
ifelse(Hombro_sinNA_LMCD_C12CD$prob_Hombre_glm_lmcd_c12cd >= 0.5, "Hombre", "Mujer")
# Tabla de clasificación y precisión
tabla_clas_glm_lmcd_c12cd <- table(Real = Hombro_sinNA_LMCD_C12CD$sexoN,
Predicho = Hombro_sinNA_LMCD_C12CD$predicho_glm_lmcd_c12cd)
prop_clas_glm_lmcd_c12cd <- mean(Hombro_sinNA_LMCD_C12CD$sexoN == Hombro_sinNA_LMCD_C12CD$predicho_glm_lmcd_c12cd) * 100
# --- Resultados ---
cat("\n**Modelo Logístico con LMCD y C12CD**\n")
cat(paste0("Ecuación Logística: logit(p) = ", round(coef_glm_lmcd_c12cd[1], 4), " + ",
round(coef_glm_lmcd_c12cd[2], 4), " * LMCD + ",
round(coef_glm_lmcd_c12cd[3], 4), " * C12CD\n\n"))
cat("\n**Resumen del Modelo**\n")
print(summary(glm_lmcd_c12cd))
cat("\n**Tabla de Clasificación (Punto de corte p=0.5)**\n")
print(tabla_clas_glm_lmcd_c12cd)
cat(paste0("\n**Porcentaje de clasificación correcta:** ", round(prop_clas_glm_lmcd_c12cd, 2), "%\n\n"))
# Ejemplo de aplicación (hipotético: LMCD=150, C12CD=28)
LMCD_h_glm <- 150
C12CD_h_glm <- 28
logit_ejemplo_glm_multiple <- coef_glm_lmcd_c12cd[1] + (coef_glm_lmcd_c12cd[2] * LMCD_h_glm) + (coef_glm_lmcd_c12cd[3] * C12CD_h_glm)
prob_ejemplo_glm_multiple <- exp(logit_ejemplo_glm_multiple) / (1 + exp(logit_ejemplo_glm_multiple))
clasificacion_glm_multiple <- ifelse(prob_ejemplo_glm_multiple >= 0.5, "Hombre", "Mujer")
cat(paste0("**Ejemplo de Aplicación** (LMCD=", LMCD_h_glm, " mm, C12CD=", C12CD_h_glm, " mm):\n"))
cat(paste0("logit(p) = ", round(logit_ejemplo_glm_multiple, 4), ". P(Hombre) = ", round(prob_ejemplo_glm_multiple, 4), " (", round(prob_ejemplo_glm_multiple * 100, 2), "%). Clasificación: ", clasificacion_glm_multiple, "\n"))
# Gráfico de densidades
ggplot(Hombro_sinNA_LMCD_C12CD, aes(x = prob_Hombre_glm_lmcd_c12cd, fill = sexoN)) +
geom_density(alpha = 0.4) +
geom_vline(xintercept = 0.5, linetype = "dashed", color = "black") +
labs(title = "Probabilidades Predichas de ser Hombre (LMCD y C12CD)",
x = "P(Hombre)",
y = "Densidad") +
theme_minimal()
#INTERPRETACIÓN