3. Estimar un modelo

Agenda

Parte I

  • Especificar un modelo
  • Estimar un modelo
  • Ver los resultados del modelo

Parte II

  • Dividir los datos
  • Especificar un modelo
  • Estimar un modelo
  • Evaluar el modelo
  • Estimar un modelo mejor

Estimar un modelo

Hay muchas formas de estimar modelos en R

  • lm(formula, data, ...)
  • stan_glm(formula, data, family= "gaussian",...)
  • glmnet(x=matrix, y=vector, family="gaussian",...)

Tip

lm(): Estimar un modelo de regresión lineal.

stan_glm(): Estimar un modelo de regresión utilizando el paquete Stan.

glmnet(): Estimar un modelo de regresión utilizando la regularización Lasso o Ridge.

Especificar el modelo en tidymodels

Tidymodels ofrece una sintaxis general para estimar los modelos

https://www.tidymodels.org/

  • Especificar el tipo de modelo
    • linear_reg(), logistic_reg(), decision_tree()
  • Especificar el tipo de outcome
    • Regresión: variables continuas
    • Clasificación: categórica,multinomial, ordinal

Especificar el modelo en tidymodels

library(tidymodels)
── Attaching packages ────────────────────────────────────── tidymodels 1.1.1 ──
✔ broom        1.0.5     ✔ recipes      1.0.9
✔ dials        1.2.0     ✔ rsample      1.2.0
✔ dplyr        1.1.4     ✔ tibble       3.2.1
✔ ggplot2      3.4.4     ✔ tidyr        1.3.1
✔ infer        1.0.5     ✔ tune         1.1.2
✔ modeldata    1.2.0     ✔ workflows    1.1.3
✔ parsnip      1.1.1     ✔ workflowsets 1.0.1
✔ purrr        1.0.2     ✔ yardstick    1.2.0
── Conflicts ───────────────────────────────────────── tidymodels_conflicts() ──
✖ purrr::discard() masks scales::discard()
✖ dplyr::filter()  masks stats::filter()
✖ dplyr::lag()     masks stats::lag()
✖ recipes::step()  masks stats::step()
• Use suppressPackageStartupMessages() to eliminate package startup messages
tidymodels_prefer()

linear_reg() |> 
  set_engine("lm") |> 
  set_mode("regression")
Linear Regression Model Specification (regression)

Computational engine: lm 
logistic_reg() |> 
    set_engine("glmnet") |> 
    set_mode("classification")
Logistic Regression Model Specification (classification)

Computational engine: glmnet 
linear_reg() |>
    set_engine("stan")  |> 
    set_mode("regression")
Linear Regression Model Specification (regression)

Computational engine: stan 

Especificar el modelo en tidymodels

Tip

library(): cargar el paquete tidymodels.

tidymodels_prefer(): establecer el paquete tidymodels como el preferido.

linear_reg(): Crear una especificación de modelo de regresión lineal en el marco de tidymodels.

logistic_reg() : Crear una especificación de modelo de regresión logística en el marco de tidymodels.

set_engine(): establecer el motor (paquete) de cálculo del modelo. Se utilizará “lm” para el primer modelo, “glmnet” para el segundo y “stan” para el tercero.

Estimar un modelo

Estimar un modelo de regresión logística para evaluar la asociación entre el consumo de alcohol y los factores de riesgo

Descriptivos

── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
✔ forcats   1.0.0     ✔ readr     2.1.4
✔ lubridate 1.9.3     ✔ stringr   1.5.1
── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
✖ readr::col_factor() masks scales::col_factor()
✖ purrr::discard()    masks scales::discard()
✖ dplyr::filter()     masks stats::filter()
✖ stringr::fixed()    masks recipes::fixed()
✖ dplyr::lag()        masks stats::lag()
✖ readr::spec()       masks yardstick::spec()
ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors


Calcular la tabla de descriptivos

mini_datos |>
    select(PYALC,factores_de_riesgo) |>
    table1::table1( ~ ., data=_)
Warning: Using an external vector in selections was deprecated in tidyselect 1.1.0.
ℹ Please use `all_of()` or `any_of()` instead.
  # Was:
  data %>% select(factores_de_riesgo)

  # Now:
  data %>% select(all_of(factores_de_riesgo))

