R para la programación en Bioestadística y Ciencia de Datos: data frames

R medicine 2024

Authors

Francisco Cardozo

Catalina Cañizares

Micaela Lembo

Published

June 6, 2024

Antes de comenzar con el análisis es importante definir la organización de los archivos del proyecto. Una estructura bien definida nos ayudará a localizar fácilmente los archivos y facilitará la reproducibilidad del análisis. Por ejemplo, en este proyecto vamos a tener una carpeta principal llamada “Rmed-101-esp” que contendrá las siguientes carpetas:

data: base de datos para analizar en este taller.

scripts: scripts con código escrito en R.

img: imágenes previas o generadas durante el análisis.

Archivos en data

Vamos a utilizar una base de datos en formato excel descargado de la página datos abiertos del gobierno de Colombia. Esta base contiene información sobre atenciones en los servicios de salud a la población migrante en la ciudad de Bucaramanga, la cual se encuentra ubicada cerca a la frontera entre Colombia y Venezuela.

La base de datos contiene más de 200 mil registros de atenciones a la población migrante reportadas por diferentes prestadores de servicios de salud de la ciudad.

Nos interesa saber si el número de atenciones prestadas a la población migrante ha tenido algún cambio entre los años 2017 y 2021.

Para responder esto, debemos cumplir varios pasos, como por ejemplo, limpiar y organizar la base de datos. En este taller, vamos a hacer el análisis completo para responder a esta pregunta.

Archivos en scripts

Necesitamos crear un archivo con formato .qmd en la carpeta scripts. El nombre del archivo va a ser “atenciones_migrantes.qmd”. El título del documento puede ser “Informe sobre atenciones a la población migrante en la ciudad de Bucaramanga.”

Instalar los paquetes

En primer lugar debemos instalar los siguientes paquetes para utilizar sus funciones durante este taller.

install.packages("here") # Paquete para gestionar rutas de archivos
install.packages("tidyverse") # Paquete principal para el análisis de datos
install.packages("janitor") # Paquete para limpiar la base de datos
install.packages("readxl") # Paquete para leer archivos excel

Cargar los paquetes

Una de las ventajas de R es la disponibilidad de paquetes creados para hacer la vida de los investigadores más fácil. Un paquete es un conjunto de funciones y datos que se pueden instalar y cargar en R para realizar tareas específicas. En este caso, vamos a cargar los paquetes necesarios para importar los datos y para analizarlos.

Para cargar un paquete en R, se utiliza la función library(). En este caso, vamos a cargar los paquetes here, tidyverse, janitor y readxl.

library(here) # Paquete para gestionar rutas de archivos
library(tidyverse) # Paquete principal para el análisis de datos
library(janitor) # Paquete para limpiar la base de datos
library(readxl) # Paquete para leer archivos excel

Importar la base de datos

A continuación, vamos a importar los datos a R y los vamos a guardar en un objeto llamado atenciones_migrantes. Para hacer esto, vamos a utilizar la función read_xlsx() del paquete readxl.

Una de las cosas más atractivas de R es que podemos utilizar archivos Quarto, que nos permiten combinar código y texto en un solo documento. Para importar los datos y correr el código vamos a crear un chunk. Al interior de los chunks todo es interpreatdo como código. Para crear el chunk con el teclado los usuarios de Mac presionan Option + Command + I, los usuarios de Windows Ctrl + Alt + I

Ahora, para “correr” el código podemos presionar el triángulo verde en el chunk o podemos poner el cursor en cualquier lugar de la línea del código. Los usuarios de Mac presionan Command + enter, los usuarios de Windows Ctrl + enter

No estamos familiarizados con la base de datos, por lo que vamos a explorarla un poco. Por ejemplo, podemos identificar cuántas columnas y filas tiene la base de datos, así como los nombres de las columnas.

atenciones_migrantes <- read_xlsx("data/atenciones_migrantes.xlsx")

Si solo escribimos el nombre del objetivo, vamos a tener una vista general de la base de datos.

