Punto 1: Cargar datos y explorar variables

############################
# Punto 1: Cargar datos    #
############################

Hombro <- haven::read_sav("Datos hombro.sav")
# Leemos el archivo SPSS y lo guardamos en el objeto Hombro

str(Hombro)
## tibble [80 × 16] (S3: tbl_df/tbl/data.frame)
##  $ FOLIO: chr [1:80] "028" "042" "053" "054" ...
##   ..- attr(*, "format.spss")= chr "A3"
##   ..- attr(*, "display_width")= int 9
##  $ sexoN: dbl+lbl [1:80] 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2...
##    ..@ label      : chr "Sexo"
##    ..@ format.spss: chr "F8.0"
##    ..@ labels     : Named num [1:2] 1 2
##    .. ..- attr(*, "names")= chr [1:2] "Hombre" "Mujer"
##  $ LMHD : num [1:80] NA NA NA NA NA NA NA NA NA NA ...
##   ..- attr(*, "label")= chr "Longitud máxima húmero derecho"
##   ..- attr(*, "format.spss")= chr "F5.1"
##   ..- attr(*, "display_width")= int 12
##  $ LMHI : num [1:80] NA NA NA NA NA NA NA NA NA NA ...
##   ..- attr(*, "label")= chr "Longitud máxima húmero izquierdo"
##   ..- attr(*, "format.spss")= chr "F5.1"
##   ..- attr(*, "display_width")= int 12
##  $ ABHD : num [1:80] NA NA NA NA NA NA NA NA NA NA ...
##   ..- attr(*, "label")= chr "Altura biomecánica húmero derecho"
##   ..- attr(*, "format.spss")= chr "F5.1"
##   ..- attr(*, "display_width")= int 12
##  $ ABHI : num [1:80] NA NA NA NA NA NA NA NA NA NA ...
##   ..- attr(*, "label")= chr "Altura biomecánica húmero izquierdo"
##   ..- attr(*, "format.spss")= chr "F5.1"
##   ..- attr(*, "display_width")= int 12
##  $ LMCD : num [1:80] 148 158 NA NA NA NA NA NA 135 NA ...
##   ..- attr(*, "label")= chr "Longitud máxima clavícula derecha"
##   ..- attr(*, "format.spss")= chr "F5.1"
##   ..- attr(*, "display_width")= int 12
##  $ LMCI : num [1:80] 152 159 NA NA NA ...
##   ..- attr(*, "label")= chr "Longitud máxima clavícula izquierdo"
##   ..- attr(*, "format.spss")= chr "F5.1"
##   ..- attr(*, "display_width")= int 12
##  $ C12CD: num [1:80] 34.4 35 37 33 NA ...
##   ..- attr(*, "label")= chr "Circunferencia en punto medio clavícula derecha"
##   ..- attr(*, "format.spss")= chr "F4.1"
##   ..- attr(*, "display_width")= int 12
##  $ C12CI: num [1:80] 36 35 35 35 NA ...
##   ..- attr(*, "label")= chr "Circunferencia en punto medio clavícula izquierdo"
##   ..- attr(*, "format.spss")= chr "F4.1"
##   ..- attr(*, "display_width")= int 12
##  $ DAPCD: num [1:80] 11.5 13 11 12 NA 12.5 NA 11 12 10 ...
##   ..- attr(*, "label")= chr "Diámetro antero-posterior  clavícula derecha"
##   ..- attr(*, "format.spss")= chr "F4.1"
##   ..- attr(*, "display_width")= int 12
##  $ DAPCI: num [1:80] 13 12.5 12 12 NA 14 12 NA 11 NA ...
##   ..- attr(*, "label")= chr "Diámetro antero-posterior  clavícula izquierdo"
##   ..- attr(*, "format.spss")= chr "F4.1"
##   ..- attr(*, "display_width")= int 12
##  $ AlEED: num [1:80] NA NA 146 NA NA ...
##   ..- attr(*, "label")= chr "Altura escapular escápula derecha"
##   ..- attr(*, "format.spss")= chr "F5.1"
##   ..- attr(*, "display_width")= int 12
##  $ AlEEI: num [1:80] NA NA 147 NA NA ...
##   ..- attr(*, "label")= chr "Altura escapular escápula izquierdo"
##   ..- attr(*, "format.spss")= chr "F5.1"
##   ..- attr(*, "display_width")= int 12
##  $ AnEED: num [1:80] 103 NA 103 NA 101 ...
##   ..- attr(*, "label")= chr "Anchura escapular escápula derecha"
##   ..- attr(*, "format.spss")= chr "F4.1"
##   ..- attr(*, "display_width")= int 12
##  $ AnEEI: num [1:80] 104 NA 104 NA 101 ...
##   ..- attr(*, "label")= chr "Anchura escapular escápula izquierdo"
##   ..- attr(*, "format.spss")= chr "F5.1"
##   ..- attr(*, "display_width")= int 12
# Mostramos la estructura de la base: tipo de objeto, número de casos y variables

