📚 Librería

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

📥 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 de investigación general

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

Pregunta de investigación 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?

1 📊 Estadística descriptiva sociodemográfica

📊👥 Variables de respuesta única (todos los sujetos)

# --- Mapeo de NOMBRES REALES a Títulos ---
# (Usando los nombres de 'names(datos)')

vars_categoricas <- c(
  "Sexo" = "identidad de género",
  "Estado_civil" = "estado civil",
  "Trabaja" = "condición laboral",
  "Residente" = "residencia habitual",
  "Vive_con" = "personas con quienes vive",
  "Grupo_vulnerabilidad" = "pertenencia a grupo de vulnerabilidad",
  "Tipo_familia" = "tipo de familia",
  "Nivel_socioeconomico" = "nivel socioeconómico percibido",
  "Gusto_voluntariado" = "le gustaría realizar voluntariados en sus materias",
  "Ha_voluntariado" = "ha realizado voluntariados previamente"
)

vars_numericas_titulos <- c(
  "Edad" = "edad de los participantes",
  "Num_personas_casa" = "número de personas en el hogar",
  "Involucramiento_familiar" = "involucramiento familiar en voluntariado",
  "Involucramiento_personal" = "involucramiento personal en voluntariado"
)
# Vector solo con los nombres de columna
vars_numericas <- names(vars_numericas_titulos)
Distribución de Identidad de género
Categoría Frecuencia % Frecuencia % Acumulado
Femenino 33 78.6% 78.6%
Masculino 9 21.4% 100%

Distribución de Estado civil
Categoría Frecuencia % Frecuencia % Acumulado
Soltero 41 97.6% 97.6%
Unión libre 1 2.4% 100%

Distribución de Condición laboral
Categoría Frecuencia % Frecuencia % Acumulado
No 20 47.6% 47.6%
Si 22 52.4% 100%

Distribución de Residencia habitual
Categoría Frecuencia % Frecuencia % Acumulado
Foráneo 23 54.8% 54.8%
Local 19 45.2% 100%

Distribución de Personas con quienes vive
Categoría Frecuencia % Frecuencia % Acumulado
Familia 24 57.1% 57.1%
Romíes 16 38.1% 95.2%
Solo 2 4.8% 100%

Distribución de Pertenencia a grupo de vulnerabilidad
Categoría Frecuencia % Frecuencia % Acumulado
Madre soltera 2 4.8% 4.8%
Ninguno 40 95.2% 100%

Distribución de Tipo de familia
Categoría Frecuencia % Frecuencia % Acumulado
Extensa 7 16.7% 16.7%
Monoparental 6 14.3% 31%
Tradicional 29 69% 100%

Distribución de Nivel socioeconómico percibido
Categoría Frecuencia % Frecuencia % Acumulado
Bajo 4 9.5% 9.5%
Medio 38 90.5% 100%

Distribución de Le gustaría realizar voluntariados en sus materias
Categoría Frecuencia % Frecuencia % Acumulado
No 10 23.8% 23.8%
Si 32 76.2% 100%

Distribución de Ha realizado voluntariados previamente
Categoría Frecuencia % Frecuencia % Acumulado
No 17 40.5% 40.5%
Si 25 59.5% 100%

Estadística Descriptiva de Variables Numéricas
Variable N Media DE Mediana Mín Máx
Edad de los participantes 42 18.76 1.10 18 18 22
Involucramiento familiar en voluntariado 42 5.33 2.28 5 1 10
Involucramiento personal en voluntariado 42 4.33 2.18 4 1 9
Número de personas en el hogar 42 4.24 1.16 4 2 7


📊👥 Variable de respuesta múltiple (Todos los sujetos)

En la siguiente tabla, los participantes podían seleccionar más de una opción. Las respuestas fueron separadas por comas y desagregadas para su análisis. Esta decisión metodológica permite visualizar la diversidad de intereses sin forzar exclusividad en las categorías.