atenciones_migrantes
# A tibble: 234,824 × 11
   MES            Año FECHA_CARGO         tipo_de_servicio SERVICIO ESPECIALIDAD
   <chr>        <dbl> <dttm>              <chr>            <chr>    <chr>       
 1 12. Diciemb…  2017 2017-04-12 00:00:00 Laboratorio      37105 M… IMAGENOLOGI…
 2 12. Diciemb…  2017 2017-04-12 00:00:00 Laboratorio      37105 M… IMAGENOLOGI…
 3 07. Julio     2017 2017-07-20 00:00:00 Laboratorio      37105 M… IMAGENOLOGI…
 4 07. Julio     2017 2017-07-20 00:00:00 Laboratorio      37105 M… IMAGENOLOGI…
 5 08. Agosto    2017 2017-10-08 00:00:00 Laboratorio      37105 M… IMAGENOLOGI…
 6 08. Agosto    2017 2017-10-08 00:00:00 Laboratorio      37105 M… IMAGENOLOGI…
 7 08. Agosto    2017 2017-08-13 00:00:00 Laboratorio      37105 M… IMAGENOLOGI…
 8 08. Agosto    2017 2017-08-13 00:00:00 Laboratorio      37105 M… IMAGENOLOGI…
 9 09. Septiem…  2017 2017-01-09 00:00:00 Laboratorio      37105 M… IMAGENOLOGI…
10 09. Septiem…  2017 2017-01-09 00:00:00 Laboratorio      37105 M… IMAGENOLOGI…
# ℹ 234,814 more rows
# ℹ 5 more variables: CANTIDAD <dbl>, VALOR_SERVICIO <dbl>, LUGAR <chr>,
#   `Curso de vida` <chr>, Sexo <chr>

Al haber utilizado read_xlsx(), la base de datos se ha guardado en un objeto de tipo tibble, que es una estructura de datos similar a un data.frame pero con algunas mejoras. Por ejemplo, los tibbles no convierten el texto en factores y muestran las dimensiones del objeto de manera más accesible. En nuesetro caso, la base de datos contiene 234.824 filas, que corresponden a las atenciones prestadas a la población migrante, y 11 columnas, que corresponden a las variables capturadas por los prestadores de servicios.

Si quieremos ver los nombres de las columnas, podemos hacerlo de la siguiente manera:

atenciones_migrantes |>
  names()
 [1] "MES"              "Año"              "FECHA_CARGO"      "tipo_de_servicio"
 [5] "SERVICIO"         "ESPECIALIDAD"     "CANTIDAD"         "VALOR_SERVICIO"  
 [9] "LUGAR"            "Curso de vida"    "Sexo"            

Esto |> o %>% es llamado pipe y puede leerse en español como “después”. Un pipe es un operador que permite encadenar funciones, lo que hace que nuestro código sea mucho más fácil de leer y de escribir. Si quisieramos leer el chunk anterior, sería algo como: abre el objecto atenciones_migrantes, después, muestra los nombres de las columnas. Para crear un “pipe” los usuarios de mac pueden presionar en el teclado Cmd + Shift + M. Los usuarios de Windows: Ctrl + Shift + M.

Aunque los nombres son claros, hay algunas que debemos cambiar. Por ejemplo, los nombres de las columnas contienen espacios y caracteres especiales, lo que puede generar algunos problemas en el futuro. Además, no se utilizaron de manera consistente las minúsculas y mayúsculas. Una forma de arreglarlo es utilizando un estilo para nombrar variables. Existen diferentes formatos que se pueden consultar aquí: naming conventions.

Vamos a limpiar los nombres de las columnas utilizando la función clean_names() del paquete janitor. Este paquete utiliza formato snake_case, que es un estilo de escritura en el que las palabras se separan por guiones bajos y todas las letras son minúsculas.

atenciones_migrantes <- atenciones_migrantes |>
  clean_names()

atenciones_migrantes |> names()
 [1] "mes"              "ano"              "fecha_cargo"      "tipo_de_servicio"
 [5] "servicio"         "especialidad"     "cantidad"         "valor_servicio"  
 [9] "lugar"            "curso_de_vida"    "sexo"            

