Crear tablas en R

Agenda

  1. ¿Por qué documentar el análisis de datos?
    1.1 Documentar el análisis de datos
    1.2 Herramientas para documentar
  2. Base de datos del taller
    2.1 Descripción de la base de datos
    2.2 Variables
  3. Procesar datos con Tidyverse
    3.1 select()
    3.2 filter()
    3.3 mutate()
  4. gtsummary
    4.1 Tablas con tbl_summary()
    4.2 Tablas para regresiones
    4.3 Exportar tablas a word

1. ¿Por qué documentar los análisis?

1.1 Documentar el análisis de datos

Replicabilidad: Permite a otros investigadores o evaluadores replicar tus hallazgos.

Transparencia: La documentación completa demuestra la integridad del proceso de investigación, lo que aumenta la confianza en los resultados.

Claridad: Ayuda a clarificar los métodos y resultados.

Comunicación efectiva: Facilita la transferencia de conocimientos.

Revisión por pares: Hace que el proceso de revisión por pares sea más eficiente.

Mejora continua: Te permite volver a visitar y refinar tu análisis en el futuro, o adaptarlo para abordar preguntas de investigación relacionadas.

Formación y educación: Sirve como un recurso educativo para estudiantes o profesionales que estén aprendiendo cómo llevar a cabo análisis similares.

Resolución de problemas: Facilita la identificación y corrección de errores o inconsistencias en el análisis.

Economía de tiempo: Reduce el tiempo necesario para retomar o modificar el proyecto en fases posteriores de la investigación.

1.2. Herramientas para documentar

  • Código (Programas estadísticos)
  • Quarto (Rmarkdown)
  • Git (Github)
  • R (También sintaxis en spss, stata, etc)

1.2.1 Quarto

  • Quarto permite crear documentos en varios formatos (PDF, HTML, Word).
  • Permite integrar código de R, Python, etc.
  • Integrar tablas y gráficos.
  • Unir código y texto.

2. Base de datos

2.1 Descripción de la base de datos

Datos de 71 participantes sobre sus evaluaciones sociomorales en cuatro situaciones de transgresión legal: 1) daño ambiental por minería ilegal, 2) linchamiento en caso de robo, 3) tráfico de químicos para cocaína y 4) porte de armas en público. El estudio examina juicios y justificaciones sobre si hay transgresión, la gravedad de dichas transgresiones y el castigo merecido. También se evalúan las creencias sobre si las transgresiones se deben a características disposicionales de los involucrados.

Variables

library(dataWorkshopUN)
library(gtsummary)
library(tidyverse)
library(gt)

data(datos_ley_moral)
Rows: 6,837
Columns: 7
$ ID          <dbl> 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2…
$ SITUACIONES <chr> "Daño ambiental", "Daño ambiental", "Daño ambiental", "Dañ…
$ EDAD        <dbl> 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17…
$ SEXO        <chr> "H", "H", "H", "H", "H", "H", "H", "H", "H", "H", "H", "H"…
$ CATEGORIAS  <chr> "Expectativa de transgresón", "Justificación de los desenl…
$ CODIGOS     <chr> "Transgresión", "Desconfianza institucional", "Recursos bá…
$ RESPUESTA   <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1…

Información en la base de datos

3. Processar datos con Tidyverse

select()

Esta función permite seleccionar columnas.

datos_ley_moral  |> 
select(SITUACIONES, CODIGOS, RESPUESTA)  |> 
head(10)  |> 
gt()
SITUACIONES CODIGOS RESPUESTA
Daño ambiental Transgresión 0
Daño ambiental Desconfianza institucional 0
Daño ambiental Recursos básicos, necesidades y oportunidades 0
Daño ambiental Objetivos personales y conveniencia 0
Daño ambiental Creencias y prácticas culturales 0
Daño ambiental Justificaciones morales 0
Daño ambiental Referencia a la experiencia 0
Daño ambiental Autoridad, reglas y consecuencias 0
Daño ambiental Prudencial 0
Daño ambiental Otros 1

filter()

Esta función permite filtrar columnas.

datos_ley_moral  |> 
select(SITUACIONES, CODIGOS, RESPUESTA)  |> 
filter(SITUACIONES == "Linchamiento")  |> 
head(10)  |> 
gt()
SITUACIONES CODIGOS RESPUESTA
Linchamiento Transgresión 1
Linchamiento Desconfianza institucional 0
Linchamiento Recursos básicos, necesidades y oportunidades 0
Linchamiento Objetivos personales y conveniencia 0
Linchamiento Creencias y prácticas culturales 1
Linchamiento Justificaciones morales 0
Linchamiento Referencia a la experiencia 0
Linchamiento Autoridad, reglas y consecuencias 0
Linchamiento Prudencial 0
Linchamiento Otros 0

