Paso 1: Cargar las librerías necesarias

# Instalamos el paquete psych para los descriptivos avanzados
library(psych)

# Cargamos readxl para poder importar el archivo Excel
library(readxl)

# Cargamos ggplot2 para la construcción de gráficos
library(ggplot2)

# Hacemos que R muestre los resultados en decimales y no en notación científica
options(scipen = 999)

Paso 2: Importar los datos

# Aplastamos en el apartado 'import datatest', seleccionamos from excel,
# en browse seleccionamos el archivo y guardamos con el nombre 'Datos'
Datos <- read_excel("C:/Users/Daniela/Documents/Bases/Datos.xlsx", 
                    sheet = "Datos")

Paso 3: Valores perdidos (NA) en GAD7_total

# Contamos cuántos valores perdidos hay en GAD7_total ANTES de limpiar
na_antes <- sum(is.na(Datos$GAD7_total))
cat("Valores perdidos en GAD7_total:", na_antes, "\n")
## Valores perdidos en GAD7_total: 12
# is.na() detecta cada celda vacía en la columna GAD7_total y devuelve TRUE o 
# FALSE. sum() cuenta cuántos TRUE hay
# Resultado esperado: 12 valores perdidos

# Eliminamos los 12 casos que no tienen dato en GAD7_total
Datos_limpios <- Datos[!is.na(Datos$GAD7_total), ]
# el ! significa "NO", entonces le estamos diciendo "quédate solo con las filas 
# que NO tienen NA en GAD7_total". El resultado se guarda en Datos_limpios

# Calculamos y reportamos el tamaño de muestra final efectivo
N_efectivo <- nrow(Datos_limpios)
cat("N efectivo (muestra válida para el análisis):", N_efectivo, "\n")
## N efectivo (muestra válida para el análisis): 638
# nrow() cuenta las filas que quedaron
# Resultado esperado: 638 participantes

# Confirmamos que ya no quedan NA en la variable principal
cat("NA en GAD7_total después de la limpieza:", sum(is.na(Datos_limpios$GAD7_total)), "\n")
## NA en GAD7_total después de la limpieza: 0

Paso 4: Estadísticos descriptivos de la muestra

# --- Medidas de tendencia central y variabilidad de la EDAD ---
cat("\n--- Descriptivos de la Edad ---\n")
## 
## --- Descriptivos de la Edad ---
mean(Datos_limpios$Edad)       # Media de edad
## [1] 34.54859
median(Datos_limpios$Edad)     # Mediana de edad
## [1] 33
sd(Datos_limpios$Edad)         # Desviación estándar de edad
## [1] 9.19337
min(Datos_limpios$Edad)        # Edad mínima de la muestra
## [1] 18
max(Datos_limpios$Edad)        # Edad máxima de la muestra
## [1] 78
range(Datos_limpios$Edad)      # Rango (mínimo y máximo juntos)
## [1] 18 78
# Resumen completo de la distribución de Edad
summary(Datos_limpios$Edad)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   18.00   28.00   33.00   34.55   39.00   78.00
# Resumen detallado con asimetría y curtosis usando psych
describe(Datos_limpios$Edad)
##    vars   n  mean   sd median trimmed  mad min max range skew kurtosis   se
## X1    1 638 34.55 9.19     33   33.62 7.41  18  78    60 1.07      1.5 0.36
# --- Frecuencias por Sexo ---
# table() nos dice cuántas personas hay de cada sexo
cat("\n--- Distribución por Sexo ---\n")
## 
## --- Distribución por Sexo ---
table(Datos_limpios$Sexo)
## 
## Hombre  Mujer 
##    265    373
# --- Medidas de tendencia central y variabilidad del GAD-7 ---
cat("\n--- Descriptivos del GAD7_total ---\n")
## 
## --- Descriptivos del GAD7_total ---
mean(Datos_limpios$GAD7_total)     # Puntaje promedio de ansiedad
## [1] 7.601881
median(Datos_limpios$GAD7_total)   # Valor central del GAD7
## [1] 7
sd(Datos_limpios$GAD7_total)       # Qué tanto varían los puntajes
## [1] 4.124224
min(Datos_limpios$GAD7_total)      # Puntaje más bajo registrado
## [1] 0
max(Datos_limpios$GAD7_total)      # Puntaje más alto registrado
## [1] 20
# Resumen completo del GAD-7 (mínimo, cuartiles, media, máximo)
summary(Datos_limpios$GAD7_total)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   0.000   4.000   7.000   7.602  10.000  20.000
# Resumen detallado del GAD-7 con asimetría y curtosis
describe(Datos_limpios$GAD7_total)
##    vars   n mean   sd median trimmed  mad min max range skew kurtosis   se
## X1    1 638  7.6 4.12      7    7.43 4.45   0  20    20 0.39    -0.22 0.16