Ahora, tratemos de identificar las variables de interés para el análisis. Queremos saber si las atenciones prestadas a la población migrante han tenido algún cambio entre los años 2017 y 2021. Entonces, podemos ignorar por ahora información como las categorías de servicios prestados.

Utilizaremos la función select() para seleccionar las columnas de interés y olivdar todo lo demás. En este caso, solo nos interesa la columna ano. Una vez la selecionamos, podemos contar cuantas atenciones se prestaron en cada año. Para esto, utilizamos la función count()

atenciones_migrantes |> # El nombre de los datos
  select(ano) |> # Seleccionamos la columna de interes
  count(ano) # Contamos cuantas atenciones se prestaron en cada año
# A tibble: 9 × 2
    ano     n
  <dbl> <int>
1  2014     2
2  2015     4
3  2016    72
4  2017  8754
5  2018 26498
6  2019 65553
7  2020 49527
8  2021 78849
9  2022  5565

Observamos que la base de datos contiene atenciones desde los años 2014 hasta el 2022. Sin embargo, solo vamos a concentrarnos en los años 2017 a 2021. Entonces, vamos a ignorar esa información. Hay que tener en cuenta que en este caso, la información que queremos ignorar está en la misma columna, por lo que select() no es una opción, ya que esta sirve para seleccionar columnas. Para seleccionar las atenciones prestadas en estos años, podemos utilizar la función filter(). Esta función nos permite seleccionar valores específicos al interior de una columna.

atenciones_migrantes |>
  select(ano) |>
  filter(ano >= 2017 & ano <= 2021) |>
  count(ano)
# A tibble: 5 × 2
    ano     n
  <dbl> <int>
1  2017  8754
2  2018 26498
3  2019 65553
4  2020 49527
5  2021 78849

Ahora que tenemos solo las atenciones prestadas en los años de interés, podemos calcular el porcentaje para cada año. Para hacer esto, vamos a utilizar la función mutate() que nos va a permitir crear una nueva columna llamada porcentaje. Esta columna va a contener porcentaje de atenciones en cada año.

atenciones_migrantes |>
  select(ano) |>
  filter(ano >= 2017 & ano <= 2021) |>
  count(ano) |>
  mutate(porcentaje = n / sum(n) * 100)
# A tibble: 5 × 3
    ano     n porcentaje
  <dbl> <int>      <dbl>
1  2017  8754       3.82
2  2018 26498      11.6 
3  2019 65553      28.6 
4  2020 49527      21.6 
5  2021 78849      34.4 

¿Cómo obtener el porcentaje solo para los años 2017, 2019, 2021?

Para obtener el porcentaje solo para los años 2017, 2019 y 2021, podemos utilizar la función filter() para seleccionar solo las filas correspondientes a estos años. Podemos utilizar el operador %in% para seleccionar los años de interés. Por ejemplo, filter(ano %in% c(2017, 2019, 2021)) seleccionará solo las filas correspondientes a los años 2017, 2019 y 2021.

Una vez construida la tabla de porcentajes, podemos visualizarla en un gráfico. Vamos a utilizar la función ggplot() del paquete ggplot2 para crear un gráfico de líneas que muestre el porcentaje de atenciones prestadas en cada año.

atenciones_migrantes |>
  select(ano) |>
  filter(ano >= 2017 & ano <= 2021) |>
  count(ano) |>
  mutate(porcentaje = n / sum(n) * 100) |>
  ggplot(aes(x = ano, y = porcentaje, group = 1)) +
  geom_line() +
  geom_point() +
  labs(
    title = "Porcentaje de atenciones prestadas a población migrante en Bucaramanga",
    x = "Año",
    y = "Porcentaje de atenciones"
  )

ggplot2() es una de las herramientas más atractivas de R debido a su flexibilidad y capacidad para crear gráficos de alta calidad. En este caso, hemos utilizado ggplot() para crear un gráfico de líneas que muestra el porcentaje de atenciones prestadas a la población migrante en Bucaramanga entre los años 2017 y 2021. Hemos utilizado geom_line() para trazar la línea y geom_point() para agregar los puntos al gráfico. También, hemos utilizado labs() para agregar títulos a los ejes y al gráfico.

