1 Introducción

1.1 Descripción del Estudio

Este documento presenta el análisis completo de un estudio que evalúa el cambio en conocimiento sobre Terapia Cognitivo Conductual (TCC) en estudiantes de un programa de diplomado. Los participantes fueron evaluados en tres momentos temporales:

  • Tiempo 1: Inicio del programa
  • Tiempo 2: Evaluación intermedia
  • Tiempo 3: Finalización del programa

1.2 Hipótesis

Se espera observar una mejora significativa en el conocimiento sobre TCC a lo largo del tiempo, manifestada en:

  1. Aumento en el puntaje total del instrumento
  2. Mejora en cada una de las dimensiones evaluadas
  3. Posible efecto diferencial según experiencia clínica previa

1.3 Estructura del Reporte

Este reporte incluye:

  • Estadísticas descriptivas completas
  • Análisis de medidas repetidas (ANOVA)
  • Comparaciones post-hoc
  • Análisis de poder estadístico
  • Visualizaciones
  • Interpretación de resultados

2 Preparación de Datos

2.1 Cargar Paquetes

# Manejo de datos
library(readxl)
library(tidyverse)
library(here)

# Análisis estadístico
library(lme4)
library(lmerTest)
library(emmeans)
library(car)
library(effectsize)
library(pwr)

# Tablas APA
library(apaTables)
library(flextable)
library(officer)
library(gt)

# Visualización
library(ggplot2)
library(patchwork)
library(scales)

cat("✓ Paquetes cargados exitosamente\n")
## ✓ Paquetes cargados exitosamente

2.2 Configurar Tema de Gráficos

# Tema personalizado para gráficos
tema_custom <- theme_minimal(base_size = 12) +
  theme(
    plot.title = element_text(face = "bold", size = 14, hjust = 0),
    plot.subtitle = element_text(size = 11, color = "gray30"),
    axis.title = element_text(face = "bold"),
    legend.position = "bottom",
    panel.grid.minor = element_blank(),
    strip.text = element_text(face = "bold", size = 11)
  )

theme_set(tema_custom)

2.3 Definir Dimensiones del Instrumento

# Dimensiones y sus ítems
dimensiones <- list(
  "Mastering_CBT" = c(40, 36, 30, 32, 31, 17, 26, 39, 44, 37, 50, 45, 22, 33, 23, 41, 34),
  "Generic_Competencies" = c(21, 46, 51, 16, 6, 25, 20, 27, 47, 48, 15, 49, 1, 2, 13),
  "CBT_Techniques" = c(9, 14, 18, 12, 3, 38, 5),
  "Formulating_Problems" = c(19, 4, 29, 10, 42)  # Ítems reversos
)

# Ítems con escala inversa
items_reversos <- c(19, 4, 29, 10, 42)

# Puntajes máximos
puntajes_max <- data.frame(
  Dimension = c("Total", names(dimensiones)),
  N_Items = c(44, sapply(dimensiones, length)),
  Min = c(44, sapply(dimensiones, length)),
  Max = c(220, sapply(dimensiones, length) * 5)
)

flextable(puntajes_max) %>%
  set_caption("Tabla 1. Estructura del Instrumento de Evaluación") %>%
  theme_booktabs() %>%
  autofit()
Tabla 1. Estructura del Instrumento de Evaluación

Dimension

N_Items

Min

Max

Total

44

44

220

Mastering_CBT

17

17

85

Generic_Competencies

15

15

75

CBT_Techniques

7

7

35

Formulating_Problems

5

5

25

2.4 Cargar Datos

# AJUSTAR ESTA RUTA según la ubicación de tu archivo
ruta_archivo <- "C:/Users/marco/Downloads/Datos_corregidos.xlsx"

# Leer datos
datos <- read_excel(ruta_archivo)

# Renombrar columnas principales
colnames(datos)[1:3] <- c("ID", "Medicion", "Exp_Clinica")

# Mostrar estructura
cat("Dimensiones de los datos:", nrow(datos), "filas ×", ncol(datos), "columnas\n")
## Dimensiones de los datos: 93 filas × 47 columnas
cat("Participantes únicos:", length(unique(datos$ID)), "\n")
## Participantes únicos: 31
cat("Mediciones por participante:", table(table(datos$ID)), "\n")
## Mediciones por participante: 31

2.5 Procesar Datos

# 1. Revertir ítems de escala inversa
for(item in items_reversos) {
  col_name <- as.character(item)
  if(col_name %in% colnames(datos)) {
    datos[[col_name]] <- 6 - datos[[col_name]]
  }
}

cat("✓ Ítems reversos procesados:", paste(items_reversos, collapse = ", "), "\n")
## ✓ Ítems reversos procesados: 19, 4, 29, 10, 42
# 2. Calcular puntajes por dimensión
for(dim in names(dimensiones)) {
  items <- as.character(dimensiones[[dim]])
  items_disponibles <- items[items %in% colnames(datos)]
  datos[[dim]] <- rowSums(datos[, items_disponibles, drop = FALSE], na.rm = TRUE)
}

cat("✓ Puntajes por dimensión calculados\n")
## ✓ Puntajes por dimensión calculados
# 3. Calcular puntaje total
item_cols <- as.character(1:51)
item_cols_disponibles <- item_cols[item_cols %in% colnames(datos)]
datos$Total <- rowSums(datos[, item_cols_disponibles, drop = FALSE], na.rm = TRUE)