mutate()

Esta función permite crear o modificar columnas

datos_ley_moral  |> 
mutate(Edad_años = paste0(EDAD, " años"))  |> 
select(ID, Edad_años) |> 
unique()  |> 
head(10)  |> 
gt()
ID Edad_años
2 17 años
3 22 años
5 52 años
7 30 años
8 40 años
10 30 años
11 16 años
13 17 años
14 15 años
15 44 años

Ejercicio 1

  1. Cargar la base de datos datos_ley_moral
  2. Crear una muestra que solo contenga las variables CATEGORIAS y CÓDIGOS
  3. Filtrar la CATEGORÍA “Justificación de los juicios”

4. library(gtsummary)

tbl_summary()

gtsummary es un paquete que permite crear tablas de resumen de datos. Algunas de sus ventajas son:

  • Permite crear tablas de resumen de datos con una sintaxis sencilla.
  • Tablas de resumen para regresiones.
  • Exportar tablas a varios formatos (Word, PDF, HTML).
  • Permite crear tablas con diferentes estilos.
  • Calcula estadísticos y p-valores.

tbl_summary()

Calcular la frecuencia y el porcentajes de participantes hombres y mujeres.

datos_ley_moral  |> 
select(ID, SEXO)  |> 
unique()  |> 
tbl_summary(include=-ID)
Characteristic N = 531
SEXO
    H 35 (66%)
    M 18 (34%)
1 n (%)

tbl_summary()

Calcular medidas de tendencia y dispersión

datos_ley_moral  |> 
select(ID, EDAD)  |> 
unique()  |> 
tbl_summary(include=EDAD)
Characteristic N = 231
EDAD 29 (23, 45)
1 Median (IQR)

tbl_summary()

Elegir los estadísticos que se muestran en la tabla o el idioma.

theme_gtsummary_language(language = "es")

datos_ley_moral  |> 
select(EDAD)  |> 
unique()  |> 
tbl_summary(
statistic = EDAD ~ "{mean} ({sd})")
Característica N = 231
EDAD 33 (13)
1 Media (DE)

Ejercicio 2

Crear una tabla que incluya las variables EDAD y SEXO.

tbl_summary()

datos_ley_moral  |>
datos_organizados("Justificación de los desenlaces")  |> 
tbl_summary(include=-c(ID, SITUACIONES, SEXO, EDAD))  
Característica N = 1591
Desconfianza institucional 17 (11%)
Recursos básicos, necesidades y oportunidades 23 (14%)
Objetivos personales y conveniencia 49 (31%)
Creencias y prácticas culturales 50 (31%)
Justificaciones morales 25 (16%)
Referencia a la experiencia 6 (3.8%)
Autoridad, reglas y consecuencias 13 (8.2%)
Prudencial 2 (1.3%)
Otros 7 (4.4%)
1 n (%)
datos_ley_moral  |>
datos_organizados("Justificación de los desenlaces")  |> 
select(-c(ID, SITUACIONES, SEXO, EDAD)) |> 
tbl_summary()   |> 
modify_table_body(
    fun = ~ dplyr::arrange(.x, desc(readr::parse_number(stat_0)))
  )
Característica N = 1591
Creencias y prácticas culturales 50 (31%)
Objetivos personales y conveniencia 49 (31%)
Justificaciones morales 25 (16%)
Recursos básicos, necesidades y oportunidades 23 (14%)
Desconfianza institucional 17 (11%)
Autoridad, reglas y consecuencias 13 (8.2%)
Otros 7 (4.4%)
Referencia a la experiencia 6 (3.8%)
Prudencial 2 (1.3%)
1 n (%)

tbl_summary()

La opción by permite crear tablas por grupos.

datos_ley_moral  |>
datos_organizados("Justificación de los desenlaces")  |> 
tbl_summary(by=SITUACIONES,
include=-c(ID, SEXO, EDAD))  |> 
modify_table_body(
    fun = ~ dplyr::arrange(.x, desc(readr::parse_number(stat_1)))
  )  
Característica Daño ambiental, N = 531 Linchamiento, N = 531 Narcotráfico, N = 531
Objetivos personales y conveniencia 24 (45%) 1 (1.9%) 24 (45%)
Autoridad, reglas y consecuencias 12 (23%) 0 (0%) 1 (1.9%)
Justificaciones morales 7 (13%) 16 (30%) 2 (3.8%)
Creencias y prácticas culturales 6 (11%) 30 (57%) 14 (26%)
Referencia a la experiencia 4 (7.5%) 1 (1.9%) 1 (1.9%)
Otros 4 (7.5%) 2 (3.8%) 1 (1.9%)
Desconfianza institucional 0 (0%) 17 (32%) 0 (0%)
Recursos básicos, necesidades y oportunidades 0 (0%) 0 (0%) 23 (43%)
Prudencial 0 (0%) 0 (0%) 2 (3.8%)
1 n (%)