See <https://tidyselect.r-lib.org/reference/faq-external-vector.html>.
Overall
(N=12507)
PYALC
No ha consumido 3647 (29.2%)
Sí ha consumido 8860 (70.8%)
CRPAD
Mean (SD) 2.13 (0.855)
Median [Min, Max] 2.00 [1.00, 4.00]
CRLNFD
Mean (SD) 2.18 (0.536)
Median [Min, Max] 2.17 [1.00, 4.00]
FRPFD
Mean (SD) 1.37 (0.484)
Median [Min, Max] 1.33 [1.00, 4.00]
FRPFM
Mean (SD) 1.73 (0.534)
Median [Min, Max] 1.75 [0.875, 4.00]
SRLCS
Mean (SD) 2.19 (0.446)
Median [Min, Max] 2.14 [1.00, 4.86]
PRFAD
Mean (SD) 1.72 (0.677)
Median [Min, Max] 1.50 [1.00, 4.00]
PRATA
Mean (SD) 1.53 (0.583)
Median [Min, Max] 1.40 [1.00, 4.00]

Calcular la tabla de descriptivos por grupo (Sí y No ha consumido)

mini_datos |>
    select(PYALC,factores_de_riesgo) |>
    filter(!is.na(PYALC)) |> 
    table1::table1( ~ . | PYALC, data=_)
No ha consumido
(N=3647)
Sí ha consumido
(N=8860)
Overall
(N=12507)
CRPAD
Mean (SD) 1.79 (0.810) 2.27 (0.833) 2.13 (0.855)
Median [Min, Max] 1.50 [1.00, 4.00] 2.25 [1.00, 4.00] 2.00 [1.00, 4.00]
CRLNFD
Mean (SD) 2.00 (0.569) 2.26 (0.503) 2.18 (0.536)
Median [Min, Max] 2.00 [1.00, 4.00] 2.20 [1.00, 4.00] 2.17 [1.00, 4.00]
FRPFD
Mean (SD) 1.16 (0.394) 1.46 (0.491) 1.37 (0.484)
Median [Min, Max] 1.00 [1.00, 4.00] 1.33 [1.00, 4.00] 1.33 [1.00, 4.00]
FRPFM
Mean (SD) 1.58 (0.554) 1.79 (0.513) 1.73 (0.534)
Median [Min, Max] 1.50 [1.00, 4.00] 1.75 [0.875, 4.00] 1.75 [0.875, 4.00]
SRLCS
Mean (SD) 2.08 (0.431) 2.24 (0.443) 2.19 (0.446)
Median [Min, Max] 2.00 [1.00, 4.86] 2.17 [1.00, 4.57] 2.14 [1.00, 4.86]
PRFAD
Mean (SD) 1.37 (0.551) 1.87 (0.672) 1.72 (0.677)
Median [Min, Max] 1.00 [1.00, 4.00] 1.75 [1.00, 4.00] 1.50 [1.00, 4.00]
PRATA
Mean (SD) 1.37 (0.515) 1.60 (0.596) 1.53 (0.583)
Median [Min, Max] 1.20 [1.00, 4.00] 1.40 [1.00, 4.00] 1.40 [1.00, 4.00]

Explorar los datos visualmente

Hacer un gráfico para ver tendencias en los factores de riesgo

mini_datos |> 
 select(PYALC,factores_de_riesgo) |>
  pivot_longer(-PYALC) |> 
  ggplot(aes(value, fct_reorder(name, value), fill = PYALC)) +
  geom_boxplot()

Especificar el modelo

1. Especificar el modelo

Especificar un modelo de regresión logística. Se establece el “paquete”, en este caso “glm” y opciones del paquete (la distribución de la variable de respuesta). Además, se especifica que es un problema de “classification”, debido a que la variable dependiente es categórica. Todo esto se almacena en el objeto lm_model.


lm_model <-
    logistic_reg() %>% 
    set_engine("glm", family="binomial") |>
    set_mode("classification")

2. Estimar el modelo