cat("✓ Puntaje total calculado\n")
## ✓ Puntaje total calculado
# 4. Factorizar variables
datos <- datos %>%
  mutate(
    ID = as.factor(ID),
    Medicion = factor(Medicion, levels = c(1, 2, 3),
                      labels = c("Tiempo 1", "Tiempo 2", "Tiempo 3")),
    Exp_Clinica = factor(Exp_Clinica, 
                         levels = c(0, 1),
                         labels = c("Sin experiencia", "Con experiencia"))
  )

cat("✓ Variables factorizadas\n")
## ✓ Variables factorizadas

3 Estadísticas Descriptivas

3.1 Puntaje Total

# Calcular estadísticos descriptivos
desc_total <- datos %>%
  group_by(Medicion, Exp_Clinica) %>%
  summarise(
    N = n(),
    M = mean(Total),
    SD = sd(Total),
    SE = SD / sqrt(N),
    CI_lower = M - 1.96 * SE,
    CI_upper = M + 1.96 * SE,
    Min = min(Total),
    Max = max(Total),
    .groups = "drop"
  )

# Tabla APA usando flextable
desc_total %>%
  mutate(
    `M (SD)` = sprintf("%.2f (%.2f)", M, SD),
    `95% IC` = sprintf("[%.2f, %.2f]", CI_lower, CI_upper),
    Rango = sprintf("[%.0f, %.0f]", Min, Max)
  ) %>%
  select(Medicion, Exp_Clinica, N, `M (SD)`, `95% IC`, Rango) %>%
  flextable() %>%
  set_caption("Tabla 2. Estadísticas Descriptivas del Puntaje Total por Tiempo y Grupo") %>%
  merge_v(j = "Medicion") %>%
  theme_booktabs() %>%
  autofit() %>%
  align(align = "center", part = "all") %>%
  align(j = 1:2, align = "left", part = "body")
Tabla 2. Estadísticas Descriptivas del Puntaje Total por Tiempo y Grupo

Medicion

Exp_Clinica

N

M (SD)

95% IC

Rango

Tiempo 1

Sin experiencia

9

123.67 (27.10)

[105.96, 141.37]

[73, 148]

Con experiencia

22

158.32 (26.34)

[147.31, 169.33]

[89, 207]

Tiempo 2

Sin experiencia

9

147.11 (37.38)

[122.69, 171.54]

[78, 214]

Con experiencia

22

172.59 (23.10)

[162.94, 182.24]

[122, 213]

Tiempo 3

Sin experiencia

9

163.56 (26.70)

[146.11, 181.00]

[135, 220]

Con experiencia

22

179.59 (19.41)

[171.48, 187.70]

[144, 215]

Nota. M = Media; SD = Desviación Estándar; IC = Intervalo de Confianza al 95%. Puntaje total: rango teórico = 44-220.

3.2 Estadísticos por Dimensión

# Preparar datos largos
datos_largo <- datos %>%
  select(ID, Medicion, Exp_Clinica, all_of(names(dimensiones)), Total) %>%
  pivot_longer(
    cols = c(Total, all_of(names(dimensiones))),
    names_to = "Dimension",
    values_to = "Puntaje"
  ) %>%
  mutate(
    Dimension = factor(Dimension,
                      levels = c("Total", names(dimensiones)),
                      labels = c("Puntaje Total", "Dominio de teoría y habilidades",
                                "Competencias genéricas", "Uso de técnicas",
                                "Formulación de problemas"))
  )

# Calcular descriptivos
desc_dim <- datos_largo %>%
  group_by(Dimension, Medicion) %>%
  summarise(
    N = n(),
    M = mean(Puntaje),
    SD = sd(Puntaje),
    .groups = "drop"
  ) %>%
  pivot_wider(
    names_from = Medicion,
    values_from = c(M, SD),
    names_glue = "{Medicion}_{.value}"
  )

# Formatear como tabla APA
desc_dim %>%
  mutate(
    `Tiempo 1` = sprintf("%.2f (%.2f)", `Tiempo 1_M`, `Tiempo 1_SD`),
    `Tiempo 2` = sprintf("%.2f (%.2f)", `Tiempo 2_M`, `Tiempo 2_SD`),
    `Tiempo 3` = sprintf("%.2f (%.2f)", `Tiempo 3_M`, `Tiempo 3_SD`)
  ) %>%
  select(Dimension, `Tiempo 1`, `Tiempo 2`, `Tiempo 3`) %>%
  flextable() %>%
  set_caption("Tabla 3. Medias y Desviaciones Estándar por Dimensión y Tiempo") %>%
  theme_booktabs() %>%
  autofit() %>%
  align(align = "center", part = "all") %>%
  align(j = 1, align = "left", part = "body") %>%
  add_footer_lines("Nota. Los valores se presentan como M (SD).")
Tabla 3. Medias y Desviaciones Estándar por Dimensión y Tiempo

Dimension

Tiempo 1

Tiempo 2

Tiempo 3

Puntaje Total

148.26 (30.61)

165.19 (29.74)

174.94 (22.55)

Dominio de teoría y habilidades

47.39 (15.51)

58.39 (14.12)

64.26 (10.22)

Competencias genéricas

56.81 (11.11)

59.84 (10.46)

62.23 (8.44)

Uso de técnicas

23.68 (5.36)

25.90 (4.92)

26.90 (3.87)

Formulación de problemas

20.39 (2.60)

21.06 (2.93)

21.55 (2.78)