# Función para variables 
tabla_apa_categorica <- function(variable, nombre_variable) {
  variable <- as.character(variable)
  variable <- trimws(variable)
  
  # --- CORRECCIÓN AQUÍ ---
  # Aplicar filtros en pasos separados para evitar errores con NA
  variable <- variable[!is.na(variable)]
  variable <- variable[variable != ""]
  variable <- variable[toupper(variable) != "NA"]
  # --- FIN DE LA CORRECCIÓN ---

  if (length(variable) == 0) {
    return(invisible(NULL))
  }
  
  frec <- table(variable)
  porc <- round(prop.table(frec) * 100, 1)
  acum <- cumsum(porc)
  if (length(acum) > 0) { acum[length(acum)] <- 100.0 }
  
  tabla <- data.frame(
    "Categoría" = names(frec),
    "Frecuencia" = as.vector(frec),
    "% Frecuencia" = paste0(porc, "%"),
    "% Acumulado" = paste0(acum, "%"),
    check.names = FALSE
  )

  cat('<div style="font-family:\'Lucida Sans\', sans-serif; font-size:14pt; display:table; margin-left:auto; margin-right:auto;">')
  cat(paste0('<div style="text-align:left; border-bottom: 1px solid black; margin-bottom:6px;"><em>Distribución de ', nombre_variable, '</em></div>'))
  print(kable(tabla, format = "html", align = c("l", "c", "c", "c"), escape = FALSE))
  cat('<style>thead tr {border-bottom: 1px solid black;}</style>')
  cat('<div style="border-bottom: 1px solid black; margin-top:6px;"></div>')
  cat('</div>')
  cat('<br>') 
}


# --- 2. Función para variables NUMÉRICAS ---
tabla_apa_numerica <- function(datos, vars_numericas, titulos_numericos) {
  
  datos_largos_num <- pivot_longer(datos,
                                  cols = all_of(vars_numericas),
                                  names_to = "Variable",
                                  values_to = "Puntuacion"
                                  )
  
  tabla_num <- datos_largos_num %>%
    group_by(Variable) %>%
    summarise(
      N = n(),
      Media = mean(Puntuacion, na.rm = TRUE),
      DE = sd(Puntuacion, na.rm = TRUE),
      Mediana = median(Puntuacion, na.rm = TRUE),
      Mín = min(Puntuacion, na.rm = TRUE),
      Máx = max(Puntuacion, na.rm = TRUE)
    ) %>%
    mutate(Variable = titulos_numericos[Variable])

  nombre_variable <- "Estadística Descriptiva de Variables Numéricas"
  cat('<div style="font-family:\'Lucida Sans\', sans-serif; font-size:14pt; display:table; margin-left:auto; margin-right:auto;">')
  cat(paste0('<div style="text-align:left; border-bottom: 1px solid black; margin-bottom:6px;"><em>', nombre_variable, '</em></div>'))
  print(kable(tabla_num, 
              format = "html", 
              align = c("l", "c", "c", "c", "c", "c"), 
              escape = FALSE, 
              digits = 2,
              col.names = c("Variable", "N", "Media", "DE", "Mediana", "Mín", "Máx")))
  cat('<style>thead tr {border-bottom: 1px solid black;}</style>')
  cat('<div style="border-bottom: 1px solid black; margin-top:6px;"></div>')
  cat('</div>')
  cat('<br>')
}

# --- 3. Función para variables MÚLTIPLES ---
tabla_apa_multiple <- function(variable, nombre_variable) {
  df <- data.frame(respuesta = variable)
  
  df <- df %>%
    separate_rows(respuesta, sep = ",") %>%
    mutate(respuesta = trimws(respuesta)) %>%
    filter(respuesta != "" & !is.na(respuesta))

  frec <- table(df$respuesta)
  porc <- round(prop.table(frec) * 100, 1)
  
  acum <- cumsum(porc)
  if (length(acum) > 0) { acum[length(acum)] <- 100.0 }

  tabla <- data.frame(
    "Categoría" = names(frec),
    "Frecuencia" = as.vector(frec),
    "% Frecuencia" = paste0(porc, "%"),
    "% Acumulado" = paste0(acum, "%"),
    check.names = FALSE
  )

  cat('<div style="font-family:\'Lucida Sans\', sans-serif; font-size:14pt; display:table; margin-left:auto; margin-right:auto;">')
  cat(paste0('<div style="text-align:left; border-bottom: 1px solid black; margin-bottom:6px;"><em>Distribución de ', nombre_variable, ' (respuestas múltiples)</em></div>'))
  print(kable(tabla, format = "html", align = c("l", "c", "c", "c"), escape = FALSE))
  cat('<style>thead tr {border-bottom: 1px solid black;}</style>')
  cat('<div style="border-bottom: 1px solid black; margin-top:6px;"></div>')
  cat('</div>')
  cat('<br>')
}
Distribución de Áreas de interés para realizar voluntariados (respuestas múltiples)
Categoría Frecuencia % Frecuencia % Acumulado
Ambiental-ecológico 6 8% 8%
Educativo 20 26.7% 34.7%
Emergencias-desastres 13 17.3% 52%
No respondió 3 4% 56%
Salud 13 17.3% 73.3%
Social-comunitario 20 26.7% 100%

