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:
Se espera observar una mejora significativa en el conocimiento sobre TCC a lo largo del tiempo, manifestada en:
Este reporte incluye:
# 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
# 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)# 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()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 |
# 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
## Participantes únicos: 31
## Mediciones por participante: 31
# 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
# 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")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.
# 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).")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). | |||
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.
# 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.
# 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")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 | ||||
# 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)")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) | ||||
# 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).")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()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 |
# 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")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 | ||||
A continuación se presentan las comparaciones pareadas entre momentos de evaluación para cada dimensión del instrumento.
# 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.")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()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 |
# 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.")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()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 |
# 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.")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()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 |
# 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.")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()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 |
# 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.
# 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
)$rootAnálisis de Poder A Priori:
Con N = 31 participantes, k = 3 mediciones, y α = 0.05, el estudio tiene 80% de poder para detectar:
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))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 | ||||
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).
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.
Magnitud del Cambio: Los estudiantes mejoraron en promedio 26.68 puntos (IC 95%: [18.25, 35.11]) del inicio al final del programa.
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.
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.
## 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
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