Aquí se estima el modelo con la función fit(). Se especifica la variable de resultado (PYALC) y los predictores (.). Se utiliza el objeto mini_datos como base de datos.


lm_results <- lm_model |>
    fit(PYALC ~ ., data = mini_datos)

3. Obtener los resultados del modelo

Obtener los coeficientes (betas) del modelo

lm_results |> tidy() 
# A tibble: 15 × 5
   term           estimate std.error statistic   p.value
   <chr>             <dbl>     <dbl>     <dbl>     <dbl>
 1 (Intercept)    -5.28      0.177    -29.8    9.45e-196
 2 CRPAD           0.182     0.0305     5.98   2.24e-  9
 3 CRLNFD          0.230     0.0463     4.96   6.98e-  7
 4 FRPFD           1.01      0.0695    14.5    8.78e- 48
 5 FRPFM           0.132     0.0466     2.83   4.68e-  3
 6 SRLCS           0.241     0.0553     4.37   1.26e-  5
 7 PRFAD           0.907     0.0558    16.3    1.88e- 59
 8 PRATA          -0.288     0.0559    -5.15   2.67e-  7
 9 YEAR2014       -0.00523   0.0550    -0.0951 9.24e-  1
10 YEAR2015       -0.354     0.0872    -4.06   4.93e-  5
11 YEAR2016       -0.154     0.0970    -1.59   1.13e-  1
12 YEAR2017       -0.341     0.0706    -4.84   1.32e-  6
13 GRADE           0.299     0.0162    18.4    1.04e- 75
14 GENDERFemenino -0.0302    0.0448    -0.675  5.00e-  1
15 AGE            -0.00150   0.00456   -0.329  7.42e-  1

Obtener los índices de ajuste del modelo

lm_results |> glance()
# A tibble: 1 × 8
  null.deviance df.null logLik    AIC    BIC deviance df.residual  nobs
          <dbl>   <int>  <dbl>  <dbl>  <dbl>    <dbl>       <int> <int>
1        15098.   12506 -6141. 12313. 12424.   12283.       12492 12507

3. Obtener los resultados del modelo

Tip

tidy(): Esta función se utiliza para convertir los resultados de un modelo en un marco de datos “ordenado” que muestra los coeficientes del modelo, los errores estándar, los valores t y los valores p para cada variable independiente.

glance(): Esta función se utiliza para resumir los resultados de un modelo como estadísticas globales del modelo, por ejemplo, R-cuadrado ajustado, el AIC y el BIC.

tidy(exp=TRUE, conf.int=TRUE): Esta función se utiliza para convertir los resultados de un modelo en un marco de datos “ordenado” que muestra los coeficientes del modelo, los errores estándar, los valores t y los valores p para cada variable independiente. Los argumentos exp y conf.int se utilizan para incluir los intervalos de confianza y los exponentes en los resultados

lm_results |> tidy(exp=TRUE, conf.int=TRUE)
# A tibble: 15 × 7
   term           estimate std.error statistic   p.value conf.low conf.high
   <chr>             <dbl>     <dbl>     <dbl>     <dbl>    <dbl>     <dbl>
 1 (Intercept)     0.00511   0.177    -29.8    9.45e-196  0.00360   0.00721
 2 CRPAD           1.20      0.0305     5.98   2.24e-  9  1.13      1.27   
 3 CRLNFD          1.26      0.0463     4.96   6.98e-  7  1.15      1.38   
 4 FRPFD           2.74      0.0695    14.5    8.78e- 48  2.40      3.15   
 5 FRPFM           1.14      0.0466     2.83   4.68e-  3  1.04      1.25   
 6 SRLCS           1.27      0.0553     4.37   1.26e-  5  1.14      1.42   
 7 PRFAD           2.48      0.0558    16.3    1.88e- 59  2.22      2.77   
 8 PRATA           0.750     0.0559    -5.15   2.67e-  7  0.672     0.837  
 9 YEAR2014        0.995     0.0550    -0.0951 9.24e-  1  0.893     1.11   