Distribución de Quién lo involucró en voluntariados previos (respuestas múltiples)
Categoría Frecuencia % Frecuencia % Acumulado
Amigo 9 15.5% 15.5%
Escuela 16 27.6% 43.1%
Familia 10 17.2% 60.3%
Gobierno 1 1.7% 62%
NA 17 29.3% 91.3%
Religión 5 8.6% 100%

Distribución de Tipos de voluntariados que ha realizado (respuestas múltiples)
Categoría Frecuencia % Frecuencia % Acumulado
Ambiental-ecológico 13 19.7% 19.7%
Educación 5 7.6% 27.3%
Emergencias-desastres 4 6.1% 33.4%
NA 17 25.8% 59.2%
Salud 6 9.1% 68.3%
Social-comunitario 21 31.8% 100%

Distribución de Motivación para realizar voluntariados (respuestas múltiples)
Categoría Frecuencia % Frecuencia % Acumulado
Altruismo 5 8.8% 8.8%
Compromiso cívico 4 7% 15.8%
Desarrollo personal 13 22.8% 38.6%
Diversión 9 15.8% 54.4%
NA 17 29.8% 84.2%
Obligación 6 10.5% 94.7%
Reconocimiento 3 5.3% 100%

Distribución de Beneficios percibidos de voluntariados previos (respuestas múltiples)
Categoría Frecuencia % Frecuencia % Acumulado
Aprendizaje 9 11.1% 11.1%
Autoestima 2 2.5% 13.6%
Consciencia 6 7.4% 21%
Curriculum 13 16% 37%
Empatía 19 23.5% 60.5%
NA 17 21% 81.5%
Satisfacción 15 18.5% 100%

Distribución de Motivos para no participar en voluntariados (respuestas múltiples)
Categoría Frecuencia % Frecuencia % Acumulado
Falta de interés 1 2.1% 2.1%
Falta de oportunidades 10 21.3% 23.4%
Falta de tiempo 9 19.1% 42.5%
NA 25 53.2% 95.7%
Prejuicios 2 4.3% 100%

Distribución de Beneficios esperados al participar (respuestas múltiples)
Categoría Frecuencia % Frecuencia % Acumulado
Aprendizaje 13 19.1% 19.1%
Autoestima 3 4.4% 23.5%
Consciencia 8 11.8% 35.3%
Curriculum 5 7.4% 42.7%
Empatía 5 7.4% 50.1%
NA 25 36.8% 86.9%
Satisfacción 9 13.2% 100%


1.1 🤝 Sujetos que han participado previamente en voluntariados (n = 25)

👤🤝 Variables de respuesta única

vars_condicionales_si <- c(
  "Cantidad_voluntariados" = "Cantidad de voluntariados realizados",
  "Percibe_beneficio" = "Percibe algún beneficio por realizar voluntariados",
  "Volveria_participar" = "Volvería a participar en algún voluntariado"
)

# --- Ejecutar la función 'tabla_apa_categorica' ---
# (Esta función fue definida en el chunk 'setup_funciones_tablas')
for (var_col in names(vars_condicionales_si)) {
  tabla_apa_categorica(datos[[var_col]], nombre_variable = vars_condicionales_si[[var_col]])
}
Distribución de Cantidad de voluntariados realizados
Categoría Frecuencia % Frecuencia % Acumulado
1 4 16.7% 16.7%
10 1 4.2% 20.9%
2 9 37.5% 58.4%
3 5 20.8% 79.2%
4 2 8.3% 87.5%
5 3 12.5% 100%