Cambie el color de las líneas y de los puntos en el gráfico.

Para cambiar el color podemos utilizar el argumento “color” en la función geom_*. Tenga en cuenta que si especifica el lugar por fuera de la función aes() podrá especificar el color directamente. Si lo hace dentro, el color cambiará de acuerdo a la información de la base de datos. En ese caso, puede cambiar el color agregando la función scale_color_manual() a su ggplot.

Agrege la funcionción theme_minimal() para cambiar el formato del gráfico. Explore otros formatos disponibles en ggplot2 aquí: themes

Al final del gráfico agregue el símbolo + seguido de theme_minimal(). Tenga en cuenta que los formatos del gráfico son altamente modificables. Usted puede cambiar colores, líneas, tamaños de letra, entre otros.

Se observa un incremento de las atenciones a traves del tiempo. Sin embargo, sería más interesante saber si este incremento es similar para hombres y mujeres. Para hacer esto, vamos a utilizar nuevamente la función count() pero esta vez vamos a especificar dos variables para contar el número de atenciones. Además, vamos a calcular el porcentaje de atenciones para cada sexo. Para esto, vamos a agregar la opción .by a la función mutate.

atenciones_migrantes |>
  select(ano, sexo) |>
  filter(ano >= 2017 & ano <= 2021) |>
  count(ano, sexo) |>
  mutate(porcentaje = n / sum(n) * 100, .by = sexo)
# A tibble: 10 × 4
     ano sexo          n porcentaje
   <dbl> <chr>     <int>      <dbl>
 1  2017 Femenino   6811       3.85
 2  2017 Masculino  1943       3.71
 3  2018 Femenino  21743      12.3 
 4  2018 Masculino  4755       9.08
 5  2019 Femenino  50330      28.5 
 6  2019 Masculino 15223      29.1 
 7  2020 Femenino  38857      22.0 
 8  2020 Masculino 10670      20.4 
 9  2021 Femenino  59087      33.4 
10  2021 Masculino 19762      37.7 

Hemos utilizado count() con dos variables, ano y sexo, para contar el número de atenciones prestadas a hombres y mujeres en cada año. Hemos utilizado mutate() para calcular el porcentaje de atenciones prestadas a hombres y mujeres en cada año. La opción .by le ha indicado a mutate() que haga el proceso de suma para cada grupo de manera separada, de tal manera que el porcentaje de atenciónes sumará 100% para hombres y 100% para mujeres.

Ahora, vamos a visualizar estos resultados en un gráfico de líneas utilizando ggplot().

atenciones_migrantes |>
  select(ano, sexo) |>
  filter(ano >= 2017 & ano <= 2021) |>
  count(ano, sexo) |>
  mutate(porcentaje = n / sum(n) * 100, .by = sexo) |>
  ggplot(aes(x = ano, y = porcentaje, group = sexo, color = sexo)) +
  geom_line() +
  geom_point() +
  labs(
    title = "Porcentaje de atenciones prestadas a población migrante en Bucaramanga",
    x = "Año",
    y = "Porcentaje de atenciones",
    color = "Sexo"
  ) +
  scale_color_manual(values = c("blue", "red"))

En este caso, hemos utilizado ggplot() para crear un gráfico de líneas que muestra el porcentaje de atenciones prestadas a la población migrante en Bucaramanga en los años 2017 a 2021, desglosado por sexo. Hemos utilizado el argumento color al interior de la funcion aes(), lo que nos ha permitido separar las líneas según el sexo. La función scale_color_manual() nos permitió cambiar los colores de las líneas y los puntos en el gráfico.

Cambiar el tipo de línea en el gráfico. Por ejemplo, haga que las líenas sean punteadas.

Para cambiar el tipo de línea puede utilizar el argumento linetype al interior de geom_line().

Cambiar el tamaño de los puntos en el gráfico.

Para cambiar el tamaño de los puntos puede utilizar el argumento size al interior del geom_point(). Tenga en cuenta que si especifica el argumento size al interior de la función aes() el tamaño variará de acuerdo con una variable numérica en la base de datos.

