R para la programación en Bioestadística y Ciencia de Datos: data frames
R medicine 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.
<- read_xlsx("data/atenciones_migrantes.xlsx") atenciones_migrantes
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()
|> names() atenciones_migrantes
[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()
|> # El nombre de los datos
atenciones_migrantes 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(
== "vacunas" ~ "vacunacion",
tipo_de_servicio == "quirurgico" ~ "proc quirurgico",
tipo_de_servicio .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(
== "Vacunas" ~ "Vacunacion",
tipo_de_servicio == "Quirurgico" ~ "Proc quirurgico",
tipo_de_servicio %in% c(
tipo_de_servicio "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_migrantes |>
atenciones_por_servicio mutate(tipo_de_servicio = str_to_sentence(tipo_de_servicio)) |>
mutate(
tipo_de_servicio =
case_when(
== "Vacunas" ~ "Vacunacion",
tipo_de_servicio == "Quirurgico" ~ "Proc quirurgico",
tipo_de_servicio %in% c(
tipo_de_servicio "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.
<- atenciones_migrantes |>
datos_modelo mutate(tipo_de_servicio = str_to_sentence(tipo_de_servicio)) |>
filter(ano >= 2017 & ano <= 2021) |>
mutate(
tipo_de_servicio =
case_when(
== "Vacunas" ~ "Vacunacion",
tipo_de_servicio == "Quirurgico" ~ "Proc quirurgico",
tipo_de_servicio %in% c(
tipo_de_servicio "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
.
<- logistic_reg() |>
modelo_estimado 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 ***