Ejercicio 3

Utilice la base de datos de “Juicio Moral” (datos_organizados()).

¿Cuál es la frecuencia de No estuvo bien según cada SITUACIÓN?

Añadir detalles a las tabla

datos_ley_moral  |>
datos_organizados("Justificación de los juicios")  |> 
tbl_summary(
    by = SITUACIONES,
    include=-c(ID, SEXO, EDAD))   |> 
     modify_table_body(
    fun = ~ dplyr::arrange(.x, desc(readr::parse_number(stat_1)))
  )  |>
    modify_header(
        label= "**Justificación de los juicios**"
    ) 

Añadir detalles a las tabla

Justificación de los juicios Daño ambiental, N = 531 Linchamiento, N = 531 Narcotráfico, N = 531
Justificaciones morales 51 (96%) 33 (62%) 16 (30%)
Autoridad, reglas y consecuencias 2 (3.8%) 22 (42%) 23 (43%)
Prudencial 2 (3.8%) 0 (0%) 23 (43%)
Otros 2 (3.8%) 0 (0%) 4 (7.5%)
Recursos básicos, necesidades y oportunidades 0 (0%) 2 (3.8%) 9 (17%)
Objetivos personales y conveniencia 0 (0%) 0 (0%) 0 (0%)
Creencias y prácticas culturales 0 (0%) 0 (0%) 0 (0%)
Desconfianza institucional 0 (0%) 12 (23%) 0 (0%)
1 n (%)

Añadir detalles a las tabla

datos_ley_moral  |>
datos_organizados("Justificación de los juicios")  |> 
tbl_summary(
    by = SITUACIONES,
    include=-c(ID, SEXO, EDAD))   |> 
     add_overall()  |> 
     modify_table_body(
    fun = ~ dplyr::arrange(.x, desc(readr::parse_number(stat_0)))
  )  |>
    modify_header(
        label= "**Justificación de los juicios**"
    )  
Justificación de los juicios Global, N = 1591 Daño ambiental, N = 531 Linchamiento, N = 531 Narcotráfico, N = 531
Justificaciones morales 100 (63%) 51 (96%) 33 (62%) 16 (30%)
Autoridad, reglas y consecuencias 47 (30%) 2 (3.8%) 22 (42%) 23 (43%)
Prudencial 25 (16%) 2 (3.8%) 0 (0%) 23 (43%)
Desconfianza institucional 12 (7.5%) 0 (0%) 12 (23%) 0 (0%)
Recursos básicos, necesidades y oportunidades 11 (6.9%) 0 (0%) 2 (3.8%) 9 (17%)
Otros 6 (3.8%) 2 (3.8%) 0 (0%) 4 (7.5%)
Objetivos personales y conveniencia 0 (0%) 0 (0%) 0 (0%) 0 (0%)
Creencias y prácticas culturales 0 (0%) 0 (0%) 0 (0%) 0 (0%)
1 n (%)

Add_p value

datos_ley_moral  |>
datos_organizados("Justificación de los juicios")  |> 
tbl_summary(
    by = SITUACIONES,
    include=-c(ID, SEXO, EDAD))   |> 
     add_overall()  |> 
     modify_table_body(
    fun = ~ dplyr::arrange(.x, desc(readr::parse_number(stat_0)))
  )  |>
    modify_header(
        label= "**Justificación de los juicios**"
    )   |> 
    add_p()
Justificación de los juicios Global, N = 1591 Daño ambiental, N = 531 Linchamiento, N = 531 Narcotráfico, N = 531 p-valor2
Justificaciones morales 100 (63%) 51 (96%) 33 (62%) 16 (30%) <0.001
Autoridad, reglas y consecuencias 47 (30%) 2 (3.8%) 22 (42%) 23 (43%) <0.001
Prudencial 25 (16%) 2 (3.8%) 0 (0%) 23 (43%) <0.001
Desconfianza institucional 12 (7.5%) 0 (0%) 12 (23%) 0 (0%) <0.001
Recursos básicos, necesidades y oportunidades 11 (6.9%) 0 (0%) 2 (3.8%) 9 (17%) 0.001
Otros 6 (3.8%) 2 (3.8%) 0 (0%) 4 (7.5%) 0.2
Objetivos personales y conveniencia 0 (0%) 0 (0%) 0 (0%) 0 (0%)
Creencias y prácticas culturales 0 (0%) 0 (0%) 0 (0%) 0 (0%)
1 n (%)
2 prueba chi cuadrado de independencia; test exacto de Fisher