Nota. Los valores se presentan como M (SD).


4 Visualizaciones Descriptivas

4.1 Evolución del Puntaje Total

ggplot(datos, aes(x = Medicion, y = Total, group = ID, color = Exp_Clinica)) +
  geom_line(alpha = 0.3, linewidth = 0.5) +
  geom_point(alpha = 0.3, size = 2) +
  stat_summary(aes(group = Exp_Clinica), fun = mean, geom = "line", linewidth = 2) +
  stat_summary(aes(group = Exp_Clinica), fun = mean, geom = "point", 
               size = 4, shape = 21, fill = "white", stroke = 1.5) +
  stat_summary(aes(group = Exp_Clinica), fun.data = mean_se, 
               geom = "errorbar", width = 0.2, linewidth = 1) +
  geom_hline(yintercept = 220, linetype = "dashed", color = "gray40", alpha = 0.6) +
  scale_color_manual(values = c("#E69F00", "#56B4E9")) +
  scale_y_continuous(limits = c(44, 220), breaks = seq(50, 220, 25)) +
  facet_wrap(~ Exp_Clinica) +
  labs(
    title = "Trayectorias Individuales del Puntaje Total",
    subtitle = "Líneas delgadas: participantes | Línea gruesa: media grupal | Línea punteada: máximo teórico",
    x = "Momento de Evaluación",
    y = "Puntaje Total (rango: 44-220)",
    color = "Experiencia Clínica"
  ) +
  theme(legend.position = "none")
Figura 1. Evolución del puntaje total a lo largo del tiempo por grupo de experiencia clínica.

Figura 1. Evolución del puntaje total a lo largo del tiempo por grupo de experiencia clínica.

4.2 Evolución por Dimensión

# Preparar datos con límites
limites_ejes <- data.frame(
  Dimension = c("Puntaje Total", "Dominio de teoría y habilidades",
                "Competencias genéricas", "Uso de técnicas",
                "Formulación de problemas"),
  Min = c(44, 17, 15, 7, 5),
  Max = c(220, 85, 75, 35, 25)
)

stats_dim <- datos_largo %>%
  group_by(Dimension, Medicion, Exp_Clinica) %>%
  summarise(
    Media = mean(Puntaje),
    SE = sd(Puntaje) / sqrt(n()),
    .groups = "drop"
  ) %>%
  left_join(limites_ejes, by = "Dimension")

ggplot(stats_dim, aes(x = Medicion, y = Media, 
                      color = Exp_Clinica, group = Exp_Clinica)) +
  geom_line(linewidth = 1.2) +
  geom_point(size = 3) +
  geom_errorbar(aes(ymin = Media - SE, ymax = Media + SE), 
                width = 0.2, linewidth = 0.8) +
  geom_hline(aes(yintercept = Max), linetype = "dashed", 
             color = "gray40", alpha = 0.5) +
  geom_blank(aes(y = Min)) +
  geom_blank(aes(y = Max)) +
  facet_wrap(~ Dimension, scales = "free_y", ncol = 2) +
  scale_color_manual(values = c("#E69F00", "#56B4E9")) +
  labs(
    title = "Evolución por Dimensión del Conocimiento en TCC",
    subtitle = "Línea punteada indica puntaje máximo posible",
    x = "Momento de Evaluación",
    y = "Puntaje Promedio",
    color = "Experiencia Clínica",
    caption = "Barras de error representan errores estándar de la media"
  )
Figura 2. Evolución del conocimiento por dimensión.

Figura 2. Evolución del conocimiento por dimensión.


5 Análisis Inferencial

5.1 ANOVA de Medidas Repetidas - Puntaje Total

# Modelo mixto
modelo_total <- lmer(Total ~ Medicion * Exp_Clinica + (1|ID),
                     data = datos)

# Tabla ANOVA
anova_resultado <- Anova(modelo_total, type = 3)

# Formatear como tabla
anova_resultado %>%
  as.data.frame() %>%
  rownames_to_column("Efecto") %>%
  mutate(
    Sig = case_when(
      `Pr(>Chisq)` < 0.001 ~ "***",
      `Pr(>Chisq)` < 0.01 ~ "**",
      `Pr(>Chisq)` < 0.05 ~ "*",
      TRUE ~ "ns"
    )
  ) %>%
  flextable() %>%
  set_caption("Tabla 4. ANOVA de Medidas Repetidas para Puntaje Total") %>%
  colformat_double(j = c("Chisq", "Pr(>Chisq)"), digits = 4) %>%
  theme_booktabs() %>%
  autofit() %>%
  add_footer_lines("Nota. ***p < .001, **p < .01, *p < .05")
Tabla 4. ANOVA de Medidas Repetidas para Puntaje Total

Efecto

Chisq

Df

Pr(>Chisq)

Sig

(Intercept)

212.1210

1

0.0000

***

Medicion

39.1513

2

0.0000

***

Exp_Clinica

11.8191

1

0.0006

***

Medicion:Exp_Clinica

5.9907

2

0.0500

ns

Nota. ***p < .001, **p < .01, *p < .05

5.1.1 Tamaños del Efecto

# Calcular eta cuadrado parcial
eta <- eta_squared(modelo_total, partial = TRUE)

eta %>%
  as.data.frame() %>%
  flextable() %>%
  set_caption("Tabla 5. Tamaños del Efecto (Eta Cuadrado Parcial)") %>%
  colformat_double(j = c("Eta2_partial", "CI_low", "CI_high"), digits = 3) %>%
  theme_booktabs() %>%
  autofit() %>%
  add_footer_lines("Nota. Pequeño: η² < .06, Mediano: η² < .14, Grande: η² ≥ .14 (Cohen, 1988)")