names(Hombro)
##  [1] "FOLIO" "sexoN" "LMHD"  "LMHI"  "ABHD"  "ABHI"  "LMCD"  "LMCI"  "C12CD"
## [10] "C12CI" "DAPCD" "DAPCI" "AlEED" "AlEEI" "AnEED" "AnEEI"
# Mostramos los nombres de todas las variables de Hombro

Punto 2: Transformar sexo y construir Hombro2

###########################################################
# Punto 2: Revisar y transformar la variable de sexo (sexoN)
###########################################################

table(Hombro$sexoN, useNA = "ifany")
## 
##  1  2 
## 50 30
# Contamos cuántos códigos 1 y 2 hay en sexoN y verificamos si existen NA

Hombro$sexoN <- haven::as_factor(Hombro$sexoN)
# Convertimos la variable etiquetada de SPSS en un factor de R con etiquetas

table(Hombro$sexoN, useNA = "ifany")
## 
## Hombre  Mujer 
##     50     30
# Verificamos cómo quedan las frecuencias después de convertir a factor

levels(Hombro$sexoN)
## [1] "Hombre" "Mujer"
# Mostramos el orden actual de las categorías de sexoN

Hombro$sexoN <- relevel(Hombro$sexoN, ref = "Mujer")
# Fijamos "Mujer" como categoría de referencia en el factor sexoN

levels(Hombro$sexoN)
## [1] "Mujer"  "Hombre"
# Confirmamos el nuevo orden de las categorías de sexoN


######################################################
# Punto 3: Construir subconjunto con LMCD y C12CD    #
######################################################

Hombro2 <- Hombro %>%
  dplyr::select(sexoN, LMCD, C12CD) %>%       # Nos quedamos solo con sexoN, LMCD y C12CD
  filter(!is.na(sexoN),                       # Retenemos solo casos con sexoN no faltante
         !is.na(LMCD),                        # Retenemos solo casos con LMCD no faltante
         !is.na(C12CD))                       # Retenemos solo casos con C12CD no faltante

str(Hombro2)
## tibble [60 × 3] (S3: tbl_df/tbl/data.frame)
##  $ sexoN: Factor w/ 2 levels "Mujer","Hombre": 2 2 1 1 1 1 1 1 1 1 ...
##  $ LMCD : num [1:60] 148 158 135 125 116 ...
##   ..- attr(*, "label")= chr "Longitud máxima clavícula derecha"
##   ..- attr(*, "format.spss")= chr "F5.1"
##   ..- attr(*, "display_width")= int 12
##  $ C12CD: num [1:60] 34.4 35 33 28.4 30 ...
##   ..- attr(*, "label")= chr "Circunferencia en punto medio clavícula derecha"
##   ..- attr(*, "format.spss")= chr "F4.1"
##   ..- attr(*, "display_width")= int 12
# Comprobamos cuántas observaciones y variables tiene el nuevo objeto Hombro2

table(Hombro2$sexoN)
## 
##  Mujer Hombre 
##     25     35
# Vemos cuántos hombres y mujeres quedan en el subconjunto Hombro2

Punto 3: Comparaciones por sexo (LMCD y C12CD)

########################################
# Punto 4: Comparaciones por sexo      #
########################################