Distribución de Percibe algún beneficio por realizar voluntariados
Categoría Frecuencia % Frecuencia % Acumulado
Si 25 100% 100%

Distribución de Volvería a participar en algún voluntariado
Categoría Frecuencia % Frecuencia % Acumulado
No 3 12% 12%
Si 22 88% 100%


👤🤝 Variables de respuesta múltiple

Cada tabla a continuación representa variables donde los participantes podían seleccionar más de una opción. Las respuestas fueron separadas por comas y desagregadas para su análisis. Esta decisión metodológica permite visualizar la diversidad de experiencias y motivaciones sin forzar exclusividad en las categorías.

tabla_apa_multiple <- function(variable, nombre_variable) {
  df <- data.frame(respuesta = variable)

  df <- df %>%
    separate_rows(respuesta, sep = ",") %>%
    mutate(respuesta = trimws(respuesta)) %>%
    filter(
      !is.na(respuesta),
      respuesta != "",
      toupper(respuesta) != "NA"
    )

  frec <- table(df$respuesta)
  porc <- round(prop.table(frec) * 100, 1)
  acum <- round(cumsum(porc), 1)

  tabla <- data.frame(
    Categoría = names(frec),
    Frecuencia = as.vector(frec),
    `% Frecuencia` = paste0(porc, "%"),
    `% Acumulado` = paste0(acum, "%"),
    check.names = FALSE
  )

  # Título con línea inferior
  cat('<div style="font-family:\'Lucida Sans\', sans-serif; font-size:14pt; display:table; margin-left:auto; margin-right:auto;">')
  cat(paste0('<div style="text-align:left; border-bottom: 1px solid black; margin-bottom:6px;"><em>Distribución de ', nombre_variable, ' (respuestas múltiples)</em></div>'))

  # Tabla centrada sin líneas internas
  print(kable(tabla, format = "html", align = c("c", "c", "c", "c"), escape = FALSE))

  # Línea debajo del encabezado
  cat('<style>thead tr {border-bottom: 1px solid black;}</style>')

  # Línea final
  cat('<div style="border-bottom: 1px solid black; margin-top:6px;"></div>')
  cat('</div>')
}
Distribución de quién le involucró en el voluntariado (respuestas múltiples)
Categoría Frecuencia % Frecuencia % Acumulado
Amigo 9 22% 22%
Escuela 16 39% 61%
Familia 10 24.4% 85.4%
Gobierno 1 2.4% 87.8%
Religión 5 12.2% 100%
Distribución de tipos de voluntariado realizados (respuestas múltiples)
Categoría Frecuencia % Frecuencia % Acumulado
Ambiental-ecológico 13 26.5% 26.5%
Educación 5 10.2% 36.7%
Emergencias-desastres 4 8.2% 44.9%
Salud 6 12.2% 57.1%
Social-comunitario 21 42.9% 100%
Distribución de motivaciones para participar en voluntariados (respuestas múltiples)
Categoría Frecuencia % Frecuencia % Acumulado
Altruismo 5 12.5% 12.5%
Compromiso cívico 4 10% 22.5%
Desarrollo personal 13 32.5% 55%
Diversión 9 22.5% 77.5%
Obligación 6 15% 92.5%
Reconocimiento 3 7.5% 100%
Distribución de beneficios percibidos de participar en voluntariados (respuestas múltiples)
Categoría Frecuencia % Frecuencia % Acumulado
Aprendizaje 9 14.1% 14.1%
Autoestima 2 3.1% 17.2%
Consciencia 6 9.4% 26.6%
Curriculum 13 20.3% 46.9%
Empatía 19 29.7% 76.6%
Satisfacción 15 23.4% 100%
Distribución de lo que más recuerda del voluntariado (respuestas múltiples)
Categoría Frecuencia % Frecuencia % Acumulado
A las personas 11 26.8% 26.8%
Lo que aprendí 7 17.1% 43.9%
Lo que hice 10 24.4% 68.3%
Lo que sentí 13 31.7% 100%

1.2 🧤 Sujetos que no han participado previamente en voluntariados (n = 17)

👤🧤 Variable de respuesta única