Tabla 5. Tamaños del Efecto (Eta Cuadrado Parcial)

Parameter

Eta2_partial

CI

CI_low

CI_high

Medicion

0.532

0.95

0.379

1.000

Exp_Clinica

0.213

0.95

0.035

1.000

Medicion:Exp_Clinica

0.094

0.95

0.000

1.000

Nota. Pequeño: η² < .06, Mediano: η² < .14, Grande: η² ≥ .14 (Cohen, 1988)

5.2 Comparaciones Post-Hoc

# Medias marginales estimadas
emm_medicion <- emmeans(modelo_total, ~ Medicion)

# Comparaciones pareadas
comparaciones <- pairs(emm_medicion, adjust = "bonferroni")

# Formatear resultados
comp_df <- summary(comparaciones) %>%
  as.data.frame() %>%
  mutate(
    Sig = case_when(
      p.value < 0.001 ~ "***",
      p.value < 0.01 ~ "**",
      p.value < 0.05 ~ "*",
      TRUE ~ "ns"
    ),
    `d de Cohen` = estimate / sqrt(2 * SE^2)  # Aproximación
  )

comp_df %>%
  select(contrast, estimate, SE, df, t.ratio, p.value, `d de Cohen`, Sig) %>%
  flextable() %>%
  set_caption("Tabla 6. Comparaciones Pareadas entre Momentos de Evaluación") %>%
  colformat_double(j = c("estimate", "SE", "t.ratio", "p.value", "d de Cohen"), 
                  digits = 3) %>%
  theme_booktabs() %>%
  autofit() %>%
  add_footer_lines("Nota. Corrección Bonferroni aplicada (α = .0167 para tres comparaciones).")
Tabla 6. Comparaciones Pareadas entre Momentos de Evaluación

contrast

estimate

SE

df

t.ratio

p.value

d de Cohen

Sig

Tiempo 1 - Tiempo 2

-18.859

3.803

58

-4.959

0.000

-3.506

***

Tiempo 1 - Tiempo 3

-30.581

3.803

58

-8.041

0.000

-5.686

***

Tiempo 2 - Tiempo 3

-11.722

3.803

58

-3.082

0.009

-2.180

**

Nota. Corrección Bonferroni aplicada (α = .0167 para tres comparaciones).

# Medias marginales
summary(emm_medicion) %>%
  as.data.frame() %>%
  flextable() %>%
  set_caption("Tabla 7. Medias Marginales Estimadas por Momento de Evaluación") %>%
  colformat_double(j = c("emmean", "SE", "lower.CL", "upper.CL"), digits = 2) %>%
  theme_booktabs() %>%
  autofit()
Tabla 7. Medias Marginales Estimadas por Momento de Evaluación

Medicion

emmean

SE

df

lower.CL

upper.CL

Tiempo 1

140.99

5.04

43

130.83

151.16

Tiempo 2

159.85

5.04

43

149.69

170.01

Tiempo 3

171.57

5.04

43

161.41

181.74

5.3 ANOVA por Dimensión

# Función para analizar una dimensión
analizar_dimension <- function(datos, variable) {
  modelo <- lmer(as.formula(paste(variable, "~ Medicion * Exp_Clinica + (1|ID)")),
                data = datos)
  anova_res <- Anova(modelo, type = 3)
  eta_res <- eta_squared(modelo, partial = TRUE)
  
  list(
    anova = anova_res,
    eta = eta_res,
    modelo = modelo
  )
}

# Analizar todas las dimensiones
resultados_dim <- lapply(names(dimensiones), function(dim) {
  analizar_dimension(datos, dim)
})
names(resultados_dim) <- names(dimensiones)

# Crear tabla resumen
resumen_dim <- data.frame()

for(dim in names(dimensiones)) {
  anova_res <- resultados_dim[[dim]]$anova
  eta_res <- resultados_dim[[dim]]$eta
  
  # Extraer valores para efecto de Medicion
  f_val <- anova_res["Medicion", "Chisq"]
  p_val <- anova_res["Medicion", "Pr(>Chisq)"]
  eta_val <- eta_res$Eta2_partial[eta_res$Parameter == "Medicion"]
  
  resumen_dim <- rbind(resumen_dim, data.frame(
    Dimension = gsub("_", " ", dim),
    F = f_val,
    p = p_val,
    `η²` = eta_val,
    check.names = FALSE
  ))
}

resumen_dim %>%
  mutate(
    Sig = case_when(
      p < 0.001 ~ "***",
      p < 0.01 ~ "**",
      p < 0.05 ~ "*",
      TRUE ~ "ns"
    )
  ) %>%
  flextable() %>%
  set_caption("Tabla 8. Resumen de ANOVA por Dimensión (Efecto Principal del Tiempo)") %>%
  colformat_double(j = c("F", "p", "η²"), digits = 3) %>%
  theme_booktabs() %>%
  autofit() %>%
  add_footer_lines("Nota. ***p < .001, **p < .01, *p < .05")
Tabla 8. Resumen de ANOVA por Dimensión (Efecto Principal del Tiempo)

Dimension

F

p

η²

Sig

Mastering CBT

46.648

0.000

0.603

***

Generic Competencies

25.049

0.000

0.325

***