Ahora, vamos a explorar un poco más la base de datos. Exploremos la variable tipo_de_servicio. Para hacer esto, vamos a contar cuántas atenciones se han prestado según el tipo de servicio.

atenciones_migrantes |>
  count(tipo_de_servicio)
# A tibble: 16 × 2
   tipo_de_servicio        n
   <chr>               <int>
 1 CONSULTA            60768
 2 Consulta              303
 3 Derecho de Sala         2
 4 Estancia                8
 5 Honorario               4
 6 Imagenologia           23
 7 Interconsulta           5
 8 Laboratorio        100312
 9 OTROS SERVICIOS      6059
10 Otro procedimiento    301
11 Otros servicios       127
12 PROC QUIRURGICO      1931
13 PROCEDIMIENTO       63030
14 Quirurgico              4
15 VACUNACION           1909
16 Vacunas                38

La información no esta muy bien organizada en esta variable. Tenemos valores repetidos, como “CONSULTA” y “Consulta”, que deberían ser considerados como el mismo valor. Para solucionar esto, vamos a convertir todos los valores de la variable tipo_de_servicio a minúsculas utilizando la función str_to_sentence() la cual nos permite mantener en mayuscula la primera letra y en minúscula el resto. Luego, vamos a contar cuántas atenciones se han prestado en cada tipo de servicio.

atenciones_migrantes |>
  mutate(tipo_de_servicio = str_to_sentence(tipo_de_servicio)) |>
  count(tipo_de_servicio)
# A tibble: 14 × 2
   tipo_de_servicio        n
   <chr>               <int>
 1 Consulta            61071
 2 Derecho de sala         2
 3 Estancia                8
 4 Honorario               4
 5 Imagenologia           23
 6 Interconsulta           5
 7 Laboratorio        100312
 8 Otro procedimiento    301
 9 Otros servicios      6186
10 Proc quirurgico      1931
11 Procedimiento       63030
12 Quirurgico              4
13 Vacunacion           1909
14 Vacunas                38

Hemos arreglado la opcion consulta, pero aun hay valores repetidos. Por ejemplo, “Vacunas” y “vacunacion” deberían ser considerados como el mismo valor. Para esto, vamos a utilizar la funcion case_when() que nos permite reemplazar valores de una columna de acuerdo a una condición. En este caso, vamos a reemplazar “Vacunas” por “Vacunacion”. También podemos reemplazar “Quirurgico” por “Proc Quirurgico”.

atenciones_migrantes |>
  mutate(tipo_de_servicio = str_to_sentence(tipo_de_servicio)) |>
  mutate(
    tipo_de_servicio =
      case_when(
        tipo_de_servicio == "vacunas" ~ "vacunacion",
        tipo_de_servicio == "quirurgico" ~ "proc quirurgico",
        .default = tipo_de_servicio
      )
  ) |>
  count(tipo_de_servicio)
# A tibble: 14 × 2
   tipo_de_servicio        n
   <chr>               <int>
 1 Consulta            61071
 2 Derecho de sala         2
 3 Estancia                8
 4 Honorario               4
 5 Imagenologia           23
 6 Interconsulta           5
 7 Laboratorio        100312
 8 Otro procedimiento    301
 9 Otros servicios      6186
10 Proc quirurgico      1931
11 Procedimiento       63030
12 Quirurgico              4
13 Vacunacion           1909
14 Vacunas                38

Hay varios tipos de servicios que tienen una frecuencia muy baja y podríamos agruparlos en una categoría llamada “Otros”. Para hacer esto, vamos a utilizar nuevamente la función case_when() para reemplazar los valores de la variable tipo_de_servicio de acuerdo a una condición.

atenciones_migrantes |>
  mutate(tipo_de_servicio = str_to_sentence(tipo_de_servicio)) |>
  mutate(
    tipo_de_servicio =
      case_when(
        tipo_de_servicio == "Vacunas" ~ "Vacunacion",
        tipo_de_servicio == "Quirurgico" ~ "Proc quirurgico",
        tipo_de_servicio %in% c(
          "Derecho de sala", "Estancia", "Honorario",
          "Imagenologia",
          "Interconsulta",
          "Otro procedimiento"
        ) ~ "Otros",
        .default = tipo_de_servicio
      )
  ) |>
  count(tipo_de_servicio)