# Seleccionar y reordenar los datos
datos_largos_fase1 <- pivot_longer(datos,
                                  cols = c("Total_A", "Ayudar_A", "Compartir_A", "Empatia_A"),
                                  names_to = "Dimension",
                                  values_to = "Puntuacion"
                                  )

# Calcular los descriptivos
# Esta será la 'tabla' que usará tu plantilla
tabla <- datos_largos_fase1 %>%
  group_by(Dimension) %>%
  summarise(
    N = n(),
    Media = mean(Puntuacion, na.rm = TRUE),
    DE = sd(Puntuacion, na.rm = TRUE),
    Mediana = median(Puntuacion, na.rm = TRUE),
    Minimo = min(Puntuacion, na.rm = TRUE),
    Maximo = max(Puntuacion, na.rm = TRUE)
  ) %>%
  # Reordenar las columnas
  arrange(factor(Dimension, levels = c("Ayudar_A", "Compartir_A", "Empatia_A", "Total_A")))
Distribución de Le gustaría participar en un voluntariado
Categoría Frecuencia % Frecuencia % Acumulado
No 2 11.8% 11.8%
Si 15 88.2% 100%


👤🧤 Variables de respuesta múltiple

Cada tabla a continuación representa variables donde los participantes podían seleccionar más de una opción. Las respuestas fueron separadas por comas y desagregadas para su análisis. Esta decisión metodológica permite visualizar la diversidad de experiencias y motivaciones sin forzar exclusividad en las categorías.

Distribución de Motivos para no participar en voluntariado (respuestas múltiples)
Categoría Frecuencia % Frecuencia % Acumulado
Falta de interés 1 4.5% 4.5%
Falta de oportunidades 10 45.5% 50%
Falta de tiempo 9 40.9% 90.9%
Prejuicios 2 9.1% 100%
Distribución de Beneficios esperados del voluntariado (respuestas múltiples)
Categoría Frecuencia % Frecuencia % Acumulado
Aprendizaje 13 30.2% 30.2%
Autoestima 3 7% 37.2%
Consciencia 8 18.6% 55.8%
Curriculum 5 11.6% 67.4%
Empatía 5 11.6% 79%
Satisfacción 9 20.9% 99.9%

2 🛡️ Análisis de la Escala de Prosocialidad (Pre-test)

2.1 🎯 Fiabilidad de la Escala de Prosocialidad (Alpha de Cronbach)

# Definición de ítems
items_ayudar_A <- c("A_item1", "A_item3", "A_item4", "A_item6", "A_item7", "A_item13")
items_empatia_A <- c("A_item5", "A_item8", "A_item10", "A_item12", "A_item16")
items_compartir_A <- c("A_item2", "A_item9", "A_item14")
items_total_A <- c(items_ayudar_A, items_empatia_A, items_compartir_A)

# Calcular los Alfas
alfa_ayudar <- psych::alpha(datos[, items_ayudar_A], check.keys = TRUE)
alfa_compartir <- psych::alpha(datos[, items_compartir_A], check.keys = TRUE)
alfa_empatia <- psych::alpha(datos[, items_empatia_A], check.keys = TRUE)
alfa_total <- psych::alpha(datos[, items_total_A], check.keys = TRUE)

# Crear la tabla de resultados
tabla_para_imprimir_alfa <- data.frame(
  Dimension = c("Ayudar (Pre-test)", 
                "Compartir (Pre-test)", 
                "Empatía (Pre-test)", 
                "Total Escala (Pre-test)"),
  Alfa_Cronbach = c(alfa_ayudar$total$raw_alpha,
                    alfa_compartir$total$raw_alpha,
                    alfa_empatia$total$raw_alpha,
                    alfa_total$total$raw_alpha)
)
Fiabilidad de la Escala (Alfa de Cronbach)
Dimensión Alfa de Cronbach (α)
Ayudar (Pre-test) 0.753
Compartir (Pre-test) 0.504
Empatía (Pre-test) 0.584
Total Escala (Pre-test) 0.833

2.2 🧮 Estadística Descriptiva de la escala de prosocialidad

# Preparar datos
datos_largos_fase1 <- pivot_longer(datos,
                                  cols = c("Total_A", "Ayudar_A", "Compartir_A", "Empatia_A"),
                                  names_to = "Dimension",
                                  values_to = "Puntuacion"
                                  )