CBT Techniques

14.250

0.001

0.275

***

Formulating Problems

0.082

0.960

0.060

ns

Nota. ***p < .001, **p < .01, *p < .05

5.4 Comparaciones Post-Hoc por Dimensión

A continuación se presentan las comparaciones pareadas entre momentos de evaluación para cada dimensión del instrumento.

5.4.1 Mastering CBT Theory and Skills

# Medias marginales y comparaciones
emm_mastering <- emmeans(resultados_dim$Mastering_CBT$modelo, ~ Medicion)
comp_mastering <- pairs(emm_mastering, adjust = "bonferroni")

# Tabla de comparaciones
summary(comp_mastering) %>%
  as.data.frame() %>%
  mutate(
    Sig = case_when(
      p.value < 0.001 ~ "***",
      p.value < 0.01 ~ "**",
      p.value < 0.05 ~ "*",
      TRUE ~ "ns"
    ),
    `d de Cohen` = estimate / sqrt(2 * SE^2)
  ) %>%
  select(contrast, estimate, SE, df, t.ratio, p.value, `d de Cohen`, Sig) %>%
  flextable() %>%
  set_caption("Tabla 9. Comparaciones Post-Hoc: Mastering CBT Theory and Skills") %>%
  colformat_double(j = c("estimate", "SE", "t.ratio", "p.value", "d de Cohen"), 
                  digits = 3) %>%
  theme_booktabs() %>%
  autofit() %>%
  add_footer_lines("Nota. Corrección Bonferroni (α = .0167). d = tamaño del efecto de Cohen.")
Tabla 9. Comparaciones Post-Hoc: Mastering CBT Theory and Skills

contrast

estimate

SE

df

t.ratio

p.value

d de Cohen

Sig

Tiempo 1 - Tiempo 2

-12.051

2.013

58

-5.985

0.000

-4.232

***

Tiempo 1 - Tiempo 3

-18.649

2.013

58

-9.262

0.000

-6.549

***

Tiempo 2 - Tiempo 3

-6.598

2.013

58

-3.277

0.005

-2.317

**

Nota. Corrección Bonferroni (α = .0167). d = tamaño del efecto de Cohen.

# Medias marginales
summary(emm_mastering) %>%
  as.data.frame() %>%
  flextable() %>%
  set_caption("Medias Marginales Estimadas: Mastering CBT") %>%
  colformat_double(j = c("emmean", "SE", "lower.CL", "upper.CL"), digits = 2) %>%
  theme_booktabs() %>%
  autofit()
Medias Marginales Estimadas: Mastering CBT

Medicion

emmean

SE

df

lower.CL

upper.CL

Tiempo 1

44.38

2.53

45

39.29

49.48

Tiempo 2

56.43

2.53

45

51.34

61.53

Tiempo 3

63.03

2.53

45

57.93

68.13

5.4.2 Generic Psychotherapy Competencies

# Medias marginales y comparaciones
emm_generic <- emmeans(resultados_dim$Generic_Competencies$modelo, ~ Medicion)
comp_generic <- pairs(emm_generic, adjust = "bonferroni")

# Tabla de comparaciones
summary(comp_generic) %>%
  as.data.frame() %>%
  mutate(
    Sig = case_when(
      p.value < 0.001 ~ "***",
      p.value < 0.01 ~ "**",
      p.value < 0.05 ~ "*",
      TRUE ~ "ns"
    ),
    `d de Cohen` = estimate / sqrt(2 * SE^2)
  ) %>%
  select(contrast, estimate, SE, df, t.ratio, p.value, `d de Cohen`, Sig) %>%
  flextable() %>%
  set_caption("Tabla 10. Comparaciones Post-Hoc: Generic Psychotherapy Competencies") %>%
  colformat_double(j = c("estimate", "SE", "t.ratio", "p.value", "d de Cohen"), 
                  digits = 3) %>%
  theme_booktabs() %>%
  autofit() %>%
  add_footer_lines("Nota. Corrección Bonferroni (α = .0167). d = tamaño del efecto de Cohen.")
Tabla 10. Comparaciones Post-Hoc: Generic Psychotherapy Competencies

contrast

estimate

SE

df

t.ratio

p.value

d de Cohen

Sig

Tiempo 1 - Tiempo 2

-3.876

1.370

58

-2.828

0.019

-2.000

*

Tiempo 1 - Tiempo 3

-7.232

1.370

58

-5.277

0.000

-3.732

***

Tiempo 2 - Tiempo 3

-3.356

1.370

58

-2.449

0.052

-1.732

ns

Nota. Corrección Bonferroni (α = .0167). d = tamaño del efecto de Cohen.

# Medias marginales
summary(emm_generic) %>%
  as.data.frame() %>%
  flextable() %>%
  set_caption("Medias Marginales Estimadas: Generic Competencies") %>%
  colformat_double(j = c("emmean", "SE", "lower.CL", "upper.CL"), digits = 2) %>%
  theme_booktabs() %>%
  autofit()
Medias Marginales Estimadas: Generic Competencies

Medicion

emmean

SE

df

lower.CL

upper.CL

Tiempo 1

53.97

1.80

43.3

50.34

57.61

Tiempo 2

57.85

1.80

43.3

54.22

61.49

Tiempo 3

61.21

1.80

43.3

57.57

64.84

5.4.3 Using CBT Techniques Properly