10 YEAR2015        0.702     0.0872    -4.06   4.93e-  5  0.592     0.833  
11 YEAR2016        0.857     0.0970    -1.59   1.13e-  1  0.709     1.04   
12 YEAR2017        0.711     0.0706    -4.84   1.32e-  6  0.619     0.816  
13 GRADE           1.35      0.0162    18.4    1.04e- 75  1.31      1.39   
14 GENDERFemenino  0.970     0.0448    -0.675  5.00e-  1  0.889     1.06   
15 AGE             0.999     0.00456   -0.329  7.42e-  1  0.990     1.01   

Práctica

  1. Estime la asociación entre el consumo de marihuana en los últimos 30 días (MAR30DY), a partir de los factores de riesgo.

Parte II

Para qué necesitamos los datos?

Necesitamos:

- Estimar parametros
- Seleccionar modelos
- Sintonizar los modelos (tunning)
- Evaluar los modelos

¿Cómo gastarnos los datos de una forma que sea eficiente para todos estos pasos? (validación empírica)

Primera idea

Dividir los datos en dos conjuntos. Uno para entrenar el modelo y otro para evaluarlo.

Dividir los datos

Dividir los datos en dos conjuntos

Entrenamiento:

  • La mayoría de los datos (¿70%, 80%?)
  • Aquí se ajusta el modelo

Prueba:

  • Un pequeño conjunto de datos
  • Aquí se evaluará el modelo final

Los datos de prueba se utilizan una sola vez, si se utilizan más de una vez, se convierten en parte del proceso de entrenamiento.

Note

La división de los datos se hace al nivel de unidad independiente de observación.

Esto no puede pasar: contaminación de los datos de prueba (information leakage)

Dividir los datos

Crear dos bases: entrenamiento 80% y prueba 20%

set.seed(1234)

datos_divididos <- initial_split(mini_datos, prop = 0.8, strata = "PYALC")

datos_entrenamiento <- training(datos_divididos)
datos_prueba <- testing(datos_divididos)
  • La opción strata es para que los datos de entrenamiento y prueba tengan la misma distribución de la variable PYALC

A veces la selección aleatoria de la muestra es problemática, por ejemplo cuando hay una componente de tiempo en los datos. En este caso, se puede usar la función initial_time_split().

Dividir los datos

set.seed(): establecer una semilla para la generación de números aleatorios en R. En este caso, se utiliza para establecer la semilla en 1234, lo que garantiza que los resultados sean reproducibles. Esto es especialmente importante cuando se trabaja con modelos de aprendizaje automático, ya que los resultados pueden variar según la semilla utilizada para la generación de números aleatorios.

initial_split(): dividir los datos en conjuntos de entrenamiento y prueba. Divide el objeto “mini_datos” en conjuntos de entrenamiento y prueba en una proporción de 80/20, y estratificando por la columna “PYALC”.

training(): extraer el conjunto de entrenamiento de un objeto creado con la función initial_split(). Se utiliza para extraer el conjunto de entrenamiento del objeto “datos_divididos”.

testing(): extraer el conjunto de prueba de un objeto creado con la función initial_split(). Se utiliza para extraer el conjunto de prueba del objeto “datos_divididos”.

Dividir los datos

Descripivos de los datos de entrenamiento

datos_entrenamiento |>
    select(PYALC,factores_de_riesgo) |>
    table1::table1( ~ ., data=_)
Overall
(N=10005)
PYALC
No ha consumido 2917 (29.2%)
Sí ha consumido 7088 (70.8%)
CRPAD
Mean (SD) 2.13 (0.855)
Median [Min, Max] 2.00 [1.00, 4.00]
CRLNFD
Mean (SD) 2.18 (0.535)
Median [Min, Max] 2.17 [1.00, 4.00]
FRPFD
Mean (SD) 1.37 (0.477)
Median [Min, Max] 1.33 [1.00, 4.00]
FRPFM
Mean (SD) 1.73 (0.533)
Median [Min, Max] 1.75 [0.875, 4.00]
SRLCS
Mean (SD) 2.19 (0.446)
Median [Min, Max] 2.14 [1.00, 4.86]
PRFAD
Mean (SD) 1.73 (0.676)
Median [Min, Max] 1.50 [1.00, 4.00]
PRATA
Mean (SD) 1.53 (0.582)
Median [Min, Max] 1.40 [1.00, 4.00]
datos_prueba |>
    select(PYALC,factores_de_riesgo) |>
    table1::table1( ~ ., data=_)
