Defino mi directorio de trabajo

setwd(“~/DAVID”) ##Abriendo paquete pacman library(pacman) ## El archivo esta en formato SPSS, lo abrimos mediante la libreria haven p_load(haven,dplyr,ggplot2,MASS,tinytex) Hombro <- read_sav(“Datos hombro.sav”) table (Hombro\(sexoN) ## Frecuencias de sexo ## Cambiamos las categorías para predecir p(Hombre) Hombro\)sexoN <- factor(Hombro\(sexoN, levels = c(2, 1), labels = c("Mujer", "Hombre")) table (Hombro\)sexoN) ## Frecuencias de sexo

Omitir datos perdidos

Hombro_sinNA <- na.omit(Hombro[, c(“sexoN”, “LMCD”,“C12CD”)]) # Ajustar modelo logístico binario

##TAREA.NOV 2025 ###TAREA:LMCD #Modelo discrimante #Punto de corte #Tabla y % de clasificación.

El objetivo es aplicar regresión logística para determinación de sexo.

Defino mi directorio de trabajo

setwd(“~/DAVID”) ##Abriendo paquete pacman library(pacman) ## El archivo esta en formato SPSS, lo abrimos mediante la libreria haven p_load(haven,dplyr,ggplot2,MASS,tinytex) Hombro <- read_sav(“Datos hombro.sav”) table (Hombro\(sexoN) ## Frecuencias de sexo ## Cambiamos las categorías para predecir p(Hombre) Hombro\)sexoN <- factor(Hombro\(sexoN, levels = c(2, 1), labels = c("Mujer", "Hombre")) table (Hombro\)sexoN) ## Frecuencias de sexo

Omitir datos perdidos

Hombro_sinNA <- na.omit(Hombro[, c(“sexoN”, “LMCD”,“C12CD”)]) # Ajustar modelo logístico binario

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),”“) cat(”Punto de corte=“, round(cutoff, 4),”Si D>“,round(cutoff, 4),”es Hombre”)

Tabla cruzada

tabla_clas <- table(Observado = Hombro_sinNA\(sexoN, Predicho = pred\)class) tabla_clas prop_clas <- sum(diag(tabla_clas)) / sum(tabla_clas)*100 cat(“El porcentaje de clasificación correcta es”,round(prop_clas,1),“%”)

###TAREA:C12CD #Modelo discrimante #Punto de corte #Tabla y % de clasificación.

Hombro_sinNA <- na.omit(Hombro[, c(“sexoN”, “C12CD”)]) # Ajustar el modelo con la base depurada ## El modelo discriminante es D=a*C12CD+b lda1 <- lda(sexoN ~ C12CD, data = Hombro_sinNA) a <- coef(lda1) ## El factor que multiplica a C12CD pred0 <- predict(lda1, newdata = data.frame(C12CD = 0)) b <- pred0\(x # valor de D cuando C12CD=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), ” * C12CD + “, round(b, 4),”“) cat(”Punto de corte=“, round(cutoff, 4),”Si D>“,round(cutoff, 4),”es Hombre”)

Tabla cruzada

tabla_clas <- table(Observado = Hombro_sinNA\(sexoN, Predicho = pred\)class) tabla_clas prop_clas <- sum(diag(tabla_clas)) / sum(tabla_clas)*100 cat(“El porcentaje de clasificación correcta es”,round(prop_clas,1),“%”)

###TAREA NOV 2025. ##LMCD ## Defino mi directorio de trabajo setwd(“~/DAVID”) ##Abriendo paquete pacman library(pacman) ## El archivo esta en formato SPSS, lo abrimos mediante la libreria haven p_load(haven,dplyr,ggplot2,MASS,tinytex) Hombro <- read_sav(“Datos hombro.sav”) table (Hombro\(sexoN) ## Frecuencias de sexo ## Cambiamos las categorías para predecir p(Hombre) Hombro\)sexoN <- factor(Hombro\(sexoN, levels = c(2, 1), labels = c("Mujer", "Hombre")) table (Hombro\)sexoN) ## Frecuencias de sexo

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)

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)

Porcentaje de acierto

mean(Hombro_sinNA\(sexoN == Hombro_sinNA\)predicho) * 100

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) cat(“Ecuación logística:(p) =”, round(coef(modelo1)[1], 4), ” + “, round(coef(modelo1)[2], 4),”LMCD + “, round(coef(modelo1)[3], 4),”C12CD“)

modelo2 <- glm(sexoN ~ LMCD, data = Hombro_sinNA, family = binomial(link = “logit”)) summary(modelo2)

Probabilidades de ser “Hombre”

Hombro_sinNA$prob_Hombre2 <- predict(modelo2, 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

table(Real = Hombro_sinNA\(sexoN, Predicho2 = Hombro_sinNA\)predicho2)

Porcentaje de acierto

mean(Hombro_sinNA\(sexoN == Hombro_sinNA\)predicho2) * 100

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) cat(“Ecuación logística:(p) =”, round(coef(modelo1)[1], 4), ” + “, round(coef(modelo1)[2], 4),”LMCD + “, round(coef(modelo1)[3], 4),”C12CD“)