# A tibble: 7 × 2
  tipo_de_servicio      n
  <chr>             <int>
1 Consulta          61071
2 Laboratorio      100312
3 Otros               343
4 Otros servicios    6186
5 Proc quirurgico    1935
6 Procedimiento     63030
7 Vacunacion         1947

Hemos arreglado las categorías para los servicios prestados, y ahora podemos calcular el porcentaje de atenciones prestadas en cada categoria por año. Vamos a guardar esta informacion en un objeto llamado atenciones_por_servicio. También vamos a filtrar la información de los años 2017 a 2021 y vamos a calcular los porcentajes para cada año.

atenciones_por_servicio <- atenciones_migrantes |>
  mutate(tipo_de_servicio = str_to_sentence(tipo_de_servicio)) |>
  mutate(
    tipo_de_servicio =
      case_when(
        tipo_de_servicio == "Vacunas" ~ "Vacunacion",
        tipo_de_servicio == "Quirurgico" ~ "Proc quirurgico",
        tipo_de_servicio %in% c(
          "Derecho de sala", "Estancia", "Honorario",
          "Imagenologia",
          "Interconsulta",
          "Otro procedimiento"
        ) ~ "Otros",
        .default = tipo_de_servicio
      )
  ) |>
  filter(ano >= 2017 & ano <= 2021) |>
  count(ano, tipo_de_servicio) |>
  mutate(porcentaje = n / sum(n) * 100, .by = ano)

Ahora podemos hacer un gráfico que muestre estos resultados.

atenciones_por_servicio |>
  ggplot(aes(x = ano, y = porcentaje, group = tipo_de_servicio, color = tipo_de_servicio)) +
  geom_line() +
  geom_point() +
  labs(
    title = "Atenciones prestadas a población migrante en Bucaramanga por tipo de servicio",
    x = "Año",
    y = "Número de atenciones",
    color = "Tipo de servicio"
  )

Se observan algunos cambios en la tendencia de algunos servicios. Por ejemplo, una disminución en el uso de laboratorio y un aumento en los procedimientos. Los demás servicios parecen estables.

Crear un gráfico en el que solo estén presentes los valores de Consulta, Laboratorio y Procedimiento.

Puede utilizar la función filter()

La escala del eje debería indicar porcentajes. Por ejemplo, en lugar de 40, debería aparecer el valor 40%.

Puede agregar a su ggplot + scale_y_continuous(labels=scales::percent) para expresar los valores de su escala en porcentajes. Sin embargo, es posible que deba hacer un cambio en su base datos para el resultado correcto.

Esta gráfica la podemos guardar en nuestra carpeta de imágenes. Para esto, vamos a utilizar la función ggsave().

ggsave(here("img", "atenciones_por_servicio.png"))
Saving 7 x 5 in image

Cambie el tamaño de la gráfica y observe qué impacto tiene esto en la gráfica.

Encontrar el tamaño ideal para su gráfica es un proceso que requiere varios ensayos. Si usted quiere, puede utilizar el argumento units = "cm" en la función ggsave() para indicar el tamaño en centímetros.

Inferencia estadística

Hasta ahora, hemos explorado la base de datos y hemos visualizado los resultados. A continuación, vamos a hacer una prueba de inferencia estadística para evaluar diferencias entre hombres y mujeres en los servicios utilizados.

Podemos evaluar las diferencias entre ambos sexos utilizando un modelo de regresión logística en el que una variable sea el sexo y la otra variable sea el tipo de servicio. En este caso, como la variable sexo puede ser “masculino” o “femenino”, R tomará por defecto el valor de referencia como femenino, ya que la letra ‘f’ precede a la ‘m’ en el alfabeto.

