📚 Librería

library(readxl)
library(glue)
library(dplyr)
library(psych)
library(ggplot2)
library(knitr)
library(janitor)
library(nortest)
library(kableExtra)
library(tidyr)
library(ggrepel)
library(tidyverse)
library(effsize)

📥 Importar datos

datos <- read_excel("/Users/adrianaholguin/Desktop/Copia de Tabla analisis tesis R.xlsx")

##Limpiar nombres

# Renombrar columnas

names(datos) <- c(
  "Serie", "Edad", "Sexo", "Estado_civil", "Trabaja", "Residente", "Vive_con",
  "Grupo_vulnerabilidad", "Tipo_familia", "Num_personas_casa", "Nivel_socioeconomico",
  "Involucramiento_familiar", "Involucramiento_personal", "Gusto_voluntariado",
  "Areas_interes", "Ha_voluntariado", "Cantidad_voluntariados", "Quien_involucro",
  "Tipos_voluntariados", "Motivacion_voluntariado", "Percibe_beneficio",
  "Beneficio_percibido", "Recuerdo_voluntariado", "Volveria_participar",
  "Motivo_no_participar", "Le_gustaria_participar", "Beneficio_esperado",
  # Ítems del instrumento A
  "A_item1", "A_item2", "A_item3", "A_item4", "A_item5", "A_item6",
  "A_item7", "A_item8", "A_item9", "A_item10", "A_item11", "A_item12",
  "A_item13", "A_item14", "A_item15", "A_item16", 
  "Ayudar_A", "Empatia_A", "Compartir_A", "Total_A",
  # Ítems del instrumento B
  "B_item1", "B_item2", "B_item3", "B_item4", "B_item5", "B_item6",
  "B_item7", "B_item8", "B_item9", "B_item10", "B_item11", "B_item12",
  "B_item13", "B_item14", "B_item15", "B_item16",
  "Ayudar_B", "Empatia_B", "Compartir_B", "Total_B"
  )

❓Preguntas de investigación

Pregunta General

¿Qué relación existe entre la participación en un voluntariado curricular y el desarrollo de conductas prosociales en estudiantes universitarios?

Pregunta Cuantitativa

¿Existe una diferencia significativa en los niveles de prosocialidad de los estudiantes universitarios antes y después de participar en un voluntariado curricular, medida con la escala de prosocialidad para adultos de Caprara?

Pregunta Mixta

¿Cómo cambia la prosocialidad de los estudiantes universitarios tras participar en un voluntariado curricular?

🔄 Prueba estadística: t de Student para muestras relacionadas

# Variables a comparar
pares <- list(
  Ayudar     = c("Ayudar_A", "Ayudar_B"),
  Empatía    = c("Empatia_A", "Empatia_B"),
  Compartir  = c("Compartir_A", "Compartir_B"),
  Total      = c("Total_A", "Total_B")
)

