---
title: "Caso integrador resuelto: estrés académico y programas de intervención"
subtitle: "Comprender, aplicar, interpretar y decidir con ANOVA de un factor en R"
lang: es
author: "Mg. José Luis Rodas Cobos"
format:
html:
toc: true
toc-location: right
toc-depth: 3
number-sections: true
code-fold: false
code-tools: true
embed-resources: true
smooth-scroll: true
theme: cosmo
execute:
echo: true
warning: false
message: false
---
```{=html}
<!-- CRITERIOS EDITORIALES PARA CASOS INTEGRADORES (NO SE MUESTRAN EN HTML):
- Mantener documento HTML Quarto (.qmd); no convertir a Reveal.js si no se solicita.
- Nunca modificar las rutas del usuario sin autorización expresa.
- Explicar: pregunta y sentido -> fundamento -> fórmula -> cálculo -> resultado -> interpretación estadística y aplicada -> decisión -> limitaciones.
- Las interpretaciones y las preguntas de investigación son más importantes que los comandos.
- Conservar R para el análisis real, la validación de datos y los gráficos. Evitar cat(), if/else que solo imprimen decisiones, y código accesorio para presentar tablas.
- Preferir tablas Markdown con resultados comprobados; si faltan datos, usar referencias dinámicas explícitas y no inventar resultados.
- Conservar el mismo caso y codificación; explicar los supuestos y las consecuencias de su incumplimiento.
- Mostrar umbrales numéricos (no solo fórmulas) en diagnósticos, indicar que son orientativos y no reglas de exclusión.
- Gráficos de aspecto académico con paleta consistente ggplot2; gráficos Q-Q con car::qqPlot cuando se solicite.
- Para eta/omega y toda medida: describir qué mide, fórmula, sustitución, valor, comparación contextual, significado sencillo, utilidad, limitaciones y figura interpretada.
- Diferenciar significación, tamaño del efecto, relevancia práctica y causalidad. No tratar convencionalismos como leyes.
- Distinguir Tukey (todos los pares), Fisher LSD (sin ajuste general), Dunnett (contra Control); elegir por objetivo.
- Comprobar que se pueda renderizar; informar cuando falte R o la base Excel y no fingir verificaciones.
-->
```
# Situación de investigación
Un equipo de Psicología estudia el **puntaje de estrés académico** de estudiantes universitarios que pertenecen a tres grupos: **Respiración guiada**, **Mindfulness breve** y **Control**. El estrés se observa *después* del periodo de intervención. El objetivo es evaluar si los puntajes medios difieren entre los tres grupos y, especialmente, si cada intervención presenta resultados distintos a los del grupo Control.
En una investigación aplicada, una diferencia entre medias solo es útil si podemos explicar **cuánto difieren los grupos, con qué incertidumbre y qué significado tiene esa diferencia**. Por ello, este caso no termina al obtener un valor *p*: integra descripción, revisión de supuestos, ANOVA, tamaño del efecto y comparaciones múltiples.
**Preguntas de investigación**
1. ¿Existen diferencias entre los puntajes medios de estrés académico de los tres grupos?
2. ¿Qué proporción de la variabilidad observada del estrés se asocia con el grupo?
3. ¿Qué diferencias existen entre cada intervención y el Control?
4. ¿Qué decisiones pueden fundamentarse con los resultados y cuáles exceden la evidencia disponible?
**Variables y diseño.** La variable respuesta es `estres` (puntaje cuantitativo) y el factor es `programa` (tres niveles). Cada fila representa un estudiante, identificado mediante `id`. La base de datos es la suministrada para este ejercicio; el archivo QMD no permite verificar por sí solo si su origen es real o simulado. Tampoco documenta cómo fueron asignados los estudiantes ni qué instrumento y rango de puntuación se utilizaron. Estas condiciones deben precisarse antes de interpretar los resultados como efectos causales o cambios clínicamente relevantes.
En las interpretaciones suponemos que **un puntaje más alto representa mayor estrés académico**. Si la codificación de la escala utilizada fuera diferente, tendría que revisarse el sentido de las comparaciones.
> **Idea clave.** Un ANOVA significativo no prueba que todos los grupos difieran, no identifica por sí solo el mejor programa y no demuestra una reducción individual del estrés si no existen mediciones comparables antes y después.
## Planificación del tamaño de muestra mediante `pwr`
### ¿Por qué necesitamos calcular el tamaño de muestra?
Antes de realizar una investigación, debemos determinar cuántos participantes necesitamos para responder adecuadamente a nuestra pregunta de investigación.
Una muestra demasiado pequeña puede dificultar la detección de diferencias que realmente existen entre los grupos.
Por otra parte, una muestra innecesariamente grande puede implicar mayores costos, tiempo y recursos.
**Idea clave:** El tamaño de muestra debe planificarse antes de recolectar los datos, considerando la magnitud del efecto que deseamos detectar, el nivel de significación y la potencia estadística.
### Situación problemática
Un investigador desea evaluar si existen diferencias en el nivel de estrés académico entre estudiantes de Psicología sometidos a tres condiciones:
- Respiración guiada.
- Mindfulness breve.
- Control.
La pregunta es:
**¿Cuántos estudiantes debemos incluir en cada grupo para detectar un efecto moderado mediante un ANOVA de un factor?**
Para responder, utilizaremos la función `pwr.anova.test()` del paquete `pwr`.
### ¿Cómo determinamos el tamaño del efecto esperado?
Antes de calcular el tamaño de muestra, necesitamos establecer qué magnitud de diferencia entre los programas psicológicos consideramos relevante detectar.
En un ANOVA de un factor, una medida utilizada para planificar el tamaño de muestra es el **tamaño del efecto f de Cohen**.
Este indicador expresa la magnitud de las diferencias entre las medias poblacionales en relación con la variabilidad dentro de los grupos.
Cuanto mayor sea el valor de (f), mayor será la separación entre las medias respecto de la variabilidad residual.
#### Clasificación del tamaño del efecto según Cohen
| Tamaño del efecto | Valor de $f$ | Interpretación |
|:---|:---:|:---|
| Inferior a pequeño | $f < 0.10$ | Diferencias muy reducidas respecto de la variabilidad dentro de los grupos. |
| Pequeño | $0.10 \leq f < 0.25$ | Diferencias de magnitud pequeña. |
| Moderado | $0.25 \leq f < 0.40$ | Diferencias de magnitud intermedia. |
| Grande | $f \geq 0.40$ | Diferencias de magnitud elevada. |
**Fuente:** Adaptado de las referencias convencionales de Cohen (1988) para el tamaño del efecto (f) en ANOVA.
**Importante:** Los valores 0.10, 0.25 y 0.40 son referencias orientativas, no límites universales. La importancia práctica de un efecto depende del contexto de investigación.
#### Ejemplo aplicado a Psicología
Supongamos que queremos comparar el estrés académico entre tres programas:
- Control.
- Respiración guiada.
- Mindfulness breve.
Antes de recolectar los datos, debemos establecer qué magnitud de diferencia esperamos detectar.
Para este ejemplo seleccionamos:
$[f=0.25]$
Este valor corresponde a un **efecto moderado** según las referencias convencionales de Cohen.
**¿Qué significa?**
Significa que planificaremos un estudio capaz de detectar diferencias globales de magnitud moderada entre los programas, considerando su variabilidad interna.
No significa que esperamos una reducción del estrés del 25 %, ni que el 25 % de los estudiantes mejorará.
El valor (f=0.25) es una medida estandarizada de magnitud del efecto, no un porcentaje de participantes beneficiados.
#### Relación entre el tamaño del efecto f y eta cuadrado
El tamaño del efecto (f) puede expresarse a partir de $(\eta^2)$ mediante la siguiente relación:
$$[
f=\sqrt{\frac{\eta^2}{1-\eta^2}}
]$$
Por ejemplo, un efecto de (f=0.25) equivale a:
$$[
\eta^2=\frac{f^2}{1+f^2}
=\frac{0.25^2}{1+0.25^2}
\approx 0.0588
]$$
Esto representa aproximadamente el 5.88 % de la variabilidad de la variable respuesta atribuible a las diferencias entre grupos dentro de esta descomposición de la variabilidad.
**Advertencia:** En la planificación utilizamos un efecto esperado, que debe justificarse antes de observar los resultados. No debemos escogerlo a partir del efecto obtenido en la misma muestra para justificar retrospectivamente su tamaño.
### Cálculo del tamaño de muestra mediante pwr
```{r}
# Planificamos el tamaño muestral para un ANOVA de un factor.
plan_muestral <- pwr::pwr.anova.test(
k = 3, # Tres programas psicológicos
n = NULL, # Tamaño por grupo que deseamos calcular
f = 0.25, # Efecto moderado esperado
sig.level = 0.05, # Nivel de significación del 5 %
power = 0.80 # Potencia estadística del 80 %
)
# Mostramos el resultado.
plan_muestral
# Redondeamos hacia arriba y calculamos la muestra total.
n_grupo <- ceiling(plan_muestral$n)
n_total <- n_grupo * 3
n_grupo
n_total
```
### Interpretación del resultado
Para detectar un efecto global moderado de (f=0.25) con una potencia aproximada del 80 % y un nivel de significación del 5 %, necesitamos planificar **`r n_grupo` estudiantes por grupo**, es decir, **`r n_total` estudiantes en total**.
Este cálculo supone grupos independientes y equilibrados, bajo las condiciones del ANOVA clásico.
#### Pregunta para pensar
**¿Qué ocurriría si, en lugar de esperar un efecto moderado, esperamos un efecto pequeño de (f=0.10)?**
Necesitaríamos una muestra considerablemente mayor, porque detectar diferencias pequeñas es más difícil que detectar diferencias grandes cuando los demás parámetros permanecen constantes.
**Idea clave:** Cuanto menor sea el efecto que deseamos detectar, mayor será generalmente el tamaño de muestra necesario para mantener la misma potencia estadística. criterios de relevancia científica.
### Cálculo del tamaño de muestra en R
```{r}
# Calculamos el tamaño de muestra necesario por grupo.
plan_muestral <- pwr::pwr.anova.test(
k = 3, # Tres grupos de comparación
n = NULL, # Tamaño de muestra desconocido
f = 0.25, # Efecto esperado moderado
sig.level = 0.05, # Nivel de significación
power = 0.80 # Potencia estadística
)
# Mostramos el resultado.
plan_muestral
# Redondeamos hacia arriba porque trabajamos con personas.
n_grupo <- ceiling(plan_muestral$n)
# Calculamos el total para los tres grupos.
n_total <- n_grupo * 3
n_grupo
n_total
```
### Interpretación del resultado
El cálculo indica que necesitamos aproximadamente **`r n_grupo` estudiantes por grupo**, es decir, **`r n_total` estudiantes en total**.
Con este tamaño de muestra, un ANOVA de un factor tendría una potencia aproximada del 80 % para detectar un efecto global de magnitud f = 0.25, bajo las condiciones consideradas en la planificación.
**Advertencia:** Una potencia del 80 % no significa que exista un 80 % de probabilidad de que nuestra hipótesis sea verdadera. Significa que, si el efecto especificado realmente existe, el estudio tiene aproximadamente esa probabilidad de detectarlo mediante la prueba utilizada.
### ¿Qué sucede si esperamos perder participantes?
En estudios psicológicos pueden presentarse retiros, inasistencias o registros incompletos.
Si esperamos perder aproximadamente el 10 % de los participantes, necesitamos incrementar el número inicial de estudiantes.
```{r}
# Proporción esperada de pérdidas.
perdidas <- 0.10
# Calculamos cuántos estudiantes debemos reclutar por grupo.
n_ajustado <- ceiling(n_grupo / (1 - perdidas))
# Calculamos el total de estudiantes que debemos reclutar.
total_ajustado <- n_ajustado * 3
n_ajustado
total_ajustado
```
### Interpretación del tamaño ajustado
Considerando una pérdida esperada del 10 %, debemos reclutar **`r n_ajustado` estudiantes por grupo**, es decir, **`r total_ajustado` estudiantes en total**.
El objetivo es conservar aproximadamente el tamaño muestral requerido después de las posibles pérdidas.
Este ajuste supone que las pérdidas no introducen sesgos importantes. Si los abandonos están relacionados con el nivel de estrés o con el programa recibido, aumentar el tamaño de muestra no elimina automáticamente ese sesgo.
### ¿Calcular la muestra significa realizar un muestreo?
No. Son decisiones diferentes.
**Tamaño de muestra:** establece cuántos estudiantes necesitamos.
**Método de muestreo:** establece cómo seleccionaremos a los estudiantes de la población.
**Asignación a los grupos:** establece cómo distribuiremos a los estudiantes entre las tres condiciones del estudio.
Por ejemplo, podríamos seleccionar estudiantes mediante un muestreo probabilístico a partir de un padrón universitario y posteriormente asignarlos aleatoriamente a los tres grupos.
La selección probabilística contribuye a la representatividad respecto de la población definida, mientras que la asignación aleatoria busca mejorar la comparabilidad entre los grupos.
Son procedimientos que cumplen funciones distintas.
### Consideraciones para aplicar este cálculo
La función `pwr.anova.test()` considera la planificación de un ANOVA clásico con grupos independientes y tamaños iguales.
La interpretación de la potencia depende también de que sean razonables los supuestos del modelo, especialmente la independencia de las observaciones y la estructura de variabilidad utilizada en el ANOVA.
Si el diseño incluye medidas repetidas, agrupamiento de estudiantes en aulas o varianzas muy diferentes, puede ser necesario utilizar otro procedimiento de planificación.
**Importante:** El cálculo anterior corresponde a un estudio hipotético que todavía se está planificando.
Nuestro caso integrador utiliza 30 observaciones ya registradas. No debemos confundir ese tamaño observado con el tamaño recomendado por este ejercicio de planificación.
### Pregunta para reflexionar
Si un investigador cuenta solamente con 30 estudiantes, pero la planificación recomienda aproximadamente 159:
**¿Significa que su investigación no tiene valor?**
No necesariamente. Sin embargo, debe reconocer las limitaciones de precisión y potencia que podría tener su estudio para detectar el efecto considerado.
Además, una muestra pequeña no implica automáticamente que todos los resultados sean incorrectos; su interpretación debe considerar el diseño, la magnitud de los efectos, los intervalos de confianza y las limitaciones del estudio.
**Conclusión:** El tamaño de muestra no debe elegirse únicamente por comodidad o disponibilidad de participantes. Debe justificarse de acuerdo con la pregunta de investigación, el diseño estadístico y la magnitud del efecto que resulta relevante detectar.
# Preparación y comprensión de los datos
## Librerías necesarias
Utilizaremos R para importar la base, realizar los cálculos estadísticos y elaborar gráficos. No emplearemos código para imprimir decisiones que podemos explicar directamente en el texto.
```{r}
library(readxl)
library(dplyr)
library(ggplot2)
library(car)
library(multcomp)
# Identidad visual coherente en todo el documento.
colores_programas <- c(
"Respiración guiada" = "#0E9CA8", # Turquesa
"Mindfulness breve" = "#7561BD", # Violeta
"Control" = "#EC8658" # Coral
)
# Tema de gráficos: contraste legible, fondo blanco y tipografía sobria.
tema_estres <- theme_minimal(base_size = 13) +
theme(
plot.title = element_text(face = "bold", colour = "#18314B", size = 16),
plot.subtitle = element_text(colour = "#536577", size = 10.5),
plot.caption = element_text(colour = "#637587", size = 9),
axis.title = element_text(face = "bold", colour = "#29455E"),
axis.text = element_text(colour = "#34495E"),
panel.grid.minor = element_blank(),
panel.grid.major.x = element_blank(),
panel.grid.major.y = element_line(colour = "#E8EDF3", linewidth = 0.35),
legend.position = "bottom",
legend.title = element_blank(),
plot.title.position = "plot",
plot.margin = margin(12, 16, 10, 12)
)
```
## Importación del archivo Excel
**Se conserva exactamente la ruta de importación del QMD original.** Para reproducir el documento, el archivo debe existir en esa ubicación de la computadora donde se ejecute R.
```{r}
datos_estres <- read_excel(
"D:/Github/Libros/Psico II/PPT 1/CASO_INTEGRADOR_ESTRES_PROGRAMAS_BASE.xlsx"
)
# Convertimos programa en una variable categórica nominal.
# Esto permite que R reconozca los tres grupos del estudio.
datos_estres <- datos_estres |>
dplyr::mutate(
programa = factor(
programa,
levels = c(
"Respiración guiada",
"Mindfulness breve",
"Control"
),
ordered = FALSE
)
)
# Verificamos que ahora sea un factor.
class(datos_estres$programa)
# Comprobamos los niveles definidos.
levels(datos_estres$programa)
```
## Verificación de la estructura
Antes de analizar, debemos confirmar que los nombres, categorías y tipos de datos sean correctos. Un modelo estadístico correctamente ejecutado sobre datos mal codificados puede producir conclusiones equivocadas.
```{r}
dplyr::glimpse(datos_estres)
dplyr::count(datos_estres, programa)
colSums(is.na(datos_estres))
```
Definimos explícitamente el orden de los tres grupos. Este orden se conservará en las tablas, los gráficos y las comparaciones de Tukey.
```{r}
stopifnot(
# Verifica que existan las columnas necesarias:
# id, programa y estres.
all(c("id", "programa", "estres") %in% names(datos_estres)),
# Comprueba que el estrés sea una variable numérica,
# porque utilizaremos sus valores para calcular medias
# y realizar el ANOVA.
is.numeric(datos_estres$estres),
# Comprueba que ningún estudiante tenga
# un programa sin identificar.
!anyNA(datos_estres$programa),
# Comprueba que no existan valores faltantes
# en los puntajes de estrés.
!anyNA(datos_estres$estres),
# Verifica que no existan identificadores repetidos.
# Cada estudiante debe tener un ID único.
!anyDuplicated(datos_estres$id),
# Comprueba que cada programa tenga
# por lo menos dos observaciones.
all(table(datos_estres$programa) >= 2)
)
```
**Interpretación de esta revisión.** `programa` debe contener exactamente los tres grupos previstos; `estres` debe ser numérica y no presentar valores faltantes sin un tratamiento justificado; `id` debe identificar observaciones distintas. Si se interrumpe la ejecución, corresponde revisar los datos originales, no eliminar registros automáticamente para que el código funcione.
# Descripción inicial: ¿qué muestran los estudiantes observados?
## Estadísticos descriptivos
La **media** resume el nivel promedio de estrés; la **desviación estándar** mide cuánto varían los puntajes entre estudiantes del mismo grupo. La **mediana** y el **rango** ayudan a reconocer asimetrías o valores alejados del resto.
```{r}
descriptivos <- datos_estres |>
dplyr::group_by(programa) |>
dplyr::summarise(
n = dplyr::n(),
media = mean(estres),
mediana = median(estres),
de = sd(estres),
minimo = min(estres),
maximo = max(estres),
.groups = "drop"
)
descriptivos
# 2. Presentar los resultados en una tabla HTML
knitr::kable(
descriptivos,
digits = 2, # Mostrar dos decimales
col.names = c(
"Programa", "n", "Media", "Mediana",
"DE", "Mínimo", "Máximo"
),
caption = "Estadísticos descriptivos del estrés según programa"
)
```
**Tabla 1. Resumen del estrés académico según grupo.** La tabla está escrita directamente en Markdown. Sus celdas numéricas se actualizan al ejecutar el documento con el Excel original.
| Grupo | n | Media | Mediana | Desv. estándar | Mínimo | Máximo |
|:----------|----------:|----------:|----------:|----------:|----------:|----------:|
| Respiración guiada | `r descriptivos$n[1]` | `r round(descriptivos$media[1], 2)` | `r round(descriptivos$mediana[1], 2)` | `r round(descriptivos$de[1], 2)` | `r round(descriptivos$minimo[1], 2)` | `r round(descriptivos$maximo[1], 2)` |
| Mindfulness breve | `r descriptivos$n[2]` | `r round(descriptivos$media[2], 2)` | `r round(descriptivos$mediana[2], 2)` | `r round(descriptivos$de[2], 2)` | `r round(descriptivos$minimo[2], 2)` | `r round(descriptivos$maximo[2], 2)` |
| Control | `r descriptivos$n[3]` | `r round(descriptivos$media[3], 2)` | `r round(descriptivos$mediana[3], 2)` | `r round(descriptivos$de[3], 2)` | `r round(descriptivos$minimo[3], 2)` | `r round(descriptivos$maximo[3], 2)` |
**Interpretación descriptiva.** En esta muestra, el grupo con la menor media observada es **`r as.character(descriptivos$programa[which.min(descriptivos$media)])`** (`r round(min(descriptivos$media), 2)` puntos), mientras que la mayor media corresponde a **`r as.character(descriptivos$programa[which.max(descriptivos$media)])`** (`r round(max(descriptivos$media), 2)` puntos). La diferencia entre las medias extremas es **`r round(max(descriptivos$media) - min(descriptivos$media), 2)` puntos**. Esta es una comparación *descriptiva*, no una conclusión inferencial: todavía debemos estudiar cuánto de la diferencia podría corresponder a variabilidad muestral.
Compare también las desviaciones estándar: cuando la dispersión difiere mucho entre grupos, conviene prestar especial atención al supuesto de varianza común del ANOVA clásico.
## Visualización de las distribuciones
Un diagrama de cajas acompañado por los puntajes individuales permite valorar de forma conjunta **posición, dispersión y observaciones alejadas**. El rombo señala la media; la línea de la caja representa la mediana.
```{r}
#| fig-width: 9
#| fig-height: 5.3
ggplot(datos_estres, aes(x = programa, y = estres, colour = programa, fill = programa)) +
geom_boxplot(width = 0.52, outlier.shape = NA, alpha = 0.22,
linewidth = 0.8) +
geom_jitter(width = 0.085, height = 0, alpha = 0.72, size = 2.7) +
stat_summary(fun = mean, geom = "point", shape = 23, size = 3.7,
colour = "#18314B", fill = "#F3CE64", stroke = 1.1) +
scale_colour_manual(values = colores_programas) +
scale_fill_manual(values = colores_programas) +
labs(
title = "Estrés académico según el programa",
subtitle = "Cada punto representa un estudiante; el rombo dorado señala la media",
x = "Programa", y = "Puntaje de estrés académico"
) +
guides(colour = "none", fill = "none") +
tema_estres
```
**Interpretación.** Observe si las cajas se superponen, cómo varía la dispersión y si existen puntajes extremos. La superposición visual no decide por sí misma la significación estadística. Un gráfico es una herramienta para comprender los datos y orientar los diagnósticos, no un sustituto del análisis inferencial.
> **Pregunta para pensar.** Si dos medias se encuentran separadas, pero la variabilidad individual es muy grande, ¿tendríamos la misma confianza en esa diferencia que si los puntajes estuvieran poco dispersos?
# Fundamento del ANOVA de un factor
## ¿Por qué ANOVA y no varias pruebas *t*?
Nuestra variable respuesta es cuantitativa y el factor tiene **tres grupos independientes**. Realizar varias pruebas *t* sin un ajuste adecuado aumentaría el riesgo de obtener al menos un falso positivo. El ANOVA de un factor examina primero una pregunta global: si las **tres medias poblacionales** pueden considerarse iguales.
El razonamiento es comparar dos fuentes de variación:
- **Entre grupos:** cuánto se separan las medias grupales respecto de la media general.
- **Dentro de los grupos:** cuánto varían los estudiantes que pertenecen a un mismo grupo, aun cuando recibieron la misma condición.
Si la variación entre grupos es grande en relación con la variación residual dentro de ellos, aumenta el valor del estadístico F.
## Modelo estadístico e hipótesis
Para el estudiante $j$ que pertenece al grupo $i$:
$$
Y_{ij}=\mu+\tau_i+\varepsilon_{ij}
$$
En este modelo, $Y_{ij}$ es el puntaje de estrés; $\mu$ es la media general según la parametrización elegida; $\tau_i$ representa el efecto del grupo $i$; y $\varepsilon_{ij}$ representa la variabilidad no explicada por el factor. Se utiliza una restricción identificadora, por ejemplo $\sum_i\tau_i=0$, para parametrizar el modelo.
Las hipótesis son:
$$
H_0:\mu_1=\mu_2=\mu_3,
\qquad
H_1:\text{al menos una media difiere}.
$$
**Advertencia:** la hipótesis alternativa no afirma que *todas* las medias son diferentes ni identifica qué intervención es mejor.
## Fórmula del estadístico F
$$
\boxed{F=\frac{MC_{\text{entre}}}{MC_{\text{dentro}}}
=\frac{SC_{\text{entre}}/(k-1)}{SC_{\text{dentro}}/(N-k)}}
$$
Aquí $SC$ significa suma de cuadrados, $MC$ cuadrado medio, $k$ es el número de grupos y $N$ es el número total de estudiantes. El denominador mide la variabilidad residual estimada. Por ello, F no se interpreta como una diferencia en puntos de estrés: **es una razón entre estimaciones de variabilidad**.
## Ajuste en R
Ajustamos **un solo modelo** con `aov()`. Servirá tanto para el ANOVA como para los residuos, los tamaños del efecto y las comparaciones posteriores; no necesitamos repetir el mismo ajuste con `lm()`.
```{r}
# 1. Ajustamos el modelo ANOVA de un factor.
# Comparamos las medias de estrés entre los programas.
modelo_estres <- aov(
estres ~ programa,
data = datos_estres
)
# 2. Obtenemos la tabla del análisis de varianza.
resultado_anova <- anova(modelo_estres)
# 3. Presentamos los resultados en una tabla HTML.
# digits = 4 muestra cuatro decimales.
knitr::kable(
resultado_anova,
digits = 4,
col.names = c(
"GL",
"Suma de cuadrados",
"Cuadrado medio",
"F calculado",
"Valor p"
),
caption = "Análisis de varianza del estrés académico según programa"
)
```
# ¿Podemos confiar en el modelo? Evaluación de supuestos
Los supuestos no son una lista de casillas que se aprueba con valores *p*. Su evaluación debe combinar **el diseño del estudio**, **la exploración gráfica** y **la sensibilidad de las conclusiones**.
## Independencia de las observaciones
El ANOVA clásico supone errores independientes. Este supuesto depende fundamentalmente de **cómo se seleccionaron y asignaron los estudiantes**. Que una columna se llame `id` o que una prueba tenga un valor *p* elevado no demuestra independencia.
Si cada estudiante participa en un único grupo y proporciona una medición independiente, la estructura es compatible con un ANOVA de grupos independientes. Si se evaluó al mismo estudiante varias veces, o hay dependencia por aulas o equipos, puede ser necesario un modelo de medidas repetidas o multinivel.
## Normalidad de los errores: histograma, densidad, gráfico Q-Q y Shapiro-Wilk
**¿Por qué estudiamos la normalidad?** El ANOVA clásico supone que los errores, dentro de cada grupo, siguen aproximadamente una distribución normal. Este supuesto **no se evalúa mezclando directamente todos los puntajes de estrés**: los grupos pueden tener medias diferentes aunque sus errores sean normales. Por ello, analizamos los **residuos** del modelo, es decir, la diferencia entre el puntaje observado de cada estudiante y la media estimada de su grupo.
Ningún gráfico o prueba aislada demuestra normalidad. Examinaremos tres representaciones complementarias y, después, la prueba de Shapiro-Wilk. Los gráficos se elaboran con **`ggplot2`**, excepto el Q-Q, para el que utilizamos explícitamente **`car::qqPlot()`**.
```{r}
# Estos residuos se utilizarán en todos los gráficos y en Shapiro-Wilk.
residuos_anova <- residuals(modelo_estres)
datos_residuos <- datos_estres |>
dplyr::mutate(residuo = residuos_anova)
```
### Histograma de los residuos
**¿Qué buscamos?** Una distribución aproximadamente simétrica, concentrada alrededor de cero y sin acumulaciones muy alejadas de su centro. La forma del histograma también depende del número de intervalos elegido; por eso no es suficiente para afirmar o rechazar normalidad.
```{r}
#| fig-width: 8.5
#| fig-height: 5.1
ggplot(datos_residuos, aes(x = residuo)) +
geom_histogram(
aes(y = after_stat(density)), bins = 8,
fill = "#69C5CC", colour = "white", linewidth = 0.8, alpha = 0.94
) +
stat_function(
fun = dnorm,
args = list(mean = 0, sd = sqrt(resultado_anova[["Mean Sq"]][2])),
colour = "#E36C4E",linewidth = 1.45
) +
geom_density(
fill = "#7CD2D0", colour = "black", alpha = 0.36,
linewidth = 1.35, adjust = 1
) +
geom_vline(xintercept = 0, linetype = "dashed",
colour = "#42586C", linewidth = 0.7) +
labs(
title = "Histograma de residuos del ANOVA",
subtitle = "Turquesa: residuos observados · Coral: normal teórica de referencia",
x = "Residuo (puntos de estrés)", y = "Densidad"
) +
tema_estres
```
**Interpretación:** si las barras se distribuyen a ambos lados del cero y siguen aproximadamente la forma de campana de la curva de referencia, ello es compatible con la normalidad. Una asimetría marcada o barras aisladas sugieren revisar la distribución y los casos correspondientes. **La curva de referencia no es una prueba de normalidad** ni se espera que cada barra coincida con ella.
### Gráfico de densidad de los residuos
**¿Qué aporta respecto al histograma?** La curva de densidad suaviza la distribución empírica y permite observar asimetrías, colas largas o más de una concentración de valores. Su apariencia depende del grado de suavizado, sobre todo cuando la muestra es pequeña.
```{r}
#| fig-width: 8.5
#| fig-height: 5.1
ggplot(datos_residuos, aes(x = residuo)) +
geom_density(
fill = "#7CD2D0", colour = "#0B8998", alpha = 0.36,
linewidth = 1.35, adjust = 1
) +
stat_function(
fun = dnorm,
args = list(mean = 0, sd = sqrt(resultado_anova[["Mean Sq"]][2])),
colour = "#E36C4E", linewidth = 1.35, linetype = "longdash"
) +
geom_vline(xintercept = 0, linetype = "dotted",
colour = "#42586C", linewidth = 0.7) +
labs(
title = "Densidad de los residuos del ANOVA",
subtitle = "Turquesa: densidad empírica · Coral: distribución normal de referencia",
x = "Residuo (puntos de estrés)", y = "Densidad"
) +
tema_estres
```
**Interpretación:** una curva empírica aproximadamente simétrica y similar a la referencia normal respalda visualmente la plausibilidad del supuesto. Si aparecen colas claramente más largas, asimetrías o varios picos, debemos examinar si se trata de valores extremos, diferencias de dispersión entre grupos o de un patrón que el modelo no representa adecuadamente. El suavizado puede crear u ocultar irregularidades; se interpreta junto con los demás gráficos.
### Gráfico Q-Q de los residuos mediante `car::qqPlot()`
**¿Qué examinamos?** Comparamos los cuantiles observados de los residuos con los que esperaríamos de una distribución normal. Una tendencia aproximadamente rectilínea favorece la compatibilidad con el supuesto; separaciones sistemáticas, especialmente en las colas, merecen atención.
```{r}
#| fig-width: 8.5
#| fig-height: 5.4
car::qqPlot(
residuos_anova,
distribution = "norm", # Distribución normal de referencia
envelope = 0.95, # Envolvente de referencia del 95 %
id = FALSE, # No identificar automáticamente puntos extremos
col = "#7360B9", # Color violeta de los puntos
col.lines = "#E36C4E", # Color coral de la línea de referencia
pch = 19, # Puntos circulares sólidos
main = "Normalidad de los residuos del ANOVA",
xlab = "Cuantiles normales teóricos",
ylab = "Cuantiles observados de los residuos"
)
```
**Interpretación:** si los puntos se sitúan aproximadamente sobre la recta de referencia, la forma de la distribución residual es razonablemente compatible con la normal. La banda representa una envolvente orientativa de referencia, **no una certificación del supuesto**; algunos puntos pueden alejarse por fluctuaciones muestrales. Una curvatura pronunciada o desviaciones persistentes en los extremos deben analizarse junto con el histograma y la densidad.
### Prueba de Shapiro-Wilk
Tras la exploración gráfica, Shapiro-Wilk aporta una prueba formal de la hipótesis de normalidad:
$$
H_0:\; \text{los errores siguen una distribución normal},
\qquad
H_1:\; \text{los errores no siguen una distribución normal}.
$$
```{r}
resultado_shapiro <- shapiro.test(residuos_anova)
resultado_shapiro
```
**Resultado:** $W =$ `r round(unname(resultado_shapiro$statistic), 4)`; valor $p =$ `r format.pval(resultado_shapiro$p.value, digits = 3, eps = 0.001)`.
**Interpretación estadística:** `r ifelse(resultado_shapiro$p.value < 0.05, "La prueba identifica evidencia contra la normalidad de los residuos al nivel del 5 %. Esto exige revisar la intensidad y la forma de las desviaciones gráficas, no abandonar automáticamente el ANOVA.", "La prueba no encuentra evidencia suficiente para rechazar la normalidad al nivel del 5 %. Esto no demuestra que la distribución sea exactamente normal y debe interpretarse junto con los gráficos.")`
**Interpretación integrada y decisión:** el histograma muestra la concentración de residuos; la densidad permite apreciar su forma suavizada; el Q-Q destaca especialmente las discrepancias en las colas; y Shapiro-Wilk complementa la evaluación con un contraste formal. Para decidir si el ANOVA clásico es adecuado, **también necesitamos examinar la independencia, la homogeneidad de varianzas, los tamaños muestrales y la posible influencia de casos extremos**. Una prueba aislada no reemplaza ese razonamiento.
## Homogeneidad de varianzas: gráfico y Levene
El ANOVA clásico utiliza una **varianza residual común** para comparar los grupos. Para evaluar su plausibilidad conviene observar la amplitud de los residuos por grupo y considerar la prueba de Levene centrada en la mediana, que es menos sensible a la falta de normalidad que su versión basada en la media.
```{r}
#| fig-width: 8.5
#| fig-height: 5
ggplot(datos_residuos, aes(x = programa, y = residuo,
colour = programa, fill = programa)) +
geom_hline(yintercept = 0, linetype = "dashed",
colour = "#627588", linewidth = 0.8) +
geom_boxplot(outlier.shape = NA, width = 0.52,
alpha = 0.22, linewidth = 0.8) +
geom_jitter(width = 0.085, alpha = 0.72, size = 2.5) +
scale_colour_manual(values = colores_programas) +
scale_fill_manual(values = colores_programas) +
guides(colour = "none", fill = "none") +
labs(
title = "Variabilidad de residuos según el grupo",
subtitle = "Las tres dispersiones deberían ser razonablemente comparables",
x = "Programa", y = "Residuo (puntos de estrés)"
) +
tema_estres
```
```{r}
resultado_levene <- car::leveneTest(
estres ~ programa,
data = datos_estres,
center = median
)
knitr::kable(
resultado_levene,
digits = 4,
caption = "Prueba de Levene para la homogeneidad de varianzas"
)
```
**Resultado:** $F_{\text{Levene}} =$ `r round(resultado_levene[["F value"]][1], 3)`; valor $p =$ `r format.pval(resultado_levene[["Pr(>F)"]][1], digits = 3, eps = 0.001)`.
**Interpretación:** `r ifelse(resultado_levene[["Pr(>F)"]][1] < 0.05, "Existe evidencia estadística de desigualdad de varianzas. La inferencia del ANOVA clásico y sus comparaciones debe examinarse con cautela; es pertinente considerar ANOVA de Welch y contrastes compatibles con varianzas desiguales.", "No existe evidencia estadística suficiente de que las varianzas sean distintas. Esto no certifica varianzas idénticas: también debemos valorar el gráfico y los tamaños muestrales por grupo.")`
**¿Qué hacer si las varianzas son muy diferentes?** Cuando existe heterogeneidad relevante —especialmente con tamaños de grupo desiguales— una alternativa para la pregunta global es el ANOVA de Welch (`oneway.test(estres ~ programa, data = datos_estres)`). Sus comparaciones posteriores también deben corresponder al enfoque de varianzas desiguales; no sería coherente usar automáticamente Tukey HSD o Dunnett clásico sobre ese resultado.
## Observaciones inusuales e influencia
**¿Por qué hacemos este diagnóstico?** Incluso cuando las medias de los grupos difieren, una observación muy alejada puede modificar la estimación de la variabilidad residual y, con ello, afectar el contraste F y las comparaciones. El propósito es **detectar casos que merecen revisión**, no borrar datos para mejorar el resultado.
Distinguimos tres conceptos, que no son equivalentes:
- **Residuo studentizado externo:** identifica puntuaciones inusuales *dentro de su grupo*. Como señal exploratoria se utiliza $|t_i|>3$; no es una prueba formal con control global de errores.
- **Distancia de Cook:** mide la influencia potencial de excluir el caso sobre el conjunto de valores ajustados. La referencia usual $D_i>4/N$ señala casos para revisar; $D_i>1$ es una alerta más exigente. **Ninguna de estas referencias determina automáticamente que el caso sea inválido.**
- **Leverage:** indica la posición de una observación en el diseño del modelo. En un ANOVA de un factor, $h_{ii}=1/n_i$, donde $n_i$ es el tamaño del grupo del estudiante. Como referencia exploratoria puede utilizarse $h_{ii}>2p/N$, donde $p$ es el número de parámetros estimados, incluido el intercepto. **En este diseño, todos los estudiantes del mismo grupo tienen idéntico leverage**: un valor grande suele reflejar un grupo pequeño, no un puntaje de estrés extremo.
### Valores numéricos para comparar
Antes de revisar los casos calculamos **los puntos de referencia concretos** a partir de la muestra. No basta escribir $4/N$ o $1/n_i$: es necesario mostrar cuánto valen.
```{r}
N <- nobs(modelo_estres)
p_modelo <- length(coef(modelo_estres))
umbral_studentizado <- 3
umbral_cook <- 4 / N
umbral_leverage <- 2 * p_modelo / N
revision_casos <- datos_estres |>
dplyr::mutate(
residuo_studentizado = as.numeric(rstudent(modelo_estres)),
leverage = as.numeric(hatvalues(modelo_estres)),
distancia_cook = as.numeric(cooks.distance(modelo_estres)),
alerta_residuo = abs(residuo_studentizado) > umbral_studentizado,
alerta_leverage = leverage > umbral_leverage,
alerta_cook = distancia_cook > umbral_cook,
orden = dplyr::row_number()
)
# ---------------------------------------------------------
# 3. PRESENTAR LOS RESULTADOS EN UNA TABLA
# ---------------------------------------------------------
revision_casos |>
dplyr::select(
id,
programa,
estres,
residuo_studentizado,
leverage,
distancia_cook,
alerta_residuo,
alerta_leverage,
alerta_cook
) |>
knitr::kable(
digits = 4,
col.names = c(
"ID",
"Programa",
"Estrés",
"Residuo studentizado",
"Leverage",
"Cook",
"Alerta residuo",
"Alerta leverage",
"Alerta Cook"
),
caption = "Diagnóstico de observaciones inusuales e influyentes"
)
```
En este ejercicio tenemos $N =$ `r N` estudiantes y $p =$ `r p_modelo` parámetros del modelo (incluido el intercepto). Por tanto:
- Residuo studentizado externo: $|t_i|>3$.
- Distancia de Cook: $D_i>4/`r N`=`r round(umbral_cook, 4)`$.
- Leverage: $h_{ii}>2(`r p_modelo`)/`r N`=`r round(umbral_leverage, 4)`$.
- Para cada grupo, su leverage esperado es $1/n_i$: **Respiración guiada = `r round(1 / descriptivos$n[1], 4)`; Mindfulness breve = `r round(1 / descriptivos$n[2], 4)`; Control = `r round(1 / descriptivos$n[3], 4)`**.
**Tabla de evaluación.** El máximo observado y el número de alertas se obtienen de la base, y se comparan con los límites mostrados a su lado.
| Diagnóstico | Umbral orientativo | Máximo observado | Casos que superan el umbral |
|:-----------------|-----------------:|-----------------:|-----------------:|
| Residuo studentizado externo (valor absoluto) | `r umbral_studentizado` | `r round(max(abs(revision_casos$residuo_studentizado)), 3)` | `r sum(revision_casos$alerta_residuo)` |
| Distancia de Cook | `r round(umbral_cook, 4)` | `r round(max(revision_casos$distancia_cook), 4)` | `r sum(revision_casos$alerta_cook)` |
| Leverage | `r round(umbral_leverage, 4)` | `r round(max(revision_casos$leverage), 4)` | `r sum(revision_casos$alerta_leverage)` |
**Lectura:** una observación que supera un umbral tiene una **señal para investigar**, no una clasificación definitiva de «influyente» o «no influyente». En particular, el leverage por sí solo no mide cuánto cambia el ajuste. La distancia de Cook incorpora tanto la discrepancia residual como el leverage.
### Gráfico de residuos studentizados externos
Las líneas discontinuas marcan **−3 y +3**: un punto fuera de esas líneas merece una inspección adicional.
```{r}
#| fig-width: 9
#| fig-height: 4.6
ggplot(revision_casos, aes(x = orden, y = residuo_studentizado,
colour = alerta_residuo)) +
geom_hline(yintercept = c(-umbral_studentizado, umbral_studentizado),
linetype = "dashed", colour = "#E36C4E", linewidth = 0.9) +
geom_hline(yintercept = 0, colour = "#AABAC7", linewidth = 0.6) +
geom_segment(aes(xend = orden, yend = 0), alpha = 0.45, linewidth = 0.9) +
geom_point(size = 2.8) +
scale_colour_manual(values = c("FALSE" = "#169CAD", "TRUE" = "#E36C4E"),
labels = c("FALSE" = "Sin señal", "TRUE" = "Revisar")) +
labs(
title = "Residuos studentizados externos",
subtitle = "Referencias exploratorias en −3 y +3",
x = "Número de observación", y = "Residuo studentizado",
colour = "Señal"
) +
tema_estres
```
### Gráfico de distancia de Cook
La línea discontinua representa $4/N =$ `r round(umbral_cook, 4)`. Los puntos corales, si aparecen, son candidatos a un análisis de sensibilidad.
```{r}
#| fig-width: 9
#| fig-height: 4.6
ggplot(revision_casos, aes(x = orden, y = distancia_cook,
fill = alerta_cook)) +
geom_col(width = 0.68, colour = "white", linewidth = 0.25) +
geom_hline(yintercept = umbral_cook, linetype = "dashed",
colour = "#E36C4E", linewidth = 1.1) +
scale_fill_manual(values = c("FALSE" = "#6FC6CB", "TRUE" = "#E36C4E"),
labels = c("FALSE" = "Sin señal", "TRUE" = "Revisar")) +
labs(
title = "Distancia de Cook por estudiante",
subtitle = paste0("Línea coral: límite orientativo 4/N = ",
round(umbral_cook, 4)),
x = "Número de observación", y = "Distancia de Cook",
fill = "Señal"
) +
tema_estres
```
### Casos que conviene verificar
Mostramos los **cinco mayores valores de Cook** junto con el residuo studentizado y el leverage; esto permite identificar *qué registros* revisar, además de observar los gráficos. Si no se supera ningún punto de referencia, los máximos siguen siendo informativos.
```{r}
revision_casos |>
dplyr::arrange(dplyr::desc(distancia_cook)) |>
dplyr::select(id, programa, estres, residuo_studentizado,
leverage, distancia_cook, alerta_cook) |>
utils::head(5)
```
**Interpretación contextual:** se obtienen **`r sum(revision_casos$alerta_cook)` casos** sobre la referencia de Cook, **`r sum(revision_casos$alerta_residuo)` casos** con $|t_i|>3$ y **`r sum(revision_casos$alerta_leverage)` casos** por encima de la referencia de leverage. Estos números orientan una auditoría de los registros; **no autorizan eliminarlos automáticamente**. Si algún caso supera los umbrales, conviene comparar los resultados completos con un análisis de sensibilidad justificado y documentar cualquier cambio.
# Resultado global del ANOVA: cálculo, decisión e interpretación
La tabla ANOVA resume cuánto aporta el factor `programa` a la variabilidad total y cuánto permanece como variabilidad residual.
**Tabla 2. Resultados del ANOVA de un factor.**
```{r}
knitr::kable(
resultado_anova,
digits = 4,
col.names = c(
"GL",
"Suma de cuadrados",
"Cuadrado medio",
"F calculado",
"Valor p"
),
caption = "Análisis de varianza del estrés académico según programa"
)
```
| Fuente | SC | gl | MC | F | Valor p |
|:-----------|-----------:|-----------:|-----------:|-----------:|:-----------|
| Entre grupos (`programa`) | `r round(resultado_anova[["Sum Sq"]][1], 3)` | `r resultado_anova$Df[1]` | `r round(resultado_anova[["Mean Sq"]][1], 3)` | `r round(resultado_anova[["F value"]][1], 3)` | `r format.pval(resultado_anova[["Pr(>F)"]][1], digits = 3, eps = 0.001)` |
| Dentro de grupos (residual) | `r round(resultado_anova[["Sum Sq"]][2], 3)` | `r resultado_anova$Df[2]` | `r round(resultado_anova[["Mean Sq"]][2], 3)` | — | — |
| Total | `r round(sum(resultado_anova[["Sum Sq"]]), 3)` | `r sum(resultado_anova$Df)` | — | — | — |
En el caso original se obtuvo:
$$
\boxed{F(2,27)=119.243,\qquad p<0.001}
$$
Se utiliza $\alpha=0.05$. Para estos grados de libertad, el valor crítico de la distribución F es aproximadamente $F_{0.95;2,27}=3.354$. Como $119.243>3.354$, el estadístico se ubica ampliamente en la región de rechazo. El valor *p* lleva a la misma decisión.
**Decisión estadística:** rechazamos $H_0$ de igualdad de las tres medias poblacionales.
**Interpretación en Psicología:** los grupos estudiados no presentan un mismo nivel medio de estrés académico. Al menos una media poblacional difiere de otra; sin embargo, este resultado **no identifica todavía los pares diferentes** y no cuantifica cuánto difieren en puntos de estrés.
**Alcance del resultado:** la relevancia del contraste está condicionada a la adecuación del diseño y del modelo. Una diferencia entre grupos no equivale, por sí sola, a una reducción del estrés atribuible a la intervención.
> **Pregunta para pensar.** ¿Por qué es posible obtener un valor F muy alto incluso si los estudiantes de un mismo grupo no tienen exactamente el mismo puntaje de estrés?
# Magnitud del efecto: ¿qué tan importantes son las diferencias?
El ANOVA responde si existe evidencia de que las medias poblacionales difieren. Sin embargo, **un valor *p* pequeño no indica, por sí solo, si esas diferencias tienen una magnitud importante**. Por ello complementamos el contraste global con dos medidas de tamaño del efecto: **eta cuadrado** y **omega cuadrado**.
**Pregunta de investigación:** ¿qué proporción de la variabilidad de los puntajes de estrés académico se asocia con la pertenencia a los grupos Respiración guiada, Mindfulness breve y Control?
Estas medidas describen **la magnitud global de la asociación** entre `programa` y `estres`. No identifican cuál intervención es mejor; eso requiere observar las medias y las comparaciones específicas, como Tukey o Dunnett.
## Eta cuadrado ($\eta^2$): proporción de variabilidad asociada con los grupos
### ¿Qué significa?
Eta cuadrado indica qué proporción de la variabilidad total de los puntajes de estrés de **esta muestra** corresponde a las diferencias entre las medias de los tres grupos. Si su valor se aproxima a cero, las diferencias entre medias representan una parte pequeña de la variabilidad total; si se acerca a uno, representan una parte grande.
### Fórmula y cálculo
$$
\boxed{\eta^2=\frac{SC_{\text{entre}}}{SC_{\text{total}}}}
$$
Donde $SC_{\text{entre}}$ es la **suma de cuadrados entre grupos** y $SC_{\text{total}}$ es la **suma de cuadrados total**. En el ANOVA clásico de un factor, también puede calcularse con el estadístico F y sus grados de libertad:
$$
\begin{aligned}
\eta^2
&=\frac{F\,gl_{\text{entre}}}{F\,gl_{\text{entre}}+gl_{\text{dentro}}}\\[4pt]
&=\frac{119.243\,(2)}{119.243\,(2)+27}\\[4pt]
&=\boxed{0.8983=89.83\%}.
\end{aligned}
$$
**Interpretación estadística:** en la muestra, aproximadamente el **89.83 % de la variabilidad total observada** en los puntajes de estrés se asocia con las diferencias entre las medias de los grupos. Es una magnitud excepcionalmente elevada en términos de proporción de variabilidad.
**En palabras sencillas:** los tres grupos tienen puntajes medios tan diferentes, en relación con la variación de los estudiantes dentro de cada grupo, que el grupo al que pertenece cada estudiante es un descriptor muy importante de su puntaje de estrés en estos datos.
En R verificamos el resultado a partir de las sumas de cuadrados, sin utilizar código adicional para imprimir interpretaciones:
```{r}
SC_entre <- resultado_anova[["Sum Sq"]][1]
SC_total <- sum(resultado_anova[["Sum Sq"]])
eta_cuadrado <- SC_entre / SC_total
eta_cuadrado
```
## Omega cuadrado ($\omega^2$): estimación corregida del tamaño del efecto
### ¿Para qué calcularlo si ya tenemos eta cuadrado?
Eta cuadrado resume la variabilidad asociada con los grupos **en la muestra** y tiende a sobrestimar el parámetro poblacional. Omega cuadrado incorpora una corrección por la variabilidad residual y los grados de libertad, de modo que suele ofrecer una estimación menos sesgada de la proporción de varianza poblacional asociada con el factor.
### Fórmula y cálculo
$$
\boxed{\omega^2=
\frac{SC_{\text{entre}}-(k-1)MC_{\text{dentro}}}
{SC_{\text{total}}+MC_{\text{dentro}}}}
$$
Donde $k$ es el **número de grupos** ($k=3$) y $MC_{\text{dentro}}$ es el **cuadrado medio residual**, que representa la variabilidad de los puntajes dentro de los grupos. Para este ANOVA de un factor, podemos expresar el cálculo mediante F:
$$
\begin{aligned}
\omega^2
&=\frac{gl_{\text{entre}}(F-1)}{gl_{\text{entre}}F+gl_{\text{dentro}}+1}\\[4pt]
&=\frac{2(119.243-1)}{2(119.243)+27+1}\\[4pt]
&=\boxed{0.8874=88.74\%}.
\end{aligned}
$$
**Interpretación estadística:** omega cuadrado estima que alrededor del **88.74 % de la variabilidad poblacional** de los puntajes de estrés se asocia con el factor `programa`, bajo el modelo empleado y sus supuestos. Es ligeramente menor que eta cuadrado debido a la corrección incorporada.
**En palabras sencillas:** incluso después de considerar la variabilidad residual al estimar el tamaño del efecto, las diferencias entre los grupos siguen siendo extraordinariamente grandes. Esto refuerza la idea de una asociación global fuerte, pero **no demuestra todavía cuál intervención es preferible**.
```{r}
MC_dentro <- resultado_anova[["Mean Sq"]][2]
omega_cuadrado <- (
SC_entre - resultado_anova$Df[1] * MC_dentro
) / (SC_total + MC_dentro)
omega_cuadrado
```
## ¿Son valores pequeños, moderados o grandes?
Como guía **orientativa**, en aplicaciones de ANOVA suelen citarse los siguientes valores de referencia de **eta cuadrado** (convenciones aproximadas, no puntos de corte universales):
| Magnitud orientativa | Valor de referencia de $\eta^2$ | ¿Qué representa? |
|:-----------------------|-----------------------:|:-----------------------|
| Pequeña | $0.01$ (1 %) | Las diferencias entre grupos representan una proporción reducida de variabilidad. |
| Moderada | $0.06$ (6 %) | La asociación puede ser apreciable, dependiendo del contexto. |
| Grande | $0.14$ (14 %) | Las diferencias grupales representan una proporción relativamente importante. |
| **Caso del estrés** | $0.8983$ (89.83 %) | **Magnitud muy superior a la referencia habitual de efecto grande.** |
> **Recuerde.** Estas convenciones son solo orientaciones para contextualizar $\eta^2$; no deben trasladarse mecánicamente a todas las disciplinas ni aplicarse como umbrales rígidos de $\omega^2$. Una magnitud *muy grande* no equivale automáticamente a un resultado clínicamente beneficioso.
**¿Cómo clasificar omega cuadrado?** El valor obtenido, $\omega^2=0.8874$, también indica una asociación **extraordinariamente grande**. La calificación se fundamenta en que casi nueve décimas de la varianza quedan asociadas estadísticamente con los grupos, no en un punto de corte universal especial para omega cuadrado.
## Gráfico: comparación visual de eta y omega cuadrado
En el siguiente gráfico, la longitud de cada barra representa la magnitud estimada en una escala común de **0 % a 100 %**. La zona gris completa la escala; **no representa un porcentaje de estudiantes que no mejoraron**. Eta y omega se interpretan de manera distinta: uno describe la muestra y el otro incorpora una corrección para estimar el tamaño del efecto poblacional.
```{r}
#| fig-width: 10
#| fig-height: 4.2
#| fig-cap: "Figura. Magnitud del efecto asociada al programa según eta y omega cuadrado."
magnitudes <- data.frame(
medida = factor(
c("Eta cuadrado · muestra", "Omega cuadrado · corregido"),
levels = c("Omega cuadrado · corregido", "Eta cuadrado · muestra")
),
proporcion = c(eta_cuadrado, omega_cuadrado)
)
ggplot(magnitudes, aes(y = medida)) +
geom_col(aes(x = 1), fill = "#E7EDF5", width = 0.58) +
geom_col(aes(x = proporcion, fill = medida), width = 0.58) +
geom_text(
aes(x = proporcion / 2,
label = paste0(format(round(100 * proporcion, 2), nsmall = 2), " %")),
colour = "white", fontface = "bold", size = 5.3
) +
scale_fill_manual(values = c(
"Eta cuadrado · muestra" = "#0E9CA8",
"Omega cuadrado · corregido" = "#7561BD"
)) +
scale_x_continuous(
limits = c(0, 1), breaks = seq(0, 1, 0.2),
labels = paste0(seq(0, 100, 20), " %"),
expand = expansion(mult = c(0, 0))
) +
labs(
title = "¿Qué proporción de la variabilidad se asocia con el programa?",
subtitle = "Eta: descripción de la muestra · Omega: estimación corregida del efecto",
x = "Proporción de variabilidad asociada estadísticamente con el grupo",
y = NULL,
caption = "Un porcentaje elevado no es un porcentaje de eficacia terapéutica ni demuestra causalidad."
) +
tema_estres +
theme(
legend.position = "none",
axis.text.y = element_text(face = "bold", size = 11, colour = "#253A51"),
axis.title.x = element_text(size = 10.5),
panel.grid.major.x = element_line(colour = "#E8EDF3", linewidth = 0.35)
)
```
**Cómo interpretar el gráfico:** las dos barras son muy largas y cercanas entre sí. Esto nos indica que las diferencias entre los tres grupos representan una proporción muy alta de la variabilidad del puntaje de estrés y que la estimación corregida sigue siendo elevada. La pequeña separación entre ambas barras se debe a que omega cuadrado incorpora una corrección que eta cuadrado no aplica.
**Tabla 3. Resumen del tamaño del efecto en el caso de estrés académico.**
| Medida | Resultado | ¿Qué significa? | Valoración contextual |
|:-----------------|-----------------:|:-----------------|:-----------------|
| Eta cuadrado ($\eta^2$) | **0.8983 (89.83 %)** | Proporción de variabilidad **muestral** asociada con los grupos. | **Muy grande**. |
| Omega cuadrado ($\omega^2$) | **0.8874 (88.74 %)** | Estimación corregida de la proporción de variabilidad **poblacional** asociada con los grupos. | **Muy grande**. |
## ¿Es bueno o malo para los programas psicológicos?
**Desde el análisis estadístico:** es un resultado **informativo y favorable para detectar una diferencia global clara entre grupos**, porque la magnitud de la asociación es muy elevada. Sin embargo, **no es bueno ni malo por sí mismo en términos de beneficio psicológico**: un tamaño del efecto grande no indica qué grupo tiene menor estrés.
**Desde la interpretación psicológica:** si una puntuación más baja representa menos estrés, sería favorable que una intervención tuviera una **media menor que Control**, con una diferencia respaldada por un intervalo de confianza suficientemente preciso y una magnitud relevante para la escala utilizada. Esas conclusiones se estudian después con **Dunnett**, y la comparación entre intervenciones se estudia con **Tukey**.
### Lo que estos porcentajes **no** significan
- **No** significan que el 89.83 % o el 88.74 % de los estudiantes haya mejorado.
- **No** significan que el estrés se haya reducido en esos porcentajes respecto al inicio: el estudio no documenta aquí mediciones previas comparables.
- **No** significan que los programas tengan una eficacia terapéutica de casi el 90 %.
- **No** prueban por sí solos que pertenecer a un programa *cause* el nivel de estrés observado, porque falta documentar el diseño y la asignación de los participantes.
- **No** permiten concluir cuál de las dos intervenciones es superior sin compararlas directamente.
### ¿Debemos preocuparnos por un valor tan elevado?
No debemos descartarlo por ser grande; tampoco celebrarlo automáticamente. Un tamaño del efecto cercano a $0.90$ es **extraordinariamente elevado** para muchas investigaciones psicológicas y merece revisar la procedencia de los datos, la codificación y el rango de la escala, la dispersión dentro de los grupos, la comparabilidad inicial y los supuestos del modelo. Si la base es simulada con fines didácticos, debemos señalarlo expresamente; si es real, la interpretación debe sustentarse en el diseño y la calidad de la medición.
**Conclusión integrada:** tanto $\eta^2=0.8983$ como $\omega^2=0.8874$ indican que el factor `programa` se asocia con diferencias globales **muy grandes** en los puntajes de estrés. Esto justifica estudiar con cuidado **entre qué grupos ocurren**, **cuántos puntos representan**, **qué precisión tienen** y **si resultan psicológicamente favorables**. No sustituye esas comparaciones ni demuestra eficacia causal.
**Pregunta para pensar:** ¿podría existir un omega cuadrado muy elevado si el grupo Control fuera el que presenta *menos* estrés? Sí. El tamaño del efecto mide la **magnitud de las diferencias**, no su dirección ni su conveniencia. Por ello es indispensable continuar con las medias y las comparaciones específicas.
# Comparaciones múltiples: de la pregunta global a las diferencias concretas
ANOVA responde si todas las medias pueden considerarse iguales. Las comparaciones múltiples responden preguntas más específicas. **La elección del método se fundamenta en el objetivo de investigación, no en buscar el valor *p* más pequeño.**
| Pregunta | Procedimiento apropiado |
|:-----------------------------------|:-----------------------------------|
| ¿Todos los grupos difieren entre sí por pares? | **Tukey HSD** (con supuestos del ANOVA clásico). |
| ¿Cada intervención difiere del grupo Control? | **Dunnett** (comparaciones contra un control común). |
| ¿Cómo funcionan las comparaciones por pares usando el error residual común y sin ajuste? | **Fisher LSD (DMS)**: comparaciones *t* con el cuadrado medio residual del ANOVA. Útil para enseñar la idea, pero más liberal ante comparaciones múltiples. |
## Tukey HSD: comparar todos los pares
Tukey es útil cuando la investigación también necesita comparar **Respiración guiada vs. Mindfulness breve**, además de comparar cada una con Control. Con tres grupos tenemos $3(3-1)/2=3$ comparaciones. Los valores *p* e intervalos de confianza se ajustan por esa familia de comparaciones.
```{r}
resultado_tukey <- TukeyHSD(modelo_estres, "programa", conf.level = 0.95)
resultado_tukey
```
**Tabla 4. Comparaciones de Tukey.** Las diferencias se definen como **primer grupo menos segundo grupo**; el intervalo corresponde al 95 % de confianza simultánea.
| Comparación (primero − segundo) | Diferencia | LI 95 % | LS 95 % | p ajustado |
|:--------------|--------------:|--------------:|--------------:|:--------------|
| Mindfulness breve − Respiración guiada | `r round(resultado_tukey$programa[1, "diff"], 2)` | `r round(resultado_tukey$programa[1, "lwr"], 2)` | `r round(resultado_tukey$programa[1, "upr"], 2)` | `r format.pval(resultado_tukey$programa[1, "p adj"], digits = 3, eps = 0.001)` |
| Control − Respiración guiada | `r round(resultado_tukey$programa[2, "diff"], 2)` | `r round(resultado_tukey$programa[2, "lwr"], 2)` | `r round(resultado_tukey$programa[2, "upr"], 2)` | `r format.pval(resultado_tukey$programa[2, "p adj"], digits = 3, eps = 0.001)` |
| Control − Mindfulness breve | `r round(resultado_tukey$programa[3, "diff"], 2)` | `r round(resultado_tukey$programa[3, "lwr"], 2)` | `r round(resultado_tukey$programa[3, "upr"], 2)` | `r format.pval(resultado_tukey$programa[3, "p adj"], digits = 3, eps = 0.001)` |
**Cómo leer e interpretar esta tabla:**
- **Mindfulness breve frente a Respiración guiada:** la diferencia estimada es `r round(resultado_tukey$programa[1, "diff"], 2)` puntos. `r ifelse(resultado_tukey$programa[1, "p adj"] < 0.05, "Se detecta evidencia de diferencia entre ambos grupos después del ajuste por multiplicidad.", "No se obtiene evidencia estadística suficiente de diferencia entre estos grupos después del ajuste por multiplicidad.")` El signo de la diferencia indica cuál de las medias es mayor.
- **Control frente a Respiración guiada:** la diferencia es `r round(resultado_tukey$programa[2, "diff"], 2)` puntos. `r ifelse(resultado_tukey$programa[2, "p adj"] < 0.05, "El contraste ajustado respalda una diferencia de medias entre ambos grupos.", "El contraste ajustado no ofrece evidencia suficiente de diferencia de medias.")` Si el contraste Control − Respiración es positivo, el Control presenta mayor estrés promedio.
- **Control frente a Mindfulness breve:** la diferencia es `r round(resultado_tukey$programa[3, "diff"], 2)` puntos. `r ifelse(resultado_tukey$programa[3, "p adj"] < 0.05, "El contraste ajustado respalda una diferencia de medias entre ambos grupos.", "El contraste ajustado no ofrece evidencia suficiente de diferencia de medias.")` Si el contraste Control − Mindfulness es positivo, el Control presenta mayor estrés promedio.
**Interpretación de los intervalos:** cuando el intervalo simultáneo incluye el cero, la comparación correspondiente no aporta evidencia suficiente de una diferencia bilateral al 5 %. Cuando excluye el cero, la dirección del intervalo ayuda a identificar qué grupo posee mayor puntaje medio.
```{r}
#| fig-width: 9
#| fig-height: 5.2
# Los valores de Tukey se transforman en datos solo para dibujar los intervalos.
comparaciones_tukey <- data.frame(
comparacion = rownames(resultado_tukey$programa),
diferencia = resultado_tukey$programa[, "diff"],
li = resultado_tukey$programa[, "lwr"],
ls = resultado_tukey$programa[, "upr"]
)
comparaciones_tukey$comparacion <- factor(
comparaciones_tukey$comparacion,
levels = rev(comparaciones_tukey$comparacion)
)
ggplot(comparaciones_tukey, aes(y = comparacion)) +
geom_vline(xintercept = 0, linetype = "dashed",
colour = "#E36C4E", linewidth = 0.85) +
geom_segment(
aes(x = li, xend = ls, yend = comparacion),
linewidth = 2.4, colour = "#6E5ABB", alpha = 0.86
) +
geom_point(aes(x = diferencia), size = 3.9,
colour = "#0E9CA8", shape = 18) +
labs(
title = "Diferencias de medias: Tukey HSD",
subtitle = "Violeta: IC simultáneo del 95 % · Rombo: diferencia estimada · Coral: cero",
x = "Diferencia de medias (puntos de estrés)", y = NULL
) +
tema_estres
```
**Interpretación del gráfico:** cada punto representa una diferencia estimada de medias y su segmento representa el intervalo de confianza simultáneo al 95 %. Los intervalos que excluyen el cero respaldan diferencias estadísticamente significativas entre los grupos correspondientes. Debemos interpretar **la magnitud en puntos de estrés y el sentido de cada contraste**, no solo su significación.
## Fisher LSD (DMS): diferencia mínima significativa
### ¿Qué pregunta responde y por qué incluirla?
La **diferencia mínima significativa (LSD, por sus siglas en inglés)** compara las medias por pares utilizando la **misma estimación de varianza residual** del ANOVA. Es una forma de comprender cómo una diferencia observada pasa a ser suficientemente grande respecto del error experimental para obtener evidencia estadística.
El método se enseña aquí **para compararlo con Tukey y Dunnett**, no para escoger automáticamente el procedimiento que proporcione más resultados significativos.
### Fórmula y significado de sus componentes
Para los grupos $i$ y $j$ la diferencia observada es $\bar Y_i-\bar Y_j$. Con un nivel de significación bilateral $\alpha=0.05$, el umbral de Fisher es:
$$
\boxed{\mathrm{LSD}_{ij}=t_{1-\alpha/2,\,N-k}\sqrt{MC_{\mathrm{dentro}}\left(\frac{1}{n_i}+\frac{1}{n_j}\right)}}
$$
- $t_{1-\alpha/2,\,N-k}$: valor crítico de la distribución t con los grados de libertad residuales del ANOVA.
- $MC_{\mathrm{dentro}}$: cuadrado medio residual, estimación común de la varianza.
- $n_i$ y $n_j$: tamaños muestrales de los grupos comparados.
**Regla de comparación:** si $|\bar Y_i-\bar Y_j|>\mathrm{LSD}_{ij}$, esa comparación resulta significativa al 5 % **sin ajuste por multiplicidad**. Si los tamaños grupales son distintos, el valor de LSD puede cambiar de un par a otro.
### Cálculo con los datos del caso
El ANOVA tiene **`r df.residual(modelo_estres)` grados de libertad residuales** y un cuadrado medio residual de **`r round(MC_dentro, 4)`**. El valor crítico t bilateral es **`r round(qt(0.975, df.residual(modelo_estres)), 4)`**. Esos valores permiten sustituir los componentes de la fórmula y evaluar cada diferencia.
```{r}
# Comparaciones t por pares con la varianza residual común del ANOVA.
# Fisher LSD: valores p SIN ajuste por comparaciones múltiples.
# ---------------------------------------------------------
# PRUEBA LSD DE FISHER: COMPARACIÓN DE MEDIAS
# ---------------------------------------------------------
# Realizamos las comparaciones entre los programas.
# p.adj = "none": no aplica ajuste adicional por multiplicidad.
# group = TRUE: presenta las medias agrupadas con letras.
resultado_lsd <- agricolae::LSD.test(
modelo_estres,
"programa",
p.adj = "none",
group = TRUE
)
# Presentamos las medias y las letras en una tabla.
knitr::kable(
resultado_lsd$groups,
digits = 2,
caption = "Comparación de medias mediante LSD de Fisher"
)
```
```{r}
#| include: false
# Cálculos auxiliares que alimentan la tabla Markdown (sin kable ni cat).
t_lsd <- qt(0.975, df.residual(modelo_estres))
diferencia_lsd <- c(
descriptivos$media[2] - descriptivos$media[1],
descriptivos$media[3] - descriptivos$media[1],
descriptivos$media[3] - descriptivos$media[2]
)
margen_lsd <- t_lsd * sqrt(MC_dentro * c(
1 / descriptivos$n[2] + 1 / descriptivos$n[1],
1 / descriptivos$n[3] + 1 / descriptivos$n[1],
1 / descriptivos$n[3] + 1 / descriptivos$n[2]
))
p_lsd <- c(resultado_lsd$p.value[1, 1],
resultado_lsd$p.value[2, 1],
resultado_lsd$p.value[2, 2])
```
**Tabla 5. Comparaciones de Fisher LSD (sin ajuste).** El intervalo corresponde al 95 % de confianza **individual**, no simultánea.
| Comparación (primero − segundo) | Diferencia | LSD crítico | IC 95 % individual | Valor p sin ajuste |
|:--------------|--------------:|--------------:|:--------------|:--------------|
| Mindfulness breve − Respiración guiada | `r round(diferencia_lsd[1], 2)` | `r round(margen_lsd[1], 2)` | \[`r round(diferencia_lsd[1] - margen_lsd[1], 2)`, `r round(diferencia_lsd[1] + margen_lsd[1], 2)`\] | `r format.pval(p_lsd[1], digits = 3, eps = 0.001)` |
| Control − Respiración guiada | `r round(diferencia_lsd[2], 2)` | `r round(margen_lsd[2], 2)` | \[`r round(diferencia_lsd[2] - margen_lsd[2], 2)`, `r round(diferencia_lsd[2] + margen_lsd[2], 2)`\] | `r format.pval(p_lsd[2], digits = 3, eps = 0.001)` |
| Control − Mindfulness breve | `r round(diferencia_lsd[3], 2)` | `r round(margen_lsd[3], 2)` | \[`r round(diferencia_lsd[3] - margen_lsd[3], 2)`, `r round(diferencia_lsd[3] + margen_lsd[3], 2)`\] | `r format.pval(p_lsd[3], digits = 3, eps = 0.001)` |
### Interpretación aplicada
- **Mindfulness breve frente a Respiración guiada:** la diferencia es **`r round(diferencia_lsd[1], 2)` puntos**, frente a una LSD crítica de **`r round(margen_lsd[1], 2)`**. `r ifelse(abs(diferencia_lsd[1]) > margen_lsd[1], "La diferencia supera el umbral de Fisher LSD y es significativa sin ajuste.", "La diferencia no supera el umbral de Fisher LSD; no existe evidencia suficiente al 5 % con este método.")`
- **Control frente a Respiración guiada:** la diferencia es **`r round(diferencia_lsd[2], 2)` puntos** y la LSD crítica es **`r round(margen_lsd[2], 2)`**. `r ifelse(abs(diferencia_lsd[2]) > margen_lsd[2], "La comparación es significativa sin ajuste.", "La comparación no resulta significativa sin ajuste.")` Una diferencia positiva indica mayor estrés medio en Control.
- **Control frente a Mindfulness breve:** la diferencia es **`r round(diferencia_lsd[3], 2)` puntos** y la LSD crítica es **`r round(margen_lsd[3], 2)`**. `r ifelse(abs(diferencia_lsd[3]) > margen_lsd[3], "La comparación es significativa sin ajuste.", "La comparación no resulta significativa sin ajuste.")` Una diferencia positiva indica mayor estrés medio en Control.
**Advertencia importante:** algunas variantes utilizan el criterio de aplicar LSD solamente después de un ANOVA global significativo (LSD «protegido»). Incluso así, con más de dos grupos el control del error familiar puede ser insuficiente frente a métodos como Tukey o Dunnett. Por eso, **no debemos interpretar un resultado significativo exclusivamente con LSD si no se sostiene con el procedimiento seleccionado según la pregunta de investigación**.
**Comparación didáctica:** Tukey controla las tres comparaciones simultáneamente; Dunnett controla específicamente las dos comparaciones con Control; Fisher LSD utiliza pruebas individuales sin un ajuste equivalente. Que el valor p de LSD sea menor no significa que el efecto sea mayor, sino que cambia la protección frente a múltiples contrastes.
## Dunnett: comparar específicamente las intervenciones con Control
Si la decisión del equipo de Psicología es determinar si **cada intervención** presenta un puntaje medio diferente al del **Control**, Dunnett responde de forma más directa: compara Respiración guiada con Control y Mindfulness breve con Control, **sin efectuar una comparación innecesaria entre las dos intervenciones**.
Este procedimiento ajusta simultáneamente la inferencia de las comparaciones que comparten el mismo grupo de referencia. La hipótesis de cada contraste es $H_0:\mu_{\text{intervención}}-\mu_{\text{Control}}=0$. Aquí utilizamos contrastes **bilaterales**.
Para que R interprete correctamente las diferencias, debemos convertir **Control** en categoría de referencia. Esto no modifica los datos ni las medias: únicamente fija el orden y el sentido de los contrastes.
```{r}
datos_dunnett <- datos_estres |>
dplyr::mutate(programa = relevel(programa, ref = "Control"))
modelo_dunnett <- aov(estres ~ programa, data = datos_dunnett)
resultado_dunnett <- multcomp::glht(
modelo_dunnett,
linfct = multcomp::mcp(programa = "Dunnett")
)
summary(resultado_dunnett)
confint(resultado_dunnett)
```
```{r}
#| include: false
resumen_dunnett <- summary(resultado_dunnett)
intervalos_dunnett <- confint(resultado_dunnett)$confint
p_dunnett <- resumen_dunnett$test$pvalues
```
**Tabla 6. Comparaciones de Dunnett frente a Control.** Cada diferencia se calcula como **intervención menos Control**.
| Contraste | Diferencia (puntos) | LI 95 % | LS 95 % | p ajustado |
|:--------------|--------------:|--------------:|--------------:|:--------------|
| Respiración guiada − Control | `r round(intervalos_dunnett[1, 1], 2)` | `r round(intervalos_dunnett[1, 2], 2)` | `r round(intervalos_dunnett[1, 3], 2)` | `r format.pval(p_dunnett[1], digits = 3, eps = 0.001)` |
| Mindfulness breve − Control | `r round(intervalos_dunnett[2, 1], 2)` | `r round(intervalos_dunnett[2, 2], 2)` | `r round(intervalos_dunnett[2, 3], 2)` | `r format.pval(p_dunnett[2], digits = 3, eps = 0.001)` |
**Interpretación para la investigación:**
- **Respiración guiada:** el puntaje medio difiere del Control en `r round(intervalos_dunnett[1, 1], 2)` puntos (intervención − Control). `r ifelse(p_dunnett[1] < 0.05, "Existe evidencia de diferencia estadísticamente significativa después del ajuste de Dunnett.", "No existe evidencia suficiente de diferencia después del ajuste de Dunnett.")` `r ifelse(intervalos_dunnett[1,1] < 0, "La media observada es menor que la del Control, una dirección favorable si menos puntos indican menos estrés.", "La media observada es igual o mayor que la del Control; una diferencia positiva no favorece a la intervención si menos puntos indican menos estrés.")`
- **Mindfulness breve:** el puntaje medio difiere del Control en `r round(intervalos_dunnett[2, 1], 2)` puntos (intervención − Control). `r ifelse(p_dunnett[2] < 0.05, "Existe evidencia de diferencia estadísticamente significativa después del ajuste de Dunnett.", "No existe evidencia suficiente de diferencia después del ajuste de Dunnett.")` `r ifelse(intervalos_dunnett[2,1] < 0, "La media observada es menor que la del Control, una dirección favorable si menos puntos indican menos estrés.", "La media observada es igual o mayor que la del Control; una diferencia positiva no favorece a la intervención si menos puntos indican menos estrés.")`
**Interpretación psicológica y decisión:** una media inferior al Control es una dirección favorable, pero debe acompañarse de evidencia inferencial, precisión suficiente y una valoración de relevancia práctica según el instrumento usado. Si una comparación no es significativa, ello **no demuestra equivalencia ni ausencia de efecto**. Para sostener que una intervención *reduce* causalmente el estrés se necesita además un diseño adecuado.
> **Error frecuente.** Concluir que una intervención es superior a otra porque una presenta $p<0.05$ frente al Control y la otra no. Para afirmar superioridad *entre intervenciones* debemos contrastarlas directamente (por ejemplo, con Tukey).
# Síntesis integral y decisión fundada
**Primera pregunta: ¿existen diferencias globales?** Sí. El ANOVA del caso informa $F(2,27)=119.243$, $p<0.001$, lo cual indica que no todas las medias poblacionales son iguales.
**Segunda pregunta: ¿son diferencias de magnitud importante?** Sí, en términos estadísticos. Eta cuadrado ($\eta^2=0.8983$, 89.83 %) y omega cuadrado ($\omega^2=0.8874$, 88.74 %) son **muy grandes** y revelan una asociación global extraordinariamente elevada. **No significa que casi el 90 % de estudiantes mejoró ni que el programa reduzca el estrés un 90 %**: falta conocer la dirección y relevancia de las comparaciones y la validez del diseño para inferir causalidad.
**Tercera pregunta: ¿dónde se observan las diferencias?** Las **Tablas 4, 5 y 6** presentan, respectivamente, Tukey (todos los pares con ajuste), Fisher LSD (todos los pares sin ajuste) y Dunnett (cada intervención frente a Control con ajuste). Para una conclusión principal debemos utilizar el método correspondiente a la pregunta científica y considerar conjuntamente **diferencia de medias, intervalo de confianza y valor *p* ajustado**, cuando corresponda, además del significado práctico de los puntos en la escala de estrés.
**Cuarta pregunta: ¿qué podemos decidir?** El equipo puede identificar qué grupos presentan menores puntajes medios en la muestra y qué comparaciones cuentan con evidencia estadística. Para recomendar un programa como intervención eficaz necesita conocer el diseño del estudio, la comparabilidad inicial de los participantes, la calidad del instrumento, los posibles efectos adversos y la relevancia psicológica de las diferencias observadas.
> **Conclusión:** el análisis ofrece evidencia sólida de diferencias globales entre los tres grupos estudiados y una asociación de gran magnitud entre grupo y puntaje de estrés. Las comparaciones específicas deben interpretarse con los valores de las Tablas 4, 5 y 6 y priorizar el método inferencial elegido por el objetivo del estudio. Aun si una intervención difiere significativamente del Control, no es correcto presentar ese hallazgo, por sí solo, como una reducción causal del estrés sin información adicional sobre el diseño y la medición.
# Preguntas para discutir en clase
1. ¿Por qué el ANOVA no puede decirnos por sí solo cuál de las intervenciones presenta menor estrés que el Control?
2. ¿Por qué $\eta^2=0.8983$ y $\omega^2=0.8874$ se consideran muy grandes? Explique por qué no significan que «casi el 90 % de estudiantes mejoró» ni que «el estrés se redujo casi un 90 %».
3. Si una diferencia de 2 puntos es estadísticamente significativa, ¿qué información adicional necesitamos antes de considerarla psicológicamente relevante?
4. Si Levene indica heterogeneidad importante de varianzas, ¿por qué no bastaría con ignorar el resultado y continuar mecánicamente con Tukey?
5. ¿Por qué «no significativo» no es equivalente a «los programas son iguales»?
6. ¿Cómo cambiaría la estrategia analítica si se hubiera medido a los mismos estudiantes antes y después de la intervención?
# Referencias bibliográficas
- Dunnett, C. W. (1955). A multiple comparison procedure for comparing several treatments with a control. *Journal of the American Statistical Association, 50*(272), 1096–1121.
- Hothorn, T., Bretz, F., & Westfall, P. (2008). Simultaneous inference in general parametric models. *Biometrical Journal, 50*(3), 346–363.
- Lakens, D. (2013). Calculating and reporting effect sizes to facilitate cumulative science: A practical primer for t-tests and ANOVAs. *Frontiers in Psychology, 4*, 863.
- Montgomery, D. C. (2017). *Design and analysis of experiments* (9th ed.). Wiley.
- Morales, J., & Martínez, M. A. (2021). *Modelos estadísticos*. Universidad Miguel Hernández de Elche.
------------------------------------------------------------------------
**Nota de reproducibilidad.** La ruta de Excel se ha preservado exactamente como en el documento original. El QMD entregado no incluye la base `.xlsx`; por ello, los estadísticos de Shapiro, Levene, descriptivos y comparaciones de Tukey, Fisher LSD y Dunnett se incorporan mediante expresiones en línea que se resuelven **al generar el HTML en la computadora que dispone del Excel**. Los valores globales $F(2,27)=119.243$, $\eta^2\approx0.8983$ y $\omega^2\approx0.8874$ provienen de los resultados ya comunicados para este caso y deben concordar con el archivo original al ejecutarlo.