comparar_por_sexo <- function(var_nombre) {
  x <- Hombro2[[var_nombre]]
  grupo_H <- x[Hombro2$sexoN == "Hombre"]
  grupo_M <- x[Hombro2$sexoN == "Mujer"]
  
  p_H <- shapiro.test(grupo_H)$p.value
  p_M <- shapiro.test(grupo_M)$p.value
  
  cat("\nVariable:", var_nombre, "\n")
  cat("Shapiro H =", round(p_H,4),
      " / Shapiro M =", round(p_M,4), "\n")
  
  if (p_H > 0.05 & p_M > 0.05) {
    cat("Usamos t de Student\n")
    test <- t.test(x ~ sexoN, data = Hombro2)
  } else {
    cat("Usamos Mann-Whitney\n")
    test <- wilcox.test(x ~ sexoN, data = Hombro2)
  }
  print(test)
}

comparar_por_sexo("LMCD")
## 
## Variable: LMCD 
## Shapiro H = 0.1055  / Shapiro M = 0.8169 
## Usamos t de Student
## 
##  Welch Two Sample t-test
## 
## data:  x by sexoN
## t = -8.6158, df = 57.876, p-value = 5.838e-12
## alternative hypothesis: true difference in means between group Mujer and group Hombre is not equal to 0
## 95 percent confidence interval:
##  -24.30633 -15.14104
## sample estimates:
##  mean in group Mujer mean in group Hombre 
##             131.3026             151.0263
# Comparamos LMCD entre hombres y mujeres usando la función comparar_por_sexo

comparar_por_sexo("C12CD")
## 
## Variable: C12CD 
## Shapiro H = 0.2534  / Shapiro M = 0.2948 
## Usamos t de Student
## 
##  Welch Two Sample t-test
## 
## data:  x by sexoN
## t = -7.8461, df = 45.117, p-value = 5.68e-10
## alternative hypothesis: true difference in means between group Mujer and group Hombre is not equal to 0
## 95 percent confidence interval:
##  -6.860803 -4.058095
## sample estimates:
##  mean in group Mujer mean in group Hombre 
##             30.31206             35.77151
# Comparamos C12CD entre hombres y mujeres con la misma función

Punto 4: LDA con solo LMCD

#############################
# Punto 5: LDA con solo LMCD
#############################

disc1 <- lda(sexoN ~ LMCD, data = Hombro2)
# Ajustamos una función discriminante lineal donde LMCD clasifica el sexo

disc1
## Call:
## lda(sexoN ~ LMCD, data = Hombro2)
## 
## Prior probabilities of groups:
##     Mujer    Hombre 
## 0.4166667 0.5833333 
## 
## Group means:
##            LMCD
## Mujer  131.3026
## Hombre 151.0263
## 
## Coefficients of linear discriminants:
##            LD1
## LMCD 0.1089485
# Mostramos medias por grupo y coeficientes del modelo discriminante

pred1 <- predict(disc1)
# Obtenemos clasificaciones y probabilidades posteriores para cada individuo