# Medias marginales y comparaciones
emm_techniques <- emmeans(resultados_dim$CBT_Techniques$modelo, ~ Medicion)
comp_techniques <- pairs(emm_techniques, adjust = "bonferroni")

# Tabla de comparaciones
summary(comp_techniques) %>%
  as.data.frame() %>%
  mutate(
    Sig = case_when(
      p.value < 0.001 ~ "***",
      p.value < 0.01 ~ "**",
      p.value < 0.05 ~ "*",
      TRUE ~ "ns"
    ),
    `d de Cohen` = estimate / sqrt(2 * SE^2)
  ) %>%
  select(contrast, estimate, SE, df, t.ratio, p.value, `d de Cohen`, Sig) %>%
  flextable() %>%
  set_caption("Tabla 11. Comparaciones Post-Hoc: Using CBT Techniques Properly") %>%
  colformat_double(j = c("estimate", "SE", "t.ratio", "p.value", "d de Cohen"), 
                  digits = 3) %>%
  theme_booktabs() %>%
  autofit() %>%
  add_footer_lines("Nota. Corrección Bonferroni (α = .0167). d = tamaño del efecto de Cohen.")
Tabla 11. Comparaciones Post-Hoc: Using CBT Techniques Properly

contrast

estimate

SE

df

t.ratio

p.value

d de Cohen

Sig

Tiempo 1 - Tiempo 2

-2.422

0.823

58

-2.944

0.014

-2.082

*

Tiempo 1 - Tiempo 3

-3.816

0.823

58

-4.638

0.000

-3.280

***

Tiempo 2 - Tiempo 3

-1.394

0.823

58

-1.694

0.287

-1.198

ns

Nota. Corrección Bonferroni (α = .0167). d = tamaño del efecto de Cohen.

# Medias marginales
summary(emm_techniques) %>%
  as.data.frame() %>%
  flextable() %>%
  set_caption("Medias Marginales Estimadas: CBT Techniques") %>%
  colformat_double(j = c("emmean", "SE", "lower.CL", "upper.CL"), digits = 2) %>%
  theme_booktabs() %>%
  autofit()
Medias Marginales Estimadas: CBT Techniques

Medicion

emmean

SE

df

lower.CL

upper.CL

Tiempo 1

22.59

0.88

53.4

20.83

24.35

Tiempo 2

25.01

0.88

53.4

23.25

26.77

Tiempo 3

26.41

0.88

53.4

24.65

28.17

5.4.4 Formulating Clients’ Problems and Plans

# Medias marginales y comparaciones
emm_formulating <- emmeans(resultados_dim$Formulating_Problems$modelo, ~ Medicion)
comp_formulating <- pairs(emm_formulating, adjust = "bonferroni")

# Tabla de comparaciones
summary(comp_formulating) %>%
  as.data.frame() %>%
  mutate(
    Sig = case_when(
      p.value < 0.001 ~ "***",
      p.value < 0.01 ~ "**",
      p.value < 0.05 ~ "*",
      TRUE ~ "ns"
    ),
    `d de Cohen` = estimate / sqrt(2 * SE^2)
  ) %>%
  select(contrast, estimate, SE, df, t.ratio, p.value, `d de Cohen`, Sig) %>%
  flextable() %>%
  set_caption("Tabla 12. Comparaciones Post-Hoc: Formulating Problems and Plans") %>%
  colformat_double(j = c("estimate", "SE", "t.ratio", "p.value", "d de Cohen"), 
                  digits = 3) %>%
  theme_booktabs() %>%
  autofit() %>%
  add_footer_lines("Nota. Corrección Bonferroni (α = .0167). d = tamaño del efecto de Cohen.")
Tabla 12. Comparaciones Post-Hoc: Formulating Problems and Plans

contrast

estimate

SE

df

t.ratio

p.value

d de Cohen

Sig

Tiempo 1 - Tiempo 2

-0.510

0.462

58

-1.105

0.821

-0.781

ns

Tiempo 1 - Tiempo 3

-0.884

0.462

58

-1.915

0.181

-1.354

ns

Tiempo 2 - Tiempo 3

-0.374

0.462

58

-0.810

1.000

-0.572

ns

Nota. Corrección Bonferroni (α = .0167). d = tamaño del efecto de Cohen.

# Medias marginales
summary(emm_formulating) %>%
  as.data.frame() %>%
  flextable() %>%
  set_caption("Medias Marginales Estimadas: Formulating Problems") %>%
  colformat_double(j = c("emmean", "SE", "lower.CL", "upper.CL"), digits = 2) %>%
  theme_booktabs() %>%
  autofit()
Medias Marginales Estimadas: Formulating Problems

Medicion

emmean

SE

df

lower.CL

upper.CL

Tiempo 1

20.04

0.51

51.1

19.02

21.07

Tiempo 2

20.55

0.51

51.1

19.53

21.58

Tiempo 3

20.93

0.51

51.1

19.90

21.95

5.5 Resumen Visual de Cambios por Dimensión

# Preparar datos de cambios
cambios_data <- data.frame()

for(dim in names(dimensiones)) {
  emm <- emmeans(resultados_dim[[dim]]$modelo, ~ Medicion)
  comp <- summary(pairs(emm, adjust = "bonferroni"))
  
  for(i in 1:nrow(comp)) {
    cambios_data <- rbind(cambios_data, data.frame(
      Dimension = gsub("_", " ", dim),
      Comparacion = as.character(comp$contrast[i]),
      Estimado = comp$estimate[i],
      SE = comp$SE[i],
      p_valor = comp$p.value[i],
      Sig = ifelse(comp$p.value[i] < 0.0167, "Sig", "ns")
    ))
  }
}