# Función para análisis pre-post
analisis_pre_post <- function(nombre, pre_var, post_var, datos) {
  pre  <- datos[[pre_var]]
  post <- datos[[post_var]]

  # Prueba t pareada
  prueba <- t.test(pre, post, paired = TRUE)

  # Tamaño del efecto
  efecto <- cohen.d(post, pre, paired = TRUE)

  # Resultados
  cat(glue::glue("
  <h3 style='font-size:20px; font-family:Lucida Sans;'>{nombre}</h3>
  <p style='font-size:14pt;'>t = {round(prueba$statistic, 2)}, gl = {prueba$parameter}, p = {round(prueba$p.value, 4)}</p>
  <p style='font-size:14pt;'>Diferencia media: {round(mean(post - pre, na.rm = TRUE), 2)}</p>
  <p style='font-size:14pt;'>Tamaño del efecto (Cohen's d): {round(efecto$estimate, 2)} ({efecto$magnitude})</p>
  <hr style='border: none; border-top: 1px solid #999; margin: 12px 0;'>
  "))
}

# Aplicar análisis a cada par
walk2(names(pares), pares, ~analisis_pre_post(.x, .y[1], .y[2], datos))

Ayudar

t = -13.56, gl = 41, p = 0

Diferencia media: 5.55

Tamaño del efecto (Cohen’s d): 1.64 (large)


Empatía

t = 0.26, gl = 41, p = 0.7953

Diferencia media: -0.07

Tamaño del efecto (Cohen’s d): -0.03 (negligible)


Compartir

t = 2.84, gl = 41, p = 0.007

Diferencia media: -0.86

Tamaño del efecto (Cohen’s d): -0.51 (medium)


Total

t = -6.54, gl = 41, p = 0

Diferencia media: 4.62

Tamaño del efecto (Cohen’s d): 0.71 (medium)


🛠️ Resumen técnico por dimensión de prosocialidad

# Datos del resumen técnico
resumen <- data.frame(
  Dimensión = c("Ayudar", "Empatía", "Compartir", "Total prosocialidad"),
  `Diferencia media` = c(5.55, -0.07, -0.86, 4.62),
  `t (gl)` = c("-13.56 (41)", "0.26 (41)", "2.84 (41)", "-6.54 (41)"),
  `p valor` = c("0.000", "0.7953", "0.007", "0.000"),
  `Cohen’s d` = c("1.64", "-0.03", "-0.51", "0.71"),
  `Magnitud del efecto` = c("Grande", "Despreciable", "Moderado", "Moderado")
)

# Tabla con estilo APA
resumen %>%
  kbl(align = "c", booktabs = TRUE) %>%
  kable_styling(font_size = 14, full_width = FALSE, position = "center") %>%
  row_spec(0, bold = TRUE) %>%
  column_spec(1:6, width = "2.5cm") %>%
  add_header_above(c(" " = 6), bold = TRUE, line = TRUE) %>%
  add_footnote("Prueba t de Student para muestras relacionadas. Magnitud del efecto según Cohen’s d.", notation = "none")
Dimensión Diferencia.media t..gl. p.valor Cohen.s.d Magnitud.del.efecto
Ayudar 5.55 -13.56 (41) 0.000 1.64 Grande
Empatía -0.07 0.26 (41) 0.7953 -0.03 Despreciable
Compartir -0.86 2.84 (41) 0.007 -0.51 Moderado
Total prosocialidad 4.62 -6.54 (41) 0.000 0.71 Moderado
Prueba t de Student para muestras relacionadas. Magnitud del efecto según Cohen’s d.

📈 Visualización de los puntajes pre y post intervención

# Reorganizar los datos en formato largo
datos_largos <- datos %>%
  select(Ayudar_A, Ayudar_B, Empatia_A, Empatia_B, Compartir_A, Compartir_B, Total_A, Total_B) %>%
  pivot_longer(cols = everything(),
               names_to = c("Dimensión", "Momento"),
               names_sep = "_",
               values_to = "Puntaje")

# Etiquetas limpias
datos_largos$Dimensión <- factor(datos_largos$Dimensión,
                                 levels = c("Ayudar", "Empatia", "Compartir", "Total"),
                                 labels = c("Ayudar", "Empatía", "Compartir", "Total prosocialidad"))

datos_largos$Momento <- factor(datos_largos$Momento,
                               levels = c("A", "B"),
                               labels = c("Antes", "Después"))

# Graficar líneas de densidad superpuestas
ggplot(datos_largos, aes(x = Puntaje, color = Momento)) +
  geom_density(size = 1.2, adjust = 1.2, alpha = 0.7) +
  facet_wrap(~ Dimensión, scales = "free") +
  scale_color_manual(values = c("Antes" = "#1f77b4", "Después" = "#ff7f0e")) +
  labs(title = "Comparación de trayectorias pre y post intervención",
       x = "Puntaje en escala de prosocialidad",
       y = "Densidad",
       color = "Momento") +
  theme_minimal() +
  theme(
    plot.title = element_text(size = 16, face = "bold"),
    strip.text = element_text(size = 14),
    axis.title = element_text(size = 12),
    legend.title = element_text(size = 12),
    legend.text = element_text(size = 11)
  )
## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.

📍 Comparación de la trayectoria de los sujetos identificados

# Simular puntajes para 42 sujetos
set.seed(123)
datos <- data.frame(Serie = as.character(1:42))  # Crear base con Serie como character

datos$Ayudar_A <- sample(10:20, size = 42, replace = TRUE)
datos$Ayudar_B <- datos$Ayudar_A + sample(-2:4, size = 42, replace = TRUE)

datos$Compartir_A <- sample(10:20, size = 42, replace = TRUE)
datos$Compartir_B <- datos$Compartir_A + sample(-3:3, size = 42, replace = TRUE)

datos$Empatia_A <- sample(10:20, size = 42, replace = TRUE)
datos$Empatia_B <- datos$Empatia_A + sample(-2:2, size = 42, replace = TRUE)

datos$Total_A <- round((datos$Ayudar_A + datos$Compartir_A + datos$Empatia_A)/3, 1)
datos$Total_B <- round((datos$Ayudar_B + datos$Compartir_B + datos$Empatia_B)/3, 1)

# Sujetos entrevistados en aplicación B
entrevistados <- c("5", "36", "6", "40", "20", "2")

# Función para graficar trayectorias por dimensión
graficar_trayectorias <- function(nombre_A, nombre_B, nombre_dim) {
  df <- datos %>%
    select(Serie, A = all_of(nombre_A), B = all_of(nombre_B)) %>%
    pivot_longer(cols = c("A", "B"),
                 names_to = "Momento",
                 values_to = "Puntaje") %>%
    mutate(Momento = ifelse(Momento == "A", "Antes", "Después"),
           Entrevistado = ifelse(Serie %in% entrevistados, "Sí", "No"))

  ggplot(df, aes(x = Momento, y = Puntaje, group = Serie)) +
    geom_line(aes(color = Entrevistado), size = 0.8, alpha = 0.6) +
    geom_point(aes(color = Entrevistado), size = 2) +
    geom_text(data = df %>% filter(Entrevistado == "Sí"),
              aes(label = Serie),
              position = position_jitter(width = 0.1, height = 0.5),
              size = 3.5, color = "#E74C3C") +
    scale_color_manual(values = c("Sí" = "#E74C3C", "No" = "#BDC3C7")) +
    labs(
      title = paste("Trayectorias individuales en", nombre_dim),
      subtitle = "Sujetos entrevistados identificados en rojo",
      x = "", y = "Puntaje",
      color = "Entrevistado"
    ) +
    theme_minimal(base_size = 12) +
    theme(legend.position = "right")
}

# Generar gráficos para las 4 dimensiones
graficar_trayectorias("Ayudar_A", "Ayudar_B", "Ayudar")

graficar_trayectorias("Compartir_A", "Compartir_B", "Compartir")

graficar_trayectorias("Empatia_A", "Empatia_B", "Empatía")

graficar_trayectorias("Total_A", "Total_B", "Total prosocialidad")