pred1
## $class
##  [1] Hombre Hombre Mujer  Mujer  Mujer  Mujer  Mujer  Mujer  Mujer  Mujer 
## [11] Mujer  Mujer  Hombre Mujer  Hombre Mujer  Mujer  Mujer  Mujer  Mujer 
## [21] Mujer  Mujer  Mujer  Hombre Mujer  Hombre Mujer  Mujer  Hombre Hombre
## [31] Hombre Hombre Mujer  Hombre Hombre Hombre Hombre Mujer  Hombre Hombre
## [41] Hombre Hombre Hombre Hombre Hombre Hombre Mujer  Hombre Hombre Hombre
## [51] Hombre Hombre Hombre Hombre Hombre Hombre Hombre Hombre Hombre Hombre
## Levels: Mujer Hombre
## 
## $posterior
##           Mujer      Hombre
## 1  0.1260029038 0.873997096
## 2  0.0136815848 0.986318415
## 3  0.7515192045 0.248480795
## 4  0.9712929261 0.028707074
## 5  0.9956905066 0.004309493
## 6  0.8966228697 0.103377130
## 7  0.9861741417 0.013825858
## 8  0.9951350049 0.004864995
## 9  0.9488811825 0.051118817
## 10 0.8852580772 0.114741923
## 11 0.6544142881 0.345585712
## 12 0.8284898988 0.171510101
## 13 0.2688805653 0.731119435
## 14 0.9567570026 0.043242997
## 15 0.3700322955 0.629967704
## 16 0.9105832491 0.089416751
## 17 0.9876826201 0.012317380
## 18 0.7926291698 0.207370830
## 19 0.9427330877 0.057266912
## 20 0.9427330877 0.057266912
## 21 0.9069802971 0.093019703
## 22 0.6803884961 0.319611504
## 23 0.8284898988 0.171510101
## 24 0.4260556107 0.573944389
## 25 0.5997405749 0.400259425
## 26 0.3173030151 0.682696985
## 27 0.6544142881 0.345585712
## 28 0.7515192045 0.248480795
## 29 0.0215416906 0.978458309
## 30 0.4260556107 0.573944389
## 31 0.1871645030 0.812835497
## 32 0.1023954120 0.897604588
## 33 0.5424646191 0.457535381
## 34 0.1260029038 0.873997096
## 35 0.1260029038 0.873997096
## 36 0.3633345989 0.636665401
## 37 0.0341757375 0.965824263
## 38 0.8444896642 0.155510336
## 39 0.0125723447 0.987427655
## 40 0.1871645030 0.812835497
## 41 0.0428050787 0.957194921
## 42 0.0827919587 0.917208041
## 43 0.1260029038 0.873997096
## 44 0.2464999368 0.753500063
## 45 0.0281356116 0.971864388
## 46 0.0002305177 0.999769482
## 47 0.8284898988 0.171510101
## 48 0.2384359256 0.761564074
## 49 0.0341757375 0.965824263
## 50 0.0428050787 0.957194921
## 51 0.0827919587 0.917208041
## 52 0.0243009347 0.975699065
## 53 0.3704483262 0.629551674
## 54 0.0341757375 0.965824263
## 55 0.1023954120 0.897604588
## 56 0.0003681246 0.999631875
## 57 0.0108568362 0.989143164
## 58 0.0796619614 0.920338039
## 59 0.0006607779 0.999339222
## 60 0.0013328728 0.998667127
## 
## $x
##            LD1
## 1   0.56564625
## 2   1.65513096
## 3  -0.85068387
## 4  -1.97441778
## 5  -2.86843900
## 6  -1.34095199
## 7  -2.32148823
## 8  -2.81175635
## 9  -1.69503615
## 10 -1.28647776
## 11 -0.63278693
## 12 -1.06858081
## 13  0.12985237
## 14 -1.77674587
## 15 -0.08804458
## 16 -1.41565452
## 17 -2.37596246
## 18 -0.95963234
## 19 -1.63915983
## 20 -1.63915983
## 21 -1.39542623
## 22 -0.68726117
## 23 -1.06858081
## 24 -0.19699305
## 25 -0.52383846
## 26  0.02090390
## 27 -0.63278693
## 28 -0.85068387
## 29  1.44016152
## 30 -0.19699305
## 31  0.34774931
## 32  0.67459472
## 33 -0.41488999
## 34  0.56564625
## 35  0.56564625
## 36 -0.07462270
## 37  1.21933708
## 38 -1.12305505
## 39  1.69500093
## 40  0.34774931
## 41  1.11038861
## 42  0.78354319
## 43  0.56564625
## 44  0.18432660
## 45  1.31274182
## 46  3.56172920
## 47 -1.06858081
## 48  0.20475893
## 49  1.21933708
## 50  1.11038861
## 51  0.78354319
## 52  1.38275978
## 53 -0.08887492
## 54  1.21933708
## 55  0.67459472
## 56  3.34383226
## 57  1.76407943
## 58  0.80306301
## 59  3.07146108
## 60  2.74461567
# Mostramos las predicciones (clase y posterior probabilities)

tab_disc1 <- table(Real = Hombro2$sexoN, Predicho = pred1$class)
# Construimos la matriz de confusión entre sexo real y sexo predicho

tab_disc1
##         Predicho
## Real     Mujer Hombre
##   Mujer     22      3
##   Hombre     3     32
# Visualizamos la matriz de confusión

acc_disc1 <- mean(pred1$class == Hombro2$sexoN) * 100
# Calculamos el porcentaje de casos correctamente clasificados por el modelo

acc_disc1
## [1] 90
# Mostramos el porcentaje de clasificación correcta del modelo con LMCD


nuevo_LMCD <- data.frame(LMCD = 140)
# Definimos un ejemplo hipotético con LMCD igual a 140