Escalas gravedad y castigo

Característica Global, N = 1591 Daño ambiental, N = 531 Linchamiento, N = 531 Narcotráfico, N = 531
Escala de gravedad



    1 5 (3.1%) 0 (0%) 4 (7.5%) 1 (1.9%)
    2 6 (3.8%) 0 (0%) 4 (7.5%) 2 (3.8%)
    3 20 (13%) 1 (1.9%) 9 (17%) 10 (19%)
    4 29 (18%) 5 (9.4%) 11 (21%) 13 (25%)
    5 99 (62%) 47 (89%) 25 (47%) 27 (51%)
Escala de castigo



    1 11 (6.9%) 0 (0%) 7 (13%) 4 (7.5%)
    2 10 (6.3%) 0 (0%) 7 (13%) 3 (5.7%)
    3 46 (29%) 3 (5.7%) 15 (28%) 28 (53%)
    4 38 (24%) 16 (30%) 14 (26%) 8 (15%)
    5 54 (34%) 34 (64%) 10 (19%) 10 (19%)
1 n (%)

Escalas gravedad y castigo

datos_ley_moral  |> 
datos_organizados("Escalas gravedad y castigo")   |> 
filter(SITUACIONES %in% c("Linchamiento", "Narcotráfico"))  |> 
tbl_summary(
    by = SITUACIONES,
    include=-c(ID, SEXO, EDAD),
    type= list(`Escala de gravedad` ~ "continuous", 
    `Escala de castigo` ~ "continuous"), 
    statistic = all_continuous() ~ "{mean}, ({sd})")   |> 
    add_p(test = list(
          all_continuous() ~ "paired.wilcox.test"),
        group = ID)  
Característica Linchamiento, N = 531 Narcotráfico, N = 531 p-valor2
Escala de gravedad 3.92, (1.28) 4.19, (1.00) 0.2
Escala de castigo 3.25, (1.28) 3.32, (1.09) 0.7
1 Media, (DE)
2 Wilcoxon signed rank test with continuity correction

Tablas para regresiones

datos_ley_moral  |> 
    datos_organizados("Escalas gravedad y castigo")   |> 
    filter(SITUACIONES %in% c("Linchamiento", "Narcotráfico"))  %>% 
    lm(`Escala de gravedad` ~ EDAD + SEXO + SITUACIONES, data = .)  

Call:
lm(formula = `Escala de gravedad` ~ EDAD + SEXO + SITUACIONES, 
    data = .)

Coefficients:
            (Intercept)                     EDAD                    SEXOM  
               3.835985                 0.001162                 0.163164  
SITUACIONESNarcotráfico  
               0.264151  

La función lm() genera un resultado como este:


Call:
lm(formula = `Escala de gravedad` ~ EDAD + SEXO + SITUACIONES, 
    data = .)

Coefficients:
            (Intercept)                     EDAD                    SEXOM  
               3.835985                 0.001162                 0.163164  
SITUACIONESNarcotráfico  
               0.264151  

Tablas para regresiones

datos_ley_moral  |> 
    datos_organizados("Escalas gravedad y castigo")   |> 
    filter(SITUACIONES %in% c("Linchamiento", "Narcotráfico"))  %>% 
    lm(`Escala de gravedad` ~ EDAD + SEXO + SITUACIONES, data = .)  |> 
    tbl_regression()
Característica Beta 95% CI1 p-valor
EDAD 0.00 -0.02, 0.02 0.9
SEXO


    H
    M 0.16 -0.31, 0.64 0.5
SITUACIONES


    Linchamiento
    Narcotráfico 0.26 -0.18, 0.71 0.2
1 CI = Intervalo de confianza

Exportar a tablas a word

tabla_gravedad_y_castigo <- datos_ley_moral  |> 
datos_organizados("Escalas gravedad y castigo")   |> 
filter(SITUACIONES %in% c("Linchamiento", "Narcotráfico"))  |> 
tbl_summary(
    by = SITUACIONES,
    include=-c(ID, SEXO, EDAD),
    type= list(`Escala de gravedad` ~ "continuous", 
    `Escala de castigo` ~ "continuous"), 
    statistic = all_continuous() ~ "{mean}, ({sd})")   |> 
    add_p(test = list(
          all_continuous() ~ "paired.wilcox.test"),
        group = ID)    |> 
        as_gt()

gt::gtsave(tabla_gravedad_y_castigo, "tabla_gravedad_y_castigo.docx")

Recursos

Página web de gtsummary

Página web de gt

Gracias