modelo1 <- glm(sexoN ~ LMCD + C12CD, data = Hombro_sinNA, family = binomial(link = “logit”)) summary(modelo1)

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)

Porcentaje de acierto

mean(Hombro_sinNA\(sexoN == Hombro_sinNA\)predicho) * 100

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) cat(“Ecuación logística:(p) =”, round(coef(modelo1)[1], 4), ” + “, round(coef(modelo1)[2], 4),”LMCD + “, round(coef(modelo1)[3], 4),”C12CD“)

modelo3 <- glm(sexoN ~ C12CD, data = Hombro_sinNA, family = binomial(link = “logit”)) summary(modelo3)

Probabilidades de ser “Hombre”

Hombro_sinNA$prob_Hombre3 <- predict(modelo3, type = “response”)

Clasificación usando 0.5 como punto de corte

Hombro_sinNA\(predicho3 <- ifelse(Hombro_sinNA\)prob_Hombre3 >= 0.5, “Hombre”, “Mujer”)

Matriz de confusión

table(Real = Hombro_sinNA\(sexoN, Predicho3 = Hombro_sinNA\)predicho3)

Porcentaje de acierto

mean(Hombro_sinNA\(sexoN == Hombro_sinNA\)predicho3) * 100

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) cat(“Ecuación logística:(p) =”, round(coef(modelo1)[1], 4), ” + “, round(coef(modelo1)[2], 4),”C12CD + “, round(coef(modelo1)[3], 4),”LMCD“)

###Tarea Noviembre 2025.

setwd(“~/DAVID”) ##Abriendo paquete pacman library(pacman) ## El archivo esta en formato SPSS, lo abrimos mediante la libreria haven p_load(haven,dplyr,ggplot2,MASS) 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”)) table (Hombro$sexoN) ## Frecuencias de sexo

Empezemos con la estadistica descriptiva

res_dmhd <- 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))) res_dmhd

res_abhd <- 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_abhd

Gráfica comparativa

ggplot(Hombro, aes(x = LMCD, fill = sexoN)) + geom_density(alpha = 0.5) + labs( title = “LMCD”, x = “LMCD”, y = “Densidad” ) + theme_minimal()

Gráfica de caja o box plot

ggplot(Hombro, aes(x = sexoN, y = LMCD, fill = sexoN)) + geom_boxplot(alpha = 0.7) + labs( title = “LMCD”, x = “Sexo”, y = ” ” ) + theme_minimal()

Para calcular la d de cohen necesitamos el paquete effsize

p_load(effsize) # Comparar entre hombres y mujeres cohen.d(Hombro\(LMCD, Hombro\)sexoN,na.rm = TRUE)

Realizaremos la prueba t para comparar las medias

t.test(LMCD ~ sexoN, data = Hombro, var.equal = TRUE) t.test(LMCD ~ sexoN, data = Hombro, var.equal = FALSE) ## la alternativa no paramétrica wilcox.test(LMCD ~ sexoN, data = Hombro)

res_dmhd <- 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_dmhd

res_abhd <- 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))) res_abhd

Gráfica comparativa

ggplot(Hombro, aes(x = C12CD, fill = sexoN)) + geom_density(alpha = 0.5) + labs( title = “C12CD”, x = “C12CD”, y = “Densidad” ) + theme_minimal()

Gráfica de caja o box plot

ggplot(Hombro, aes(x = sexoN, y = C12CD, fill = sexoN)) + geom_boxplot(alpha = 0.7) + labs( title = “C12CD”, x = “Sexo”, y = ” ” ) + theme_minimal()

Para calcular la d de cohen necesitamos el paquete effsize

p_load(effsize) # Comparar entre hombres y mujeres cohen.d(Hombro\(C12CD, Hombro\)sexoN,na.rm = TRUE)

Realizaremos la prueba t para comparar las medias

t.test(C12CD ~ sexoN, data = Hombro, var.equal = TRUE) t.test(C12CD ~ sexoN, data = Hombro, var.equal = FALSE) ## la alternativa no paramétrica wilcox.test(C12CD ~ sexoN, data = Hombro) ####Una p < 0,05 significa que la hipótesis nula es falsa y una p > 0,05 que la hipótesis nula es verdadera: siempre nos movemos en el terreno de la probabilidad.

###Estos ejercicios son aplicables en mediciones antropométricas forenses para casos de determinación de sexo.

R Markdown

This is an R Markdown document. Markdown is a simple formatting syntax for authoring HTML, PDF, and MS Word documents. For more details on using R Markdown see http://rmarkdown.rstudio.com.

When you click the Knit button a document will be generated that includes both content as well as the output of any embedded R code chunks within the document. You can embed an R code chunk like this:

summary(cars)
##      speed           dist       
##  Min.   : 4.0   Min.   :  2.00  
##  1st Qu.:12.0   1st Qu.: 26.00  
##  Median :15.0   Median : 36.00  
##  Mean   :15.4   Mean   : 42.98  
##  3rd Qu.:19.0   3rd Qu.: 56.00  
##  Max.   :25.0   Max.   :120.00

Including Plots

You can also embed plots, for example:

Note that the echo = FALSE parameter was added to the code chunk to prevent printing of the R code that generated the plot.