Overall
(N=2502)
PYALC
No ha consumido 730 (29.2%)
Sí ha consumido 1772 (70.8%)
CRPAD
Mean (SD) 2.13 (0.857)
Median [Min, Max] 2.00 [1.00, 4.00]
CRLNFD
Mean (SD) 2.19 (0.542)
Median [Min, Max] 2.17 [1.00, 4.00]
FRPFD
Mean (SD) 1.38 (0.509)
Median [Min, Max] 1.33 [1.00, 4.00]
FRPFM
Mean (SD) 1.73 (0.539)
Median [Min, Max] 1.63 [1.00, 4.00]
SRLCS
Mean (SD) 2.19 (0.445)
Median [Min, Max] 2.14 [1.00, 4.14]
PRFAD
Mean (SD) 1.71 (0.682)
Median [Min, Max] 1.50 [1.00, 4.00]
PRATA
Mean (SD) 1.52 (0.586)
Median [Min, Max] 1.40 [1.00, 4.00]

1. Especificar el modelo

No es necesario volver a especificar el modelo, ya que ya lo hicimos en la parte I. Pero si lo hiciéramos, sería de la siguiente manera:

lm_model <-
  logistic_reg() %>%
  set_engine("glm", family = "binomial") |>
  set_mode("classification")

2. Estimar el modelo

Estimar el modelo con la función fit(). Se especifica la variable de resultado (PYALC) y los predictores (.). Se utiliza el objeto datos_entrenamiento como base de datos.

lm_results <- lm_model |>
    fit(PYALC ~ ., data = datos_entrenamiento)

3. Obtener los resultados del modelo

Obtener los coeficientes (betas) del modelo en OR con sus intervalos de confianza.

lm_results |> tidy(exp=TRUE, conf.int=TRUE)
# A tibble: 15 × 7
   term           estimate std.error statistic   p.value conf.low conf.high
   <chr>             <dbl>     <dbl>     <dbl>     <dbl>    <dbl>     <dbl>
 1 (Intercept)     0.00472   0.198     -27.0   4.20e-161  0.00319   0.00694
 2 CRPAD           1.20      0.0340      5.43  5.71e-  8  1.13      1.29   
 3 CRLNFD          1.25      0.0519      4.34  1.43e-  5  1.13      1.39   
 4 FRPFD           2.82      0.0785     13.2   6.81e- 40  2.42      3.30   
 5 FRPFM           1.14      0.0523      2.44  1.46e-  2  1.03      1.26   
 6 SRLCS           1.28      0.0617      3.94  8.09e-  5  1.13      1.44   
 7 PRFAD           2.52      0.0625     14.8   1.87e- 49  2.23      2.85   
 8 PRATA           0.746     0.0623     -4.71  2.47e-  6  0.660     0.843  
 9 YEAR2014        0.983     0.0616     -0.270 7.87e-  1  0.871     1.11   
10 YEAR2015        0.685     0.0973     -3.89  9.97e-  5  0.566     0.829  
11 YEAR2016        0.844     0.110      -1.53  1.25e-  1  0.681     1.05   
12 YEAR2017        0.717     0.0791     -4.21  2.53e-  5  0.614     0.837  
13 GRADE           1.35      0.0182     16.4   9.64e- 61  1.30      1.40   
14 GENDERFemenino  0.971     0.0503     -0.579 5.63e-  1  0.880     1.07   
15 AGE             1.00      0.00558     0.172 8.64e-  1  0.991     1.01   

4. Evaluar el modelo

4. Evaluar el modelo

Hay varias formas de evaluar un modelo. Algunas de las más comunes son: - Métricas de ajuste - Área bajo la curva (AUC) - Sensibilidad y especificidad - Matrices de confusión …

Dado que nuestro objevito es predecir el consumo de alcohol, vamos a utilizar las métricas que evaluen el modelo según su desempeño en la clasificación de observaciones (accuracy o exactitud).

