En esta practica se realizara comparaciones, construcciones de funcion discriminante, ajustes de modelos logisticos y aplicacion para valores hipoteticos con dos varialbes.
setwd("~/Blanca")
##Abriendo paquete pacman
library(pacman)
## El archivo esta en formato SPSS, lo abrimos mediante la libreria haven
p_load(haven,dplyr,ggplot2,MASS)
p_load(tinytex)
Hombro <- read_sav("Datos hombro.sav")
## Definimos como factor la variable sexoN
Hombro$sexoN <- factor(Hombro$sexoN,
levels = c(2, 1),
labels = c("Mujer", "Hombre"))
table (Hombro$sexoN) ## Frecuencias de sexo
##
## Mujer Hombre
## 30 50
Podemos observar que la muestra consta de 80 individuos de los cuales 50 son hombres y 30 mujeres
Empezemos con la estadistica descriptiva, para resumir por sexo la información de Longitud Máxima de la clavicula derecho
res_lmcd <- Hombro %>%
group_by(sexoN) %>%
summarise(
n = sum(!is.na(LMCD)),
media = mean(LMCD, na.rm = TRUE),
sd = sd(LMHD, na.rm = TRUE)
) %>%
mutate(across(c(media, sd), ~round(.x, 2)))
res_lmcd
## # A tibble: 2 × 4
## sexoN n media sd
## <fct> <int> <dbl> <dbl>
## 1 Mujer 25 131. 15.7
## 2 Hombre 35 151. 13.9
De la tabla anterior se muestra diferencias significativas entre hombres y mujeres, en las que se observan numeros ligeramente menores que el total debido a datos faltantes, con 25 mujeres y 35 hombres, donde la media en mujeres es aproximadamente de 131 mm, mientras que en hombres es de 151 mm,por lo que podemos analizar que los hombres presentan claviculas mas largas.La desviacion estandar es muy similar en ambos grupos, lo cual indica en la tabla un marcado diformismo sexual en el tamaño de la clavicula.
Ahora veremos el caso de la circunferencia del punto medio de la clavicula derecho
res_cmcd <- 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)))
res_cmcd
## # A tibble: 2 × 4
## sexoN n media sd
## <fct> <int> <dbl> <dbl>
## 1 Mujer 29 30.3 2.83
## 2 Hombre 46 35.9 2.33
Observamos que en este caso se incluyen 29 mujeres y 46 hombres, en la que la media de las mujeres es de 30.3 mm y en hombres es de 35.6 mm, mostrando que los hombres tienen valores mas grandes.Asimismo podemos observar que la desviacion es mas baja en hombres,lo que podria confirmar que la circunferencia clavicular presenta diformismo sexual evidentemente marcado.
Realizaremos una gráfica comparativa de Longitud máxima del húmero derecho por Sexo
ggplot(Hombro, aes(x = LMCD, fill = sexoN)) +
geom_density(alpha = 0.5) +
labs(
title = "Gráfica 1. Longitud máxima de la clavicula derecho por sexo",
x = "Longitud máxima de la clavicula derecho (mm)",
y = "Densidad"
) +
theme_minimal()
## Warning: Removed 20 rows containing non-finite outside the scale range
## (`stat_density()`).
Otra gráfica, ahora de caja.
ggplot(Hombro, aes(x = sexoN, y = LMCD, fill = sexoN)) +
geom_boxplot(alpha = 0.7) +
labs(
title = "Longitud máxima de la clavicula derecho",
x = "Sexo",
y = " "
) +
theme_minimal()
## Warning: Removed 20 rows containing non-finite outside the scale range
## (`stat_boxplot()`).
Estas dos graficas nos permiten visualizar de manera clara las diferencias encontradas en los anteriores analisis, observamos por ejemplo en la grafica de densidad, nos indica que la distribucion de los hombres se desplaza hacia valores mas altos que en las mujeres y la grafica de caja muestra que las medidas son mayores en hombres. Esto confirma vusualmente el diformismo sexual de las variables estudiadas. # Análisis discriminante
En este apartado aplicaremos la técnica de análisis discriminante que nos permitirá clasificar un individuo como hombre o mujer dependiendo de los valores discriminantes obtenidos. Un paso intermedio, después de estimar la función discriminante es obtener el punto de corte. Pero para dos variables.
##Ajustar Disciminante Lineal
# Eliminar NAs de forma explícita
Hombro_sinNA <- na.omit(Hombro[, c("sexoN", "LMCD")])
# Ajustar el modelo con la base depurada
## El modelo discriminante es D=a*LMCD+b
lda1 <- lda(sexoN ~ LMCD, data = Hombro_sinNA)
a <- coef(lda1) ## El factor que multiplica a LMCD
pred0 <- predict(lda1,
newdata = data.frame(LMCD = 0))
b <- pred0$x # valor de D cuando LMCD=0 es b
pred <- predict(lda1) ## Predicción de sexo para todos los valores de
# medias de la función discriminante por grupo
centroide_H <- mean(pred$x[Hombro_sinNA$sexoN == "Hombre"])
centroide_M <- mean(pred$x[Hombro_sinNA$sexoN == "Mujer"])
# Punto de corte (promedio de centroides, priors iguales)
cutoff <- mean(c(centroide_H, centroide_M))
## El modelo discriminante es
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")
## Punto de corte= -0.1791 Si D> -0.1791 es Hombre
# Tabla cruzada
tabla_clas <- table(Observado = Hombro_sinNA$sexoN,
Predicho = pred$class)
tabla_clas
## Predicho
## Observado Mujer Hombre
## Mujer 22 3
## Hombre 3 32
prop_clas <- sum(diag(tabla_clas)) / sum(tabla_clas)*100
cat("El porcentaje de clasificación correcta es ",round(prop_clas,1),"%")
## El porcentaje de clasificación correcta es 90 %
Ejemplo:Supongamos que se encuentra una clavicula derecha cuya longitud es de 120.5 mm. usaremos el modelo para predecir
prede1 <- predict(lda1,newdata = data.frame(LMCD = 120.5))
prede1$x
## LD1
## 1 -2.430437
if(prede1$x>cutoff) cat("Debido a que", prede1$x,">",cutoff, "es hombre") else cat("Debido a que", prede1$x,"<",cutoff,"es mujer")
## Debido a que -2.430437 < -0.1790721 es mujer
Ahora ajustaremos la discriminacion lineal con dos variables
##Ajustar Disciminante Lineal para dos variables
# Eliminar NAs de forma explícita
Hombro_sinNA <- na.omit(Hombro[, c("sexoN", "LMCD","C12CD")])
# Ajustar el modelo con la base depurada
## El modelo discriminante que queremos ajustar es D=a*LMCD+b*C12CD+c
lda2 <- lda(sexoN ~ LMCD+C12CD, data = Hombro_sinNA) ##Ajustar Disciminante Lineal
# Obtener los coeficientes a y b
a1 <- coef(lda2)[1]
a2 <- coef(lda2)[2]
lda2
## Call:
## lda(sexoN ~ LMCD + C12CD, data = Hombro_sinNA)
##
## Prior probabilities of groups:
## Mujer Hombre
## 0.4166667 0.5833333
##
## Group means:
## LMCD C12CD
## Mujer 131.3026 30.31206
## Hombre 151.0263 35.77151
##
## Coefficients of linear discriminants:
## LD1
## LMCD 0.0727066
## C12CD 0.2559868
# Predicción de valores mediante modelo
pred2 <- predict(lda2)
# Matriz de confusión
table(Real = Hombro_sinNA$sexoN, Predicho = pred2$class)
## Predicho
## Real Mujer Hombre
## Mujer 24 1
## Hombre 1 34
# Porcentaje de acierto
mean(pred2$class == Hombro_sinNA$sexoN)*100
## [1] 96.66667
# valor de D cuando LMCD=0 y C12CD=0 (intercepto)
b <- predict(lda2,
newdata = data.frame(LMCD = 0, C12CD = 0))$x
b
## LD1
## 1 -18.95782
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))
cutoff
## [1] -0.2359658
cat("Funció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")
## 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")
a1 <- lda2$scaling["LMCD", 1]
a2 <- lda2$scaling["C12CD", 1]
b <- predict(lda2, newdata = data.frame(LMCD = 0, C12CD = 0))$x - cutoff
Ejemplo: Supongamos que se encuentra una clavicula derecha cuya longitud maxima es de 122 y una circunferencia del punto medio de la clavicula derecha es de 11. Usaremos el modelo para precedir
ejemplo2 <- predict(lda2, newdata = data.frame(LMCD = 122, C12CD = 11))
ejemplo2$x
## LD1
## 1 -7.271756
if(ejemplo2$x > cutoff){
cat("El individuo sería clasificado como Hombre")
} else{
cat("El individuo sería clasificado como Mujer")
}
## El individuo sería clasificado como Mujer
Aplicaremos la regresión logística para determinar la probabilidad de hombre o mujer usando los huesos del hombro (LMCD Y C12CD). Aplicaremos primero la regresión con una variable (LMCD)
### Ahora aplicaremos Regresión Logística
## Omitir datos perdidos
Hombro_sinNA <- na.omit(Hombro[, c("sexoN", "LMCD")])
# 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_Hombre <- predict(modelo1, 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
table(Real = Hombro_sinNA$sexoN, Predicho = Hombro_sinNA$predicho)
## Predicho
## Real Hombre Mujer
## Mujer 3 22
## Hombre 32 3
# Porcentaje de acierto
mean(Hombro_sinNA$sexoN == Hombro_sinNA$predicho) * 100
## [1] 90
## Gráfica de probabilidades predichas
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",
x = "P(Hombre)", y = "Densidad")
coef(modelo1)
## (Intercept) LMCD
## -41.7269684 0.2994501
cat("Ecuación logística:\nlogit(p) = ",
round(coef(modelo1)[1], 4), " + ",
round(coef(modelo1)[2], 4), "*LMCD\n")
## Ecuación logística:
## logit(p) = -41.727 + 0.2995 *LMCD
Aquí vamos a aplicar la regresión lineal con dos variables
### Ahora aplicaremos Regresión Logística
## Omitir datos perdidos
Hombro_sinNA <- na.omit(Hombro[, c("sexoN", "LMCD","C12CD")])
# Ajustar modelo logístico binario
modelo1 <- glm(sexoN ~ LMCD + C12CD,
data = Hombro_sinNA,
family = binomial(link = "logit"))
summary(modelo1)
##
## 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(modelo1, 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
table(Real = Hombro_sinNA$sexoN, Predicho = Hombro_sinNA$predicho)
## Predicho
## Real Hombre Mujer
## Mujer 1 24
## Hombre 34 1
# Porcentaje de acierto
mean(Hombro_sinNA$sexoN == Hombro_sinNA$predicho) * 100
## [1] 96.66667
## Gráfica de probabilidades predichas
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",
x = "P(Hombre)", y = "Densidad")
coef(modelo1)
## (Intercept) LMCD C12CD
## -69.0884686 0.3067252 0.8022468
cat("Ecuación logística:\nlogit(p) = ",
round(coef(modelo1)[1], 4), " + ",
round(coef(modelo1)[2], 4), "*LMCD + ",
round(coef(modelo1)[3], 4), "*C12CD\n")
## Ecuación logística:
## logit(p) = -69.0885 + 0.3067 *LMCD + 0.8022 *C12CD
Ejemplo: Supongamos que se encuentra una clavicula derecha cuya longitud maxima es de 120 y una circunferencia del punto medio de la clavicula derecha es de 15. Usaremos el modelo para precedir
nuevo <- data.frame(LMCD = 120, C12CD = 15)
prob_nuevo <- predict(modelo1, newdata = nuevo, type = "response")
cat("Probabilidad de ser Hombre =", round(prob_nuevo, 4), "\n")
## Probabilidad de ser Hombre = 0
if(prob_nuevo >= 0.5){
cat("El individuo sería clasificado como Hombre")
} else{
cat("El individuo sería clasificado como Mujer")
}
## El individuo sería clasificado como Mujer
En conclusion, en la presente practica se aplicaron diversos metodos estadisticos para poder analizar el diformismo sexual a partir de dos mediciones osteometricas, se tomaron en cuenta la variable LMCD y C12CD.
El analisis con la variable LMCD alcanzo asta un 90%, mientras que al incluir las dos variables el porcentaje aumento un 96.6%, lo que evidencia que la combinacion de medidas mejoro la presicion del metodo, lo mismo ocurrio con el modelo de regresion logistica mostrando coeficcientes significativos con una presicion del 96.6%
Esto demuestra que las dos variables son utiles y consistentes mediante tecnicas estadisticas.