# Gráfico
ggplot(cambios_data, aes(x = Comparacion, y = Estimado, fill = Sig)) +
  geom_col(color = "black", linewidth = 0.5) +
  geom_errorbar(aes(ymin = Estimado - SE, ymax = Estimado + SE),
                width = 0.3, linewidth = 0.8) +
  geom_hline(yintercept = 0, linetype = "dashed", color = "gray40") +
  facet_wrap(~ Dimension, scales = "free_y", ncol = 2) +
  scale_fill_manual(values = c("Sig" = "#56B4E9", "ns" = "#E0E0E0"),
                    labels = c("Sig" = "Significativo (p < .0167)", 
                              "ns" = "No significativo")) +
  coord_flip() +
  labs(
    title = "Magnitud de los Cambios por Dimensión",
    subtitle = "Diferencias entre momentos de evaluación con corrección Bonferroni",
    x = "",
    y = "Diferencia Estimada (puntos)",
    fill = ""
  ) +
  theme(legend.position = "bottom")
Figura 3. Cambios entre mediciones por dimensión.

Figura 3. Cambios entre mediciones por dimensión.


6 Análisis de Poder Estadístico

6.1 Poder A Priori (MDES)

# Parámetros del estudio
n_participantes <- length(unique(datos$ID))
n_mediciones <- 3
alpha <- 0.05

# Calcular correlación entre mediciones
datos_wide <- datos %>%
  select(ID, Medicion, Total) %>%
  pivot_wider(names_from = Medicion, values_from = Total)

# Los nombres de columnas serán "Tiempo 1", "Tiempo 2", "Tiempo 3"
# Crear versión con nombres simples
datos_wide_simple <- datos_wide %>%
  rename(T1 = `Tiempo 1`, T2 = `Tiempo 2`, T3 = `Tiempo 3`)

cor_mediciones <- cor(datos_wide_simple[, c("T1", "T2", "T3")], use = "complete.obs")
cor_promedio <- mean(cor_mediciones[lower.tri(cor_mediciones)])

# Encontrar f mínimo detectable
f_min <- uniroot(
  function(f) {
    pwr.anova.test(k = n_mediciones, n = n_participantes, 
                   f = f, sig.level = alpha)$power - 0.80
  },
  interval = c(0.01, 2),
  tol = 0.001
)$root

eta_min <- f_min^2 / (1 + f_min^2)

# Para comparaciones pareadas
d_min <- uniroot(
  function(d) {
    pwr.t.test(n = n_participantes, d = d, sig.level = alpha/3, 
               type = "paired")$power - 0.80
  },
  interval = c(0.01, 3),
  tol = 0.001
)$root

Análisis de Poder A Priori:

Con N = 31 participantes, k = 3 mediciones, y α = 0.05, el estudio tiene 80% de poder para detectar:

  • ANOVA de medidas repetidas: Cohen’s f ≥ 0.327 (equivalente a η² ≥ 0.097)
  • Comparaciones pareadas (con corrección Bonferroni): Cohen’s d ≥ 0.611

Estos valores representan el Tamaño Mínimo de Efecto Detectable (MDES). Efectos menores a estos umbrales podrían no ser detectables con esta muestra.

# Crear tabla de poder para diferentes tamaños de efecto
tamanos_efecto <- c(0.10, 0.25, 0.40, 0.50, f_min, 0.80)

poder_tabla <- data.frame()
for(f in tamanos_efecto) {
  poder <- pwr.anova.test(k = n_mediciones, n = n_participantes, 
                         f = f, sig.level = alpha)$power
  
  poder_tabla <- rbind(poder_tabla, data.frame(
    `Cohen's f` = f,
    `η²` = f^2 / (1 + f^2),
    Poder = poder,
    check.names = FALSE
  ))
}

poder_tabla %>%
  mutate(
    Categoría = case_when(
      `Cohen's f` < 0.25 ~ "Pequeño",
      `Cohen's f` < 0.40 ~ "Mediano",
      TRUE ~ "Grande"
    ),
    `Poder (%)` = sprintf("%.1f%%", Poder * 100)
  ) %>%
  flextable() %>%
  set_caption("Tabla 9. Poder Estadístico para Diferentes Tamaños de Efecto") %>%
  colformat_double(j = c("Cohen's f", "η²", "Poder"), digits = 3) %>%
  theme_booktabs() %>%
  autofit() %>%
  bold(i = ~ round(`Cohen's f`, 3) == round(f_min, 3)) %>%
  add_footer_lines(sprintf("Nota. MDES (80%% poder) destacado en negrita: f = %.3f", f_min))
Tabla 9. Poder Estadístico para Diferentes Tamaños de Efecto

Cohen's f

η²

Poder

Categoría

Poder (%)

0.100

0.010

0.124

Pequeño

12.4%

0.250

0.059

0.555

Mediano

55.5%

0.400

0.138

0.935

Grande

93.5%

0.500

0.200

0.993

Grande

99.3%

0.327

0.097

0.800

Mediano

80.0%

0.800

0.390

1.000

Grande

100.0%

Nota. MDES (80% poder) destacado en negrita: f = 0.327


7 Interpretación de Resultados