4. Evaluar el modelo

Utilizar el modelo para predecir los valores de la variable dependiente en los datos de entrenamiento.

predecir_estos_valores <- datos_entrenamiento  |>  
    select(-PYALC)  |> 
    slice(1:10)

predict(lm_results, predecir_estos_valores)
# A tibble: 10 × 1
   .pred_class    
   <fct>          
 1 Sí ha consumido
 2 No ha consumido
 3 No ha consumido
 4 Sí ha consumido
 5 Sí ha consumido
 6 Sí ha consumido
 7 Sí ha consumido
 8 No ha consumido
 9 Sí ha consumido
10 Sí ha consumido

Obtener las predicciones en forma de probabilidades

predict(lm_results, predecir_estos_valores, type="prob")
# A tibble: 10 × 2
   `.pred_No ha consumido` `.pred_Sí ha consumido`
                     <dbl>                   <dbl>
 1                  0.437                    0.563
 2                  0.635                    0.365
 3                  0.745                    0.255
 4                  0.328                    0.672
 5                  0.275                    0.725
 6                  0.313                    0.687
 7                  0.0875                   0.912
 8                  0.583                    0.417
 9                  0.493                    0.507
10                  0.325                    0.675

4. Evaluar el modelo

Obtener las predicciones y los valores observadods para calcular algunas métricas.

entrenamiento <- datos_entrenamiento %>% 
    select(-PYALC)

prediccion <- predict(lm_results, entrenamiento)

resultados_prueba <- cbind(prediccion, datos_entrenamiento) |> 
  select(.pred_class, PYALC, everything()) |> 
  tibble()

resultados_prueba
# A tibble: 10,005 × 13
   .pred_class     PYALC  CRPAD CRLNFD FRPFD FRPFM SRLCS PRFAD PRATA YEAR  GRADE
   <fct>           <fct>  <dbl>  <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <fct> <dbl>
 1 Sí ha consumido No ha…  4      2     1     1.62  1.86  1      1   2014      7
 2 No ha consumido No ha…  1      2     1     2     2.17  1      1.2 2017      7
 3 No ha consumido No ha…  1      2.2   1     1.25  1.6   1      1.2 2017      6
 4 Sí ha consumido No ha…  1      1.67  1     1.12  2.43  1.5    1.2 2012…     9
 5 Sí ha consumido No ha…  3.75   2.33  1     2     2.43  1.25   1   2014      8
 6 Sí ha consumido No ha…  3.25   1.67  1.33  1.62  1.86  1.5    1.2 2014      7
 7 Sí ha consumido No ha…  1.75   1.8   2     2     1.67  2      2   2017     11
 8 No ha consumido No ha…  1      3.4   1     4     1.83  1      1   2017      6
 9 Sí ha consumido No ha…  2.75   2.17  1     1.5   3.29  1      1.2 2014      6
10 Sí ha consumido No ha…  1      1.8   1     2.29  1.86  1.75   1   2014      8
# ℹ 9,995 more rows
# ℹ 2 more variables: GENDER <fct>, AGE <dbl>

Métricas

Métricas

Exactitud (accuracy): Es una métrica que mide la proporción de predicciones correctas realizadas por un modelo en comparación con el total de predicciones realizadas. Es decir, la cantidad de veces que el modelo acertó sobre el total de datos que se le presentaron.

Sensibilidad (sensitivity/recall): Es la proporción de verdaderos positivos (TP) que son identificados correctamente por el modelo en relación con el total de verdaderos positivos y falsos negativos (FN). La sensibilidad mide la capacidad del modelo para detectar correctamente los casos positivos.

Especificidad (Specificity): Es la proporción de verdaderos negativos (TN) que son identificados correctamente por el modelo en relación con el total de verdaderos negativos y falsos positivos (FP). La especificidad mide la capacidad del modelo para detectar correctamente los casos negativos.

Métricas

Precision (Precisión): Es la proporción de verdaderos positivos (TP) que son identificados correctamente por el modelo en relación con el total de verdaderos positivos y falsos positivos (FP). La precisión mide la capacidad del modelo para no identificar falsamente un caso como positivo.