# Calcular descriptivos y guardar en una variable
tabla_para_imprimir <- datos_largos_fase1 %>%
  group_by(Dimension) %>%
  summarise(
    N = n(),
    Media = mean(Puntuacion, na.rm = TRUE),
    DE = sd(Puntuacion, na.rm = TRUE),
    Mediana = median(Puntuacion, na.rm = TRUE),
    Minimo = min(Puntuacion, na.rm = TRUE),
    Maximo = max(Puntuacion, na.rm = TRUE)
  ) %>%
  arrange(factor(Dimension, levels = c("Ayudar_A", "Compartir_A", "Empatia_A", "Total_A")))
Estadística Descriptiva de la Escala (Fase 1 - Pre-test)
Dimensión N Media DE Mediana Mín Máx
Ayudar_A 42 21.93 3.54 22 15 28
Compartir_A 42 12.52 1.63 12 8 15
Empatia_A 42 20.02 2.78 20 15 24
Total_A 42 54.48 6.83 53 40 67

📈🧮 Distribución de puntuaciones de la Escala de Prosocialiad

2.3 🧭 Pruebas de normalidad escala de prosocialidad

# Función de ayuda para calcular normalidad
calcular_normalidad <- function(variable) {
  
  # Limpieza de datos 
  variable <- as.character(variable)
  variable <- trimws(variable)
  variable <- variable[!is.na(variable) & variable != "" & variable != "NA"]
  variable <- as.numeric(variable)
  
  # Check de seguridad
  if (length(variable) < 3) {
    return(list(Shapiro_W = NA, Shapiro_p = NA, KS_D = NA, KS_p = NA))
  }
  
  # Pruebas (se guardan los resultados)
  shapiro <- shapiro.test(variable)
  ks <- ks.test(variable, "pnorm", mean(variable), sd(variable))
  
  # Retornar una lista con los valores clave
  return(list(
    Shapiro_W = shapiro$statistic,
    Shapiro_p = shapiro$p.value,
    KS_D = ks$statistic,
    KS_p = ks$p.value
  ))
}

# Aplicar la función a cada dimensión 
res_ayudar <- calcular_normalidad(datos$Ayudar_A)
res_compartir <- calcular_normalidad(datos$Compartir_A)
res_empatia <- calcular_normalidad(datos$Empatia_A)
res_total <- calcular_normalidad(datos$Total_A)

# Crear el data.frame con los resultados 
tabla_para_imprimir_normalidad <- data.frame(
  Dimension = c("Ayudar (Pre-test)", 
                "Compartir (Pre-test)", 
                "Empatía (Pre-test)", 
                "Total Prosocialidad (Pre-test)"),
  Shapiro_W = c(res_ayudar$Shapiro_W, res_compartir$Shapiro_W, res_empatia$Shapiro_W, res_total$Shapiro_W),
  Shapiro_p_value = c(res_ayudar$Shapiro_p, res_compartir$Shapiro_p, res_empatia$Shapiro_p, res_total$Shapiro_p),
  KS_D = c(res_ayudar$KS_D, res_compartir$KS_D, res_empatia$KS_D, res_total$KS_D),
  KS_p_value = c(res_ayudar$KS_p, res_compartir$KS_p, res_empatia$KS_p, res_total$KS_p)
)
Pruebas de Normalidad de la Escala (Fase 1 - Pre-test)
Dimensión Shapiro W p-value (S) KS D p-value (KS)
Ayudar (Pre-test) 0.953 0.083 0.125 0.524
Compartir (Pre-test) 0.932 0.016 0.159 0.236
Empatía (Pre-test) 0.934 0.018 0.120 0.584
Total Prosocialidad (Pre-test) 0.955 0.094 0.140 0.385

📈🧭 Gráficos Q-Q plot de normalidad Escala de Prosocialidad

# Cargar librería (si no está en tu setup)
library(ggplot2)

# Crear etiquetas limpias para las facetas
facet_labels <- c(
  "Ayudar_A" = "Ayudar",
  "Compartir_A" = "Compartir",
  "Empatia_A" = "Empatía",
  "Total_A" = "Total Escala"
)