pred_nuevo1 <- predict(disc1, nuevo_LMCD)
# Obtenemos la clasificación y probabilidades para el caso hipotético

pred_nuevo1
## $class
## [1] Hombre
## Levels: Mujer Hombre
## 
## $posterior
##       Mujer    Hombre
## 1 0.4840437 0.5159563
## 
## $x
##          LD1
## 1 -0.3059415
# Mostramos sexo asignado y probabilidades posteriores del ejemplo

Punto 5: LDA con LMCD y C12CD

#########################################
# Punto 6: LDA con LMCD y C12CD         #
#########################################

disc2 <- lda(sexoN ~ LMCD + C12CD, data = Hombro2)
# Ajustamos una función discriminante con las dos variables LMCD y C12CD

disc2
## Call:
## lda(sexoN ~ LMCD + C12CD, data = Hombro2)
## 
## 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
# Inspeccionamos coeficientes y medias por grupo del modelo con dos predictores

pred2 <- predict(disc2)
# Calculamos clasificaciones y probabilidades posteriores para todos los casos

pred2
## $class
##  [1] Hombre Hombre Mujer  Mujer  Mujer  Mujer  Mujer  Mujer  Mujer  Mujer 
## [11] Mujer  Mujer  Hombre Mujer  Mujer  Mujer  Mujer  Mujer  Mujer  Mujer 
## [21] Mujer  Mujer  Mujer  Hombre Mujer  Hombre Mujer  Hombre Hombre Hombre
## [31] Hombre Hombre Mujer  Hombre Hombre Mujer  Hombre Mujer  Hombre Hombre
## [41] Hombre Hombre Hombre Hombre Hombre Hombre Hombre Hombre Hombre Hombre
## [51] Hombre Hombre Hombre Hombre Hombre Hombre Hombre Hombre Hombre Hombre
## Levels: Mujer Hombre
## 
## $posterior
##           Mujer       Hombre
## 1  6.132754e-02 0.9386724621
## 2  5.368094e-03 0.9946319056
## 3  7.237080e-01 0.2762919870
## 4  9.983476e-01 0.0016524175
## 5  9.990426e-01 0.0009573886
## 6  9.990549e-01 0.0009450619
## 7  9.886497e-01 0.0113503097
## 8  9.997498e-01 0.0002502171
## 9  9.560486e-01 0.0439514311
## 10 9.908592e-01 0.0091407631
## 11 9.848640e-01 0.0151360139
## 12 8.908575e-01 0.1091425370
## 13 4.585656e-01 0.5414343566
## 14 9.995850e-01 0.0004150006
## 15 9.709280e-01 0.0290720472
## 16 9.811070e-01 0.0188930072
## 17 9.988241e-01 0.0011758575
## 18 9.960018e-01 0.0039982119
## 19 9.067925e-01 0.0932074839
## 20 5.691369e-01 0.4308631185
## 21 9.380314e-01 0.0619686090
## 22 9.953473e-01 0.0046527259
## 23 7.334613e-01 0.2665386703
## 24 7.966774e-02 0.9203322634
## 25 5.854784e-01 0.4145216371
## 26 3.353530e-01 0.6646469552
## 27 7.817730e-01 0.2182269746
## 28 1.596810e-01 0.8403190133
## 29 2.498618e-03 0.9975013818
## 30 4.323372e-01 0.5676627841
## 31 2.138794e-01 0.7861205970
## 32 3.327774e-02 0.9667222606
## 33 9.773277e-01 0.0226723436
## 34 4.344422e-01 0.5655577659
## 35 2.007508e-02 0.9799249212
## 36 8.417076e-01 0.1582923998
## 37 6.765708e-04 0.9993234292
## 38 7.530960e-01 0.2469039912
## 39 3.560689e-03 0.9964393110
## 40 6.000781e-02 0.9399921885
## 41 1.488325e-02 0.9851167468
## 42 2.830352e-03 0.9971696477
## 43 4.783939e-03 0.9952160615
## 44 4.763575e-03 0.9952364246
## 45 5.973455e-04 0.9994026545
## 46 8.096146e-06 0.9999919039
## 47 3.100537e-01 0.6899462701
## 48 7.718711e-02 0.9228128918
## 49 2.877081e-03 0.9971229187
## 50 7.265162e-03 0.9927348379
## 51 1.339026e-02 0.9866097436
## 52 8.949111e-03 0.9910508885
## 53 9.108027e-04 0.9990891973
## 54 1.214763e-02 0.9878523651
## 55 1.640106e-02 0.9835989359
## 56 2.219213e-04 0.9997780787
## 57 1.837757e-02 0.9816224338
## 58 4.261755e-02 0.9573824498
## 59 3.712447e-04 0.9996287553
## 60 3.791787e-05 0.9999620821
## 
## $x
##            LD1
## 1   0.60870665
## 2   1.48936478
## 3  -0.69486072
## 4  -2.61637258
## 5  -2.80936708
## 6  -2.81394801
## 7  -1.93238668
## 8  -3.28351358
## 9  -1.44242456
## 10 -2.00963432
## 11 -1.82938149
## 12 -1.09626073
## 13 -0.29612770
## 14 -3.10477443
## 15 -1.59384186
## 16 -1.74973118
## 17 -2.73670037
## 18 -2.30348809
## 19 -1.15825980
## 20 -0.45308863
## 21 -1.31438054
## 22 -2.24971498
## 23 -0.71228054
## 24  0.50933929
## 25 -0.47674091
## 26 -0.11320788
## 27 -0.80543431
## 28  0.23166256
## 29  1.76045493
## 30 -0.25862109
## 31  0.10491193
## 32  0.83500534
## 33 -1.68396828
## 34 -0.26164845
## 35  1.01828553
## 36 -0.94491780
## 37  2.22248554
## 38 -0.74863384
## 39  1.63498421
## 40  0.61688552
## 41  1.12583176
## 42  1.71631153
## 43  1.53025911
## 44  1.53177279
## 45  2.26649642
## 46  3.78567755
## 47 -0.07231355
## 48  0.52146110
## 49  1.71051195
## 50  1.38181855
## 51  1.16369874
## 52  1.30759827
## 53  2.11741253
## 54  1.19853836
## 55  1.09099213
## 56  2.61631716
## 57  1.05009780
## 58  0.74421330
## 59  2.43455064
## 60  3.24037801
# Mostramos el objeto de predicciones (clase y probabilidades)