Análisis 1: Frecuencias de niveles de ansiedad (GAD-7)

# Creamos una nueva columna que clasifica a cada persona en su nivel de ansiedad
# Puntos de corte del GAD-7:
#   0 a 4   = Ansiedad mínima
#   5 a 9   = Ansiedad leve
#   10 a 14 = Ansiedad moderada
#   15 a 21 = Ansiedad severa
Datos_limpios$Nivel_ansiedad <- ifelse(Datos_limpios$GAD7_total <= 4, "Mínima",
                                ifelse(Datos_limpios$GAD7_total <= 9, "Leve",
                                ifelse(Datos_limpios$GAD7_total <= 14, "Moderada",
                                                     "Severa")))

# Convertimos la variable a factor con el orden clínico correcto
Datos_limpios$Nivel_ansiedad <- factor(Datos_limpios$Nivel_ansiedad,
                                levels = c("Mínima", "Leve", "Moderada", "Severa"))

# Usamos table() para contar cuántas personas caen en cada nivel de ansiedad
tabla_niveles <- table(Datos_limpios$Nivel_ansiedad)
print(tabla_niveles)
## 
##   Mínima     Leve Moderada   Severa 
##      164      279      156       39
# Calculamos los porcentajes de cada nivel
cat("\nPorcentajes por nivel de ansiedad:\n")
## 
## Porcentajes por nivel de ansiedad:
round(prop.table(tabla_niveles) * 100, 2)
## 
##   Mínima     Leve Moderada   Severa 
##    25.71    43.73    24.45     6.11
# Histograma de la distribución del puntaje GAD-7
# geom_histogram() agrupa los puntajes en barras para ver cómo se distribuyen
ggplot(Datos_limpios, aes(x = GAD7_total)) +
  geom_histogram(binwidth = 1, fill = "orange", color = "black", alpha = 0.7) +
  # binwidth = 1 significa que cada barra representa un punto del puntaje
  labs(title = "Distribución del Puntaje Total GAD-7",
       x = "Puntaje GAD-7",
       y = "Frecuencia") +
  theme_minimal()

Análisis 2: Prueba t de Student — Ansiedad según Sexo

# Revisamos la media de ansiedad en cada grupo
# tapply aplica una función (mean) a una variable, separada por grupos
cat("Media de GAD7 por Sexo:\n")
## Media de GAD7 por Sexo:
tapply(Datos_limpios$GAD7_total, Datos_limpios$Sexo, mean)
##   Hombre    Mujer 
## 7.324528 7.798928
# Revisamos cuántas personas hay en cada grupo
cat("\nN por Sexo:\n")
## 
## N por Sexo:
table(Datos_limpios$Sexo)
## 
## Hombre  Mujer 
##    265    373
# Ejecutamos la prueba t de muestras independientes
# Variable dependiente primero, luego la variable que agrupa, separadas por ~
resultado_t <- t.test(Datos_limpios$GAD7_total ~ Datos_limpios$Sexo)
print(resultado_t)
## 
##  Welch Two Sample t-test
## 
## data:  Datos_limpios$GAD7_total by Datos_limpios$Sexo
## t = -1.4494, df = 590.68, p-value = 0.1478
## alternative hypothesis: true difference in means between group Hombre and group Mujer is not equal to 0
## 95 percent confidence interval:
##  -1.1172352  0.1684365
## sample estimates:
## mean in group Hombre  mean in group Mujer 
##             7.324528             7.798928
# Si el valor t es negativo, significa que el segundo grupo (Mujer) 
# tiene una puntuación más alta que el primero (Hombre)
# Boxplot de ansiedad por Sexo
# geom_boxplot() muestra la distribución completa de puntajes para cada grupo
# El subtítulo toma el p-value directamente del resultado para que sea exacto
ggplot(Datos_limpios, aes(x = Sexo, y = GAD7_total, fill = Sexo)) +
  geom_boxplot(alpha = 0.7, show.legend = FALSE) +
  scale_fill_manual(values = c("Mujer" = "#F5B041", "Hombre" = "#5DADE2")) +
  # R calcula e inserta el p-value automáticamente en el subtítulo
  labs(title = "Comparación de Puntajes GAD-7 según el Sexo",
       subtitle = paste("Prueba t de Student (p =", round(resultado_t$p.value, 4), ")"),
       x = "Sexo",
       y = "Puntaje Total de Ansiedad") +
  theme_minimal() +
  theme(plot.title = element_text(face = "bold", size = 13, hjust = 0.5),
        plot.subtitle = element_text(size = 11, hjust = 0.5, face = "italic"))