# Crear el gráfico
# Usamos 'datos_largos_fase1' (creado en el chunk 'descriptivos_calculo')
ggplot(datos_largos_fase1, aes(sample = Puntuacion)) +
  
  # 1. geom_qq() grafica los puntos
  geom_qq(color = "#3498DB", size = 2) +
  
  # 2. geom_qq_line() dibuja la línea de referencia CORRECTA
  geom_qq_line(color = "#E74C3C", linetype = "dashed", linewidth = 1) +
  
  # 3. facet_wrap() crea la cuadrícula 2x2
  facet_wrap(~ Dimension, scales = "free", labeller = as_labeller(facet_labels)) +
  
  # Títulos y tema
  labs(
    title = "Gráficos Q-Q de Normalidad de la Escala (Fase 1 - Pre-test)",
    x = "Cuantiles teóricos (Normal)",
    y = "Cuantiles observados"
  ) +
  theme_minimal(base_size = 12)

3 ⚖️ Análisis de Línea Base (Comparación Interna del Grupo)

# Cargar librerías
library(rstatix)
library(dplyr)

# Preparar datos:
datos_linea_base <- datos %>%
  filter(Ha_voluntariado %in% c("Si", "No"))

# --- Check de Seguridad ---
# Comprobar si tenemos al menos dos grupos para comparar
if (n_distinct(datos_linea_base$Ha_voluntariado) < 2) {
  
  # Si no, crear tablas de NA para que el chunk de impresión no falle
  levene_resultado <- data.frame(df1=NA_real_, df2=NA_real_, statistic=NA_real_, p=NA_real_)
  t_resultado <- data.frame(Variable="Total_A", n1=NA_real_, n2=NA_real_, t=NA_real_, df=NA_real_, p=NA_real_)
  
} else {
  
  # Si todo está bien, correr las pruebas
  levene_resultado <- datos_linea_base %>%
    levene_test(Total_A ~ Ha_voluntariado)
  
  t_resultado <- datos_linea_base %>%
    t_test(Total_A ~ Ha_voluntariado, var.equal = FALSE) %>%
    select(Variable = .y., n1, n2, t = statistic, df, p = p)
}
Prueba de Homogeneidad de Varianzas (Levene) - Experiencia Previa
df1 df2 Estadístico F p-value
1 40 1.279 0.265

Prueba t de Muestras Independientes - Prosocialidad por Experiencia Previa (Sí vs. No)
Variable N (No) N (Sí) Estadístico t df p-value
Total_A 17 25 -0.429 38.15 0.67

4.📍 Identificación de Casos Atípicos

graficar_boxplot <- function(variable, nombre_dim, sujetos, entrevistados = c("9", "15", "19", "20", "41", "42")) {
  variable <- as.character(variable)
  sujetos <- as.character(sujetos)

  # Filtrar simultáneamente
  filtro <- !is.na(variable) & variable != "" & variable != "NA"
  variable_filtrada <- suppressWarnings(as.numeric(variable[filtro]))
  sujetos_filtrados <- sujetos[filtro]

  df <- data.frame(Sujeto = sujetos_filtrados, Puntaje = variable_filtrada)

  # Crear columna para color y leyenda
  df$Entrevistado <- ifelse(df$Sujeto %in% entrevistados, "Sí", "No")

  ggplot(df, aes(x = "", y = Puntaje)) +
    geom_boxplot(fill = "#D5DBDB", outlier.color = "#E74C3C") +
    geom_text(aes(label = Sujeto, color = Entrevistado),
              position = position_jitter(width = 0.2),
              size = 3.5) +
    scale_color_manual(values = c("Sí" = "#E74C3C", "No" = "#7F8C8D")) +
    labs(
      title = paste("Boxplot con sujetos:", nombre_dim),
      subtitle = "Sujetos entrevistados señalados en rojo",
      x = "", y = "Puntaje",
      color = "Entrevistado"
    ) +
    theme_minimal(base_size = 12) +
    theme(legend.position = "right")
}

# Graficar cada dimensión con etiquetas de Serie
graficar_boxplot(datos$Ayudar_A, "Ayudar", datos$Serie)

graficar_boxplot(datos$Compartir_A, "Compartir", datos$Serie)

graficar_boxplot(datos$Empatia_A, "Empatía", datos$Serie)

graficar_boxplot(datos$Total_A, "Total prosocialidad", datos$Serie)