F-measure (Puntuación F): Es una métrica que combina la precisión y el recall en una sola puntuación. El valor de la F-measure oscila entre 0 y 1, siendo 1 el valor óptimo.

Kappa (Coeficiente Kappa): Es una medida de concordancia que compara la cantidad de acuerdos observados entre el modelo y las observaciones reales con la cantidad de acuerdos que se esperarían por casualidad. Un valor de kappa cercano a 1 indica una concordancia casi perfecta entre el modelo y las observaciones reales.

Métricas

Calcular las métricas

Con los datos observados y los predichos, se pueden calcular las métricas del modelo.

conf_mat(resultados_prueba, truth = PYALC,
         estimate = .pred_class)
                 Truth
Prediction        No ha consumido Sí ha consumido
  No ha consumido            1394             730
  Sí ha consumido            1523            6358
accuracy(resultados_prueba, truth = PYALC,
         estimate = .pred_class)
# A tibble: 1 × 3
  .metric  .estimator .estimate
  <chr>    <chr>          <dbl>
1 accuracy binary         0.775
sens(resultados_prueba, truth = PYALC,
    estimate = .pred_class, event_level = "second")
# A tibble: 1 × 3
  .metric .estimator .estimate
  <chr>   <chr>          <dbl>
1 sens    binary         0.897

Calcular las métricas

Más métricas

spec(resultados_prueba, truth = PYALC,
    estimate = .pred_class, event_level = "second")
# A tibble: 1 × 3
  .metric .estimator .estimate
  <chr>   <chr>          <dbl>
1 spec    binary         0.478
precision(resultados_prueba, truth = PYALC,
    estimate = .pred_class)
# A tibble: 1 × 3
  .metric   .estimator .estimate
  <chr>     <chr>          <dbl>
1 precision binary         0.656
recall(resultados_prueba, truth = PYALC,
    estimate = .pred_class, event_level="second")
# A tibble: 1 × 3
  .metric .estimator .estimate
  <chr>   <chr>          <dbl>
1 recall  binary         0.897
kap(resultados_prueba, truth = PYALC,
    estimate = .pred_class)
# A tibble: 1 × 3
  .metric .estimator .estimate
  <chr>   <chr>          <dbl>
1 kap     binary         0.407

Calcular las métricas

Calcular todas las métricas y guardarlas en una base de datos

custom_metrics <- metric_set(accuracy, sens, spec, precision, recall, f_meas, kap, mcc)

lm_metrics  <- custom_metrics(resultados_prueba,
  truth = PYALC,
  estimate = .pred_class, 
  event_level = "second"
)  |> 
mutate(model= "Regresión Logística")

Tabla de Métricas

library(gt)

custom_metrics(resultados_prueba,
  truth = PYALC,
  estimate = .pred_class
) |> gt()
.metric .estimator .estimate
accuracy binary 0.7748126
sens binary 0.4778882
spec binary 0.8970090
precision binary 0.6563089
recall binary 0.4778882
f_meas binary 0.5530649
kap binary 0.4074916
mcc binary 0.4166529

Área bajo la curva

El área bajo la curva (AUC) es una métrica que mide la capacidad de un modelo para distinguir entre dos clases. En el caso de un modelo de regresión logística, el AUC mide la capacidad del modelo para distinguir entre los que han consumido alcohol y los que no.

prediccion_auc <- predict(lm_results, entrenamiento, type = "prob")

resultados_prueba_auc <- cbind(prediccion_auc, datos_entrenamiento) |>
  tibble()

roc_auc(resultados_prueba_auc,
  truth = PYALC,
  `.pred_Sí ha consumido`,
  event_level = "second"
)
# A tibble: 1 × 3
  .metric .estimator .estimate
  <chr>   <chr>          <dbl>
1 roc_auc binary         0.795
roc_curve(resultados_prueba_auc,
  truth = PYALC,
   `.pred_Sí ha consumido`,
  event_level = "second"
) |> autoplot()

Práctica

¿Cuál es la exactitud y la sensibilidad del modelo que estimaron en la práctica anterior?

¿Podemos encontrar un modelo que sea mejor que el anterior?