Por lo tanto, si el coeficiente de un tipo de servicio es positivo, esto indicará que es más probable que la persona sea hombre. Si el coeficiente es negativo, significará que es más probable que sea mujer. La categoría “consulta” se tomará como referencia, dado que es la primera categoría en orden alfabético.

Cabe mencionar que todas estas definiciones pueden ser modificadas según se desee.

Utilizaremos el paquete tidymodels el cual es especializado para el modelamiento de datos y el paquete gtsummary para presentar los resultados de manera amigable.

library(tidymodels)
library(gtsummary)

Vamos a tomar nuevamente nuestro código para crear una base de datos con las variables de interés. En este caso, vamos a seleccionar las variables sexo y tipo_de_servicio. Además, vamos a filtrar la información de los años 2017 a 2021 y a hacer los ajustes necesarios en la variable tipo_de_servicio. También vamos a tomar una muestra aleatoria de 5000 observaciones para el análisis, para que sea más rápido.

datos_modelo <- atenciones_migrantes |>
  mutate(tipo_de_servicio = str_to_sentence(tipo_de_servicio)) |>
  filter(ano >= 2017 & ano <= 2021) |>
  mutate(
    tipo_de_servicio =
      case_when(
        tipo_de_servicio == "Vacunas" ~ "Vacunacion",
        tipo_de_servicio == "Quirurgico" ~ "Proc quirurgico",
        tipo_de_servicio %in% c(
          "Derecho de sala", "Estancia", "Honorario",
          "Imagenologia",
          "Interconsulta",
          "Otro procedimiento"
        ) ~ "Otros",
        .default = tipo_de_servicio
      )
  ) |>
  mutate(sexo = factor(sexo)) |>
  sample_n(5000)

Ahora, vamos a especificar el modelo de regresión logística. En este caso, vamos a utilizar la función logistic_reg(). Esta función nos permite especificar un modelo de regresión logística. Después, vamos a estimar el modelo con la función fit() y a especificar que estamos evaluando la asociación entre la variable sexo y la variable tipo_de_servicio.

modelo_estimado <- logistic_reg() |>
  fit(sexo ~ tipo_de_servicio, data = datos_modelo)

Una vez estimado el modelo, podemos ordenar los resultados utilizando la función tbl_regression(). Esta función nos permite presentar los resultados de manera más amigable. En este caso, vamos a especificar que queremos los coeficientes “exponenciados”, lo que nos permitirá interpretar los resultados en términos de razones de odds (odds ratio).

tbl_regression(modelo_estimado, exponentiate = TRUE)
Characteristic OR1 95% CI1 p-value
tipo_de_servicio


    Consulta
    Laboratorio 0.48 0.40, 0.57 <0.001
    Otros servicios 1.69 1.15, 2.46 0.007
    Proc quirurgico 0.00 0.00, 0.03 >0.9
    Procedimiento 1.42 1.20, 1.68 <0.001
    Vacunacion 4.18 2.20, 8.14 <0.001
1 OR = Odds Ratio, CI = Confidence Interval

Finalmente, podemos hacer una tabla con el conteo de casos por variables, para tener una idea de la distribución de los datos y el significado de los coeficientes del modelo estimado anteriormente.

datos_modelo |>
  tbl_cross(tipo_de_servicio, sexo, percent = "col")
sexo Total
Femenino Masculino
tipo_de_servicio


    Consulta 974 (25%) 335 (29%) 1,309 (26%)
    Laboratorio 1,824 (47%) 299 (26%) 2,123 (42%)
    Otros servicios 81 (2.1%) 47 (4.1%) 128 (2.6%)
    Proc quirurgico 37 (1.0%) 0 (0%) 37 (0.7%)
    Procedimiento 917 (24%) 447 (39%) 1,364 (27%)
    Vacunacion 16 (0.4%) 23 (2.0%) 39 (0.8%)
Total 3,849 (100%) 1,151 (100%) 5,000 (100%)

Muchas gracias por la atención y el esfuerzo que han dedicado a seguir este taller. Esperamos que haya sido de su agrado y que hayan aprendido algo nuevo. Si tienen alguna pregunta o comentario, estamos a su disposición.

*** Gracias ***

Back to top