tab_disc2 <- table(Real = Hombro2$sexoN, Predicho = pred2$class)
# Construimos la matriz de confusión del modelo con LMCD y C12CD

tab_disc2
##         Predicho
## Real     Mujer Hombre
##   Mujer     24      1
##   Hombre     1     34
# Visualizamos la matriz de confusión del segundo modelo

acc_disc2 <- mean(pred2$class == Hombro2$sexoN) * 100
# Obtenemos el porcentaje de clasificación correcta del modelo con dos variables

acc_disc2
## [1] 96.66667
# Mostramos el porcentaje de clasificación correcta


nuevo_2 <- data.frame(
  LMCD  = 140,   # Valor hipotético de LMCD
  C12CD = 40     # Valor hipotético de C12CD
)
# Definimos un caso hipotético con ambas medidas

pred_nuevo2 <- predict(disc2, nuevo_2)
# Obtenemos la clasificación discriminante para el individuo hipotético

pred_nuevo2
## $class
## [1] Hombre
## Levels: Mujer Hombre
## 
## $posterior
##         Mujer    Hombre
## 1 0.005821304 0.9941787
## 
## $x
##       LD1
## 1 1.46058
# Mostramos sexo asignado y probabilidades posteriores del caso hipotético

Punto 6: Modelo logístico con solo LMCD

#############################################
# Punto 7: Modelo logístico con solo LMCD   #
#############################################

mod_log1 <- glm(sexoN ~ LMCD,
                data   = Hombro2,
                family = binomial(link = "logit"))
# Ajustamos un modelo de regresión logística donde LMCD predice la probabilidad de ser Hombre

summary(mod_log1)
## 
## Call:
## glm(formula = sexoN ~ LMCD, family = binomial(link = "logit"), 
##     data = Hombro2)
## 
## 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
# Revisamos coeficientes, errores estándar y significancia del modelo logístico


Hombro2$prob_Hombre1 <- predict(mod_log1, type = "response")
# Calculamos la probabilidad estimada de ser Hombre para cada individuo