Análisis 3: Chi-cuadrado — Nivel de ansiedad según Situación Laboral

# Creamos la tabla de contingencia que cruza Situación laboral y Nivel de ansiedad
# Esto nos muestra cuántas personas de cada grupo laboral caen en cada nivel de ansiedad
tabla_comparacion <- table(Datos_limpios$Situacion_laboral, Datos_limpios$Nivel_ansiedad)
cat("\nTabla de contingencia (Situación laboral × Nivel de ansiedad):\n")
## 
## Tabla de contingencia (Situación laboral × Nivel de ansiedad):
print(tabla_comparacion)
##                
##                 Mínima Leve Moderada Severa
##   Desempleado/a     20   52       21     10
##   Empleado/a        95  134       81     20
##   Hogar             16   36       17      2
##   Independiente     23   38       27      5
##   Jubilado/a        10   19       10      2
# Ejecutamos la prueba Chi-cuadrado de independencia
# Si p < 0.05 hay una asociación estadísticamente significativa entre las variables
resultado_chi <- chisq.test(x = tabla_comparacion)
## Warning in chisq.test(x = tabla_comparacion): Chi-squared approximation may be
## incorrect
print(resultado_chi)
## 
##  Pearson's Chi-squared test
## 
## data:  tabla_comparacion
## X-squared = 11.113, df = 12, p-value = 0.5193
# Barras porcentuales apiladas por situación laboral
# position = "fill" apila las barras y las escala al 100% para comparar proporciones
ggplot(Datos_limpios, aes(x = Situacion_laboral, fill = Nivel_ansiedad)) +
  geom_bar(position = "fill", color = "white", alpha = 0.8) +
  # Convertimos el eje Y a porcentajes para facilitar la lectura
  scale_y_continuous(labels = scales::percent) +
  scale_fill_brewer(palette = "YlOrRd") +
  # R calcula e inserta el p-value automáticamente en el subtítulo
  labs(title = "Distribución de la Gravedad de Ansiedad por Situación Laboral",
       subtitle = paste("Prueba de Chi-cuadrado (p =", round(resultado_chi$p.value, 4), ")"),
       x = "Situación Laboral",
       y = "Porcentaje Proporcional",
       fill = "Nivel de Ansiedad") +
  theme_minimal() +
  theme(plot.title = element_text(face = "bold", size = 13, hjust = 0.5),
        plot.subtitle = element_text(size = 11, hjust = 0.5, face = "italic"),
        axis.text.x = element_text(angle = 15, hjust = 1))

        # Inclinamos las etiquetas del eje X para que no se encimen

Resumen final del procesamiento

cat("\n========= RESUMEN FINAL =========\n")
## 
## ========= RESUMEN FINAL =========
cat("Muestra inicial:                N =", nrow(Datos), "\n")
## Muestra inicial:                N = 650
cat("Valores perdidos en GAD7_total:   ", na_antes, "\n")
## Valores perdidos en GAD7_total:    12
cat("N efectivo para análisis:       N =", N_efectivo, "\n")
## N efectivo para análisis:       N = 638
cat("Media GAD7_total:                ", round(mean(Datos_limpios$GAD7_total), 2), "\n")
## Media GAD7_total:                 7.6
cat("DE GAD7_total:                   ", round(sd(Datos_limpios$GAD7_total), 2), "\n")
## DE GAD7_total:                    4.12
cat("\nAnálisis ejecutados:\n")
## 
## Análisis ejecutados:
cat("  1. Frecuencias de niveles de ansiedad (GAD-7)\n")
##   1. Frecuencias de niveles de ansiedad (GAD-7)
cat("  2. Prueba t de Student: Ansiedad por Sexo\n")
##   2. Prueba t de Student: Ansiedad por Sexo
cat("  3. Chi-cuadrado: Nivel de ansiedad por Situación Laboral\n")
##   3. Chi-cuadrado: Nivel de ansiedad por Situación Laboral
cat("==================================\n")
## ==================================