7.1 Hallazgos Principales

  1. Mejora Significativa en el Tiempo: Se observó un efecto principal altamente significativo del tiempo sobre el conocimiento en TCC (p < .001), con un tamaño del efecto grande (η² = 0.532).

  2. Progresión Continua: Todas las comparaciones pareadas fueron estadísticamente significativas incluso después de la corrección Bonferroni, indicando mejora continua en cada fase del diplomado.

  3. Magnitud del Cambio: Los estudiantes mejoraron en promedio 26.68 puntos (IC 95%: [18.25, 35.11]) del inicio al final del programa.

  4. Ausencia de Efecto Techo: El puntaje promedio final (174.9) representa aproximadamente 79.5% del máximo teórico, indicando que no hubo efecto techo que limitara la detección de mejoras.

7.2 Implicaciones

Los resultados demuestran que el programa de diplomado fue efectivo en mejorar el conocimiento sobre TCC. El tamaño del efecto observado excede ampliamente el MDES, proporcionando confianza en que estos hallazgos representan efectos reales y educativamente significativos.


8 Información de la Sesión

sessionInfo()
## R version 4.5.1 (2025-06-13 ucrt)
## Platform: x86_64-w64-mingw32/x64
## Running under: Windows 11 x64 (build 26200)
## 
## Matrix products: default
##   LAPACK version 3.12.1
## 
## locale:
## [1] LC_COLLATE=Spanish_Chile.utf8  LC_CTYPE=Spanish_Chile.utf8   
## [3] LC_MONETARY=Spanish_Chile.utf8 LC_NUMERIC=C                  
## [5] LC_TIME=Spanish_Chile.utf8    
## 
## time zone: America/Santiago
## tzcode source: internal
## 
## attached base packages:
## [1] stats     graphics  grDevices utils     datasets  methods   base     
## 
## other attached packages:
##  [1] scales_1.4.0     patchwork_1.3.2  gt_1.3.0         officer_0.7.3   
##  [5] flextable_0.9.10 apaTables_2.0.8  pwr_1.3-0        effectsize_1.0.1
##  [9] car_3.1-3        carData_3.0-5    emmeans_1.11.2-8 lmerTest_3.1-3  
## [13] lme4_1.1-37      Matrix_1.7-3     here_1.0.2       lubridate_1.9.4 
## [17] forcats_1.0.1    stringr_1.6.0    dplyr_1.1.4      purrr_1.2.0     
## [21] readr_2.1.6      tidyr_1.3.1      tibble_3.3.0     ggplot2_4.0.1   
## [25] tidyverse_2.0.0  readxl_1.4.5    
## 
## loaded via a namespace (and not attached):
##  [1] Rdpack_2.6.4            sandwich_3.1-1          rlang_1.1.6            
##  [4] magrittr_2.0.3          multcomp_1.4-28         compiler_4.5.1         
##  [7] systemfonts_1.3.1       vctrs_0.6.5             pkgconfig_2.0.3        
## [10] fastmap_1.2.0           backports_1.5.0         labeling_0.4.3         
## [13] rmarkdown_2.29          tzdb_0.5.0              nloptr_2.2.1           
## [16] ragg_1.5.0              xfun_0.53               cachem_1.1.0           
## [19] jsonlite_2.0.0          uuid_1.2-1              parallel_4.5.1         
## [22] broom_1.0.10            R6_2.6.1                bslib_0.9.0            
## [25] stringi_1.8.7           RColorBrewer_1.1-3      boot_1.3-31            
## [28] jquerylib_0.1.4         cellranger_1.1.0        numDeriv_2016.8-1.1    
## [31] estimability_1.5.1      Rcpp_1.1.0              knitr_1.50             
## [34] zoo_1.8-14              parameters_0.28.3       splines_4.5.1          
## [37] timechange_0.3.0        tidyselect_1.2.1        rstudioapi_0.17.1      
## [40] abind_1.4-8             yaml_2.3.10             codetools_0.2-20       
## [43] lattice_0.22-7          withr_3.0.2             bayestestR_0.17.0      
## [46] S7_0.2.0                askpass_1.2.1           coda_0.19-4.1          
## [49] evaluate_1.0.5          survival_3.8-3          zip_2.3.3              
## [52] xml2_1.4.0              pillar_1.11.0           reformulas_0.4.1       
## [55] insight_1.4.4           generics_0.1.4          rprojroot_2.1.1        
## [58] hms_1.1.3               minqa_1.2.8             glue_1.8.0             
## [61] gdtools_0.4.4           tools_4.5.1             data.table_1.17.8      
## [64] fs_1.6.6                mvtnorm_1.3-3           grid_4.5.1             
## [67] rbibutils_2.3           datawizard_1.3.0        nlme_3.1-168           
## [70] Formula_1.2-5           cli_3.6.5               textshaping_1.0.3      
## [73] fontBitstreamVera_0.1.1 gtable_0.3.6            sass_0.4.10            
## [76] digest_0.6.37           fontquiver_0.2.1        pbkrtest_0.5.5         
## [79] TH.data_1.1-4           farver_2.1.2            htmltools_0.5.8.1      
## [82] lifecycle_1.0.4         fontLiberation_0.1.0    openssl_2.3.4          
## [85] MASS_7.3-65

9 Referencias

Cohen, J. (1988). Statistical power analysis for the behavioral sciences (2nd ed.). Lawrence Erlbaum Associates.

Hoenig, J. M., & Heisey, D. M. (2001). The abuse of power: The pervasive fallacy of power calculations for data analysis. The American Statistician, 55(1), 19-24.


Fin del Reporte