Hombro2$predicho_log1 <- ifelse(Hombro2$prob_Hombre1 >= 0.5, "Hombre", "Mujer")
# Asignamos la etiqueta Hombre o Mujer usando un punto de corte de 0.5

Hombro2$predicho_log1 <- factor(Hombro2$predicho_log1,
                                levels = levels(Hombro2$sexoN))
# Convertimos la clasificación en factor con los mismos niveles que el sexo real

tab_log1 <- table(Real = Hombro2$sexoN, Predicho = Hombro2$predicho_log1)
# Construimos la matriz de confusión del modelo logístico con LMCD

tab_log1
##         Predicho
## Real     Mujer Hombre
##   Mujer     22      3
##   Hombre     3     32
# Visualizamos la matriz de confusión

acc_log1 <- mean(Hombro2$sexoN == Hombro2$predicho_log1) * 100
# Calculamos el porcentaje de acierto del modelo logístico

acc_log1
## [1] 90
# Mostramos el porcentaje de casos correctamente clasificados


nuevo_LMCD <- data.frame(LMCD = 150)
# Definimos un nuevo valor hipotético de LMCD en 150

prob_hombre_LMCD <- predict(mod_log1, nuevo_LMCD, type = "response")
# Obtenemos la probabilidad de ser Hombre para ese valor hipotético

prob_hombre_LMCD
##        1 
## 0.960477
# Mostramos la probabilidad numérica estimada

Gráfica de probabilidades predichas (modelo LMCD)

ggplot(Hombro2, aes(x = prob_Hombre1, fill = sexoN)) +
  geom_density(alpha = 0.4) +
  geom_vline(xintercept = 0.5, linetype = "dashed") +
  theme_minimal() +
  labs(title = "Probabilidades predichas de ser Hombre (modelo LMCD)",
       x = "P(Hombre)", y = "Densidad")

# Graficamos las distribuciones de P(Hombre) por sexo real
# y observamos cómo funciona el punto de corte 0.5 en la separación de grupos

Punto 7: Modelo logístico con LMCD + C12CD

#############################################
# Punto 8: Modelo logístico con LMCD + C12CD
#############################################

mod_log2 <- glm(sexoN ~ LMCD + C12CD,
                data   = Hombro2,
                family = binomial(link = "logit"))
# Ajustamos un modelo logístico donde LMCD y C12CD predicen conjuntamente el sexo

summary(mod_log2)
## 
## Call:
## glm(formula = sexoN ~ LMCD + C12CD, family = binomial(link = "logit"), 
##     data = Hombro2)
## 
## 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
# Revisamos la significancia y los coeficientes del modelo con dos predictores

Hombro2$prob_Hombre2 <- predict(mod_log2, type = "response")
# Calculamos la probabilidad de ser Hombre para cada caso usando ambos predictores

Hombro2$predicho_log2 <- ifelse(Hombro2$prob_Hombre2 >= 0.5, "Hombre", "Mujer")
# Asignamos la clasificación Hombre/Mujer según el punto de corte 0.5

Hombro2$predicho_log2 <- factor(Hombro2$predicho_log2,
                                levels = levels(Hombro2$sexoN))
# Garantizamos que la variable predicha tenga los mismos niveles que sexoN

tab_log2 <- table(Real = Hombro2$sexoN, Predicho = Hombro2$predicho_log2)
# Armamos la matriz de confusión del modelo logístico con dos variables

tab_log2
##         Predicho
## Real     Mujer Hombre
##   Mujer     24      1
##   Hombre     1     34
# Visualizamos la matriz de confusión resultante

acc_log2 <- mean(Hombro2$sexoN == Hombro2$predicho_log2) * 100
# Calculamos el porcentaje de acierto del modelo logístico con LMCD y C12CD

acc_log2
## [1] 96.66667
# Mostramos el valor final de ese porcentaje


nuevo_vals <- data.frame(
  LMCD  = 150,
  C12CD = 38
)
# Creamos un caso hipotético con LMCD = 150 y C12CD = 38

prob_hombre_2 <- predict(mod_log2, nuevo_vals, type = "response")
# Obtenemos la probabilidad estimada de ser Hombre para ese individuo hipotético

prob_hombre_2
##         1 
## 0.9993926
# Mostramos la probabilidad numérica asociada al caso con ambas medidas