Las sumas de cuadrados permiten determinar cuánta variabilidad de una variable respuesta es explicada por cada término de un modelo lineal.
En un diseño ortogonal, los predictores explican partes independientes de la variabilidad y las sumas de cuadrados Tipo I, II y III producen resultados equivalentes.
En un diseño no ortogonal, los predictores comparten parte de la variabilidad explicada. En consecuencia, el resultado puede depender del procedimiento utilizado para asignar esa variabilidad.
En este documento se utilizará un ejemplo de ANCOVA para explicar:
Los siguientes paquetes son necesarios para desarrollar el análisis.
# Ejecutar solamente si los paquetes no están instalados
# install.packages(c("car", "dplyr", "ggplot2", "knitr"))
library(car)
library(dplyr)
library(ggplot2)
library(knitr)Para calcular correctamente las sumas de cuadrados Tipo III se utilizarán contrastes de suma a cero.
Se simulará un estudio educativo con tres métodos de enseñanza:
Para cada estudiante se registran:
metodo: método de enseñanza;pretest: calificación antes de aplicar el método;pretest_c: pretest centrado en su media;postest: calificación después de aplicar el
método;jornada: jornada académica.Los grupos presentan diferentes medias iniciales de pretest. Esto genera un diseño no ortogonal, porque el método y la covariable están relacionados.
set.seed(2026)
# Cantidad de estudiantes por método
n_metodo <- c(
A = 40,
B = 35,
C = 45
)
datos <- data.frame(
metodo = factor(
rep(
names(n_metodo),
times = n_metodo
),
levels = c("A", "B", "C")
)
)
# Medias iniciales diferentes entre métodos
media_pretest <- c(
A = 60,
B = 68,
C = 75
)
# Efecto verdadero de cada método
efecto_metodo <- c(
A = 0,
B = 4,
C = 8
)
# Generación del pretest
datos$pretest <- rnorm(
n = nrow(datos),
mean = media_pretest[
as.character(datos$metodo)
],
sd = 7
)
# Centrado del pretest
datos$pretest_c <- datos$pretest -
mean(datos$pretest)
# Generación del postest
datos$postest <- 70 +
0.65 * datos$pretest_c +
efecto_metodo[
as.character(datos$metodo)
] +
rnorm(
n = nrow(datos),
mean = 0,
sd = 5
)
# Variable adicional para explicar celdas vacías
datos$jornada <- ifelse(
datos$metodo == "C",
"Diurna",
sample(
c("Diurna", "Nocturna"),
size = nrow(datos),
replace = TRUE
)
)
datos$jornada <- factor(
datos$jornada,
levels = c("Diurna", "Nocturna")
)
head(datos)Se calculan las medias del pretest y del postest para cada método.
resumen_datos <- datos |>
group_by(metodo) |>
summarise(
n = n(),
media_pretest = mean(pretest),
desviacion_pretest = sd(pretest),
media_postest = mean(postest),
desviacion_postest = sd(postest),
.groups = "drop"
)
kable(
resumen_datos,
digits = 2,
caption = "Resumen descriptivo por método"
)| metodo | n | media_pretest | desviacion_pretest | media_postest | desviacion_postest |
|---|---|---|---|---|---|
| A | 40 | 59.71 | 6.99 | 66.55 | 5.40 |
| B | 35 | 66.51 | 5.93 | 74.20 | 5.95 |
| C | 45 | 74.48 | 8.12 | 82.90 | 8.12 |
Los métodos presentan diferentes medias iniciales de pretest. Por tanto, una comparación directa de las medias del postest podría confundir el efecto del método con las diferencias iniciales entre los estudiantes.
ggplot(
datos,
aes(
x = metodo,
y = pretest
)
) +
geom_boxplot() +
labs(
title = "Distribución del pretest según el método",
x = "Método",
y = "Pretest"
) +
theme_minimal()La gráfica permite observar que los grupos no comienzan aproximadamente en el mismo nivel.
ggplot(
datos,
aes(
x = pretest_c,
y = postest,
group = metodo,
linetype = metodo
)
) +
geom_point(
alpha = 0.65
) +
geom_smooth(
method = "lm",
se = FALSE
) +
labs(
title = "Relación entre pretest y postest",
subtitle = "Rectas de regresión separadas por método",
x = "Pretest centrado",
y = "Postest",
linetype = "Método"
) +
theme_minimal()El modelo ANCOVA sin interacción se expresa como:
\[ Y_{ij} = \beta_0 + \beta_1X_{ij} + \tau_i + \varepsilon_{ij}, \]
donde:
##
## Call:
## lm(formula = postest ~ pretest_c + metodo, data = datos)
##
## Residuals:
## Min 1Q Median 3Q Max
## -12.8514 -2.9139 0.1427 2.8554 11.7759
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 74.76802 0.44041 169.771 < 2e-16 ***
## pretest_c 0.65510 0.06189 10.586 < 2e-16 ***
## metodo1 -3.28736 0.76355 -4.305 3.5e-05 ***
## metodo2 -0.09786 0.64264 -0.152 0.879
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 4.794 on 116 degrees of freedom
## Multiple R-squared: 0.756, Adjusted R-squared: 0.7497
## F-statistic: 119.8 on 3 and 116 DF, p-value: < 2.2e-16
El coeficiente de pretest_c representa el cambio
esperado en el postest por cada punto adicional en el pretest.
Los coeficientes asociados con metodo representan
diferencias ajustadas entre los métodos después de controlar el nivel
inicial.
La suma de cuadrados total es:
\[ SS_T = \sum_{i=1}^{n} (y_i-\bar{y})^2. \]
La suma de cuadrados residual es:
\[ SS_E = \sum_{i=1}^{n} (y_i-\widehat{y}_i)^2. \]
La suma de cuadrados explicada por el modelo es:
\[ SS_M = SS_T-SS_E. \]
ss_total <- sum(
(
datos$postest -
mean(datos$postest)
)^2
)
ss_error <- deviance(
modelo_ancova
)
ss_modelo <- ss_total -
ss_error
descomposicion <- data.frame(
Componente = c(
"Suma de cuadrados total",
"Suma de cuadrados del modelo",
"Suma de cuadrados del error"
),
Valor = c(
ss_total,
ss_modelo,
ss_error
)
)
kable(
descomposicion,
digits = 3,
caption = "Descomposición de la variabilidad del postest"
)| Componente | Valor |
|---|---|
| Suma de cuadrados total | 10926.768 |
| Suma de cuadrados del modelo | 8260.978 |
| Suma de cuadrados del error | 2665.790 |
Se verifica la identidad:
\[ SS_T=SS_M+SS_E. \]
## SS_total SS_modelo_mas_error
## 10926.77 10926.77
Existe no ortogonalidad cuando los predictores están relacionados y comparten parte de la variabilidad explicada.
En este ejemplo, puede evaluarse si el pretest presenta diferencias entre los métodos.
Si el efecto del método sobre el pretest es significativo, los grupos presentan diferencias iniciales. Por tanto, el método y el pretest no son ortogonales.
Esta falta de ortogonalidad provoca que las sumas de cuadrados Tipo I dependan del orden de entrada de los términos.
Las sumas de cuadrados Tipo I son secuenciales.
Cada término se evalúa después de los términos que aparecen antes en la fórmula.
Se utilizan cuando existe un orden:
modelo_metodo_primero <- lm(
postest ~ metodo + pretest_c,
data = datos
)
tipo1_metodo_primero <- anova(
modelo_metodo_primero
)
tipo1_metodo_primeroEn este modelo, el método se evalúa antes de controlar el pretest.
La suma de cuadrados del método incluye tanto:
modelo_pretest_primero <- lm(
postest ~ pretest_c + metodo,
data = datos
)
tipo1_pretest_primero <- anova(
modelo_pretest_primero
)
tipo1_pretest_primeroEn este segundo modelo, el pretest se introduce primero. La suma de cuadrados del método representa su aporte adicional después de controlar las diferencias iniciales.
comparacion_tipo1 <- data.frame(
Termino = c(
"Pretest",
"Método"
),
Metodo_primero = c(
tipo1_metodo_primero[
"pretest_c",
"Sum Sq"
],
tipo1_metodo_primero[
"metodo",
"Sum Sq"
]
),
Pretest_primero = c(
tipo1_pretest_primero[
"pretest_c",
"Sum Sq"
],
tipo1_pretest_primero[
"metodo",
"Sum Sq"
]
)
)
kable(
comparacion_tipo1,
digits = 3,
caption = "Sumas de cuadrados Tipo I según el orden"
)| Termino | Metodo_primero | Pretest_primero |
|---|---|---|
| Pretest | 2575.203 | 7727.794 |
| Método | 5685.776 | 533.185 |
Los resultados cambian porque el primer predictor recibe la variabilidad que comparte con el segundo predictor.
Sin embargo, la suma total explicada por el modelo no cambia.
sumas_orden1 <- sum(
tipo1_metodo_primero$`Sum Sq`[
rownames(tipo1_metodo_primero) !=
"Residuals"
]
)
sumas_orden2 <- sum(
tipo1_pretest_primero$`Sum Sq`[
rownames(tipo1_pretest_primero) !=
"Residuals"
]
)
c(
metodo_primero = sumas_orden1,
pretest_primero = sumas_orden2
)## metodo_primero pretest_primero
## 8260.978 8260.978
Las sumas de cuadrados Tipo II evalúan cada efecto principal después de controlar los demás efectos principales.
Se utilizan cuando:
La prueba del método responde:
¿El método explica variabilidad adicional en el postest después de controlar el pretest?
La prueba del pretest responde:
¿El pretest explica variabilidad adicional después de controlar el método?
Para evaluar el método se compara un modelo reducido que contiene únicamente el pretest contra el modelo completo.
\[ SS_{\text{método}\mid\text{pretest}} = SSE(\text{modelo reducido}) - SSE(\text{modelo completo}). \]
modelo_reducido_metodo <- lm(
postest ~ pretest_c,
data = datos
)
ss_metodo_manual <- deviance(
modelo_reducido_metodo
) - deviance(
modelo_ancova
)
ss_metodo_manual## [1] 533.1848
Para evaluar el pretest se compara un modelo reducido que contiene únicamente el método contra el modelo completo.
modelo_reducido_pretest <- lm(
postest ~ metodo,
data = datos
)
ss_pretest_manual <- deviance(
modelo_reducido_pretest
) - deviance(
modelo_ancova
)
ss_pretest_manual## [1] 2575.203
Los resultados manuales deben coincidir con la tabla Tipo II.
comparacion_manual <- data.frame(
Termino = c(
"Pretest",
"Método"
),
Calculo_manual = c(
ss_pretest_manual,
ss_metodo_manual
),
Tipo_II = c(
tabla_tipo2[
"pretest_c",
"Sum Sq"
],
tabla_tipo2[
"metodo",
"Sum Sq"
]
)
)
kable(
comparacion_manual,
digits = 4,
caption = "Verificación manual de las sumas de cuadrados Tipo II"
)| Termino | Calculo_manual | Tipo_II |
|---|---|---|
| Pretest | 2575.2028 | 2575.2028 |
| Método | 533.1848 | 533.1848 |
El estadístico \(F\) para el método se calcula como:
\[ F = \frac{MS_{\text{método}}}{MS_E}. \]
gl_metodo <- df.residual(
modelo_reducido_metodo
) - df.residual(
modelo_ancova
)
gl_error <- df.residual(
modelo_ancova
)
ms_metodo <- ss_metodo_manual /
gl_metodo
ms_error <- ss_error /
gl_error
f_metodo <- ms_metodo /
ms_error
p_metodo <- pf(
f_metodo,
df1 = gl_metodo,
df2 = gl_error,
lower.tail = FALSE
)
resultado_f <- data.frame(
Medida = c(
"SS del método",
"gl del método",
"MS del método",
"SS del error",
"gl del error",
"MS del error",
"Estadístico F",
"Valor p"
),
Valor = c(
ss_metodo_manual,
gl_metodo,
ms_metodo,
ss_error,
gl_error,
ms_error,
f_metodo,
p_metodo
)
)
kable(
resultado_f,
digits = 5,
caption = "Cálculo manual del estadístico F"
)| Medida | Valor |
|---|---|
| SS del método | 533.18481 |
| gl del método | 2.00000 |
| MS del método | 266.59240 |
| SS del error | 2665.78987 |
| gl del error | 116.00000 |
| MS del error | 22.98095 |
| Estadístico F | 11.60058 |
| Valor p | 0.00003 |
Las sumas de cuadrados Tipo III evalúan cada término después de controlar todos los demás términos del modelo.
Se utilizan principalmente cuando:
modelo_tipo3 <- lm(
postest ~ pretest_c + metodo,
data = datos
)
tabla_tipo3 <- car::Anova(
modelo_tipo3,
type = 3
)
tabla_tipo3En un modelo sin interacción, las sumas de cuadrados Tipo II y Tipo III suelen coincidir para los efectos principales.
La tabla Tipo III también presenta una prueba para el intercepto. Esta prueba generalmente no constituye la hipótesis principal del ANCOVA.
La utilidad del Tipo III se observa con mayor claridad cuando el modelo contiene una interacción entre el pretest y el método.
modelo_interaccion <- lm(
postest ~ pretest_c * metodo,
data = datos
)
tabla_tipo3_interaccion <- car::Anova(
modelo_interaccion,
type = 3
)
tabla_tipo3_interaccionEn este modelo:
pretest_c representa la relación entre pretest y
postest;metodo compara los métodos cuando
pretest_c = 0;pretest_c:metodo evalúa si la pendiente cambia entre
los métodos.Como el pretest fue centrado, pretest_c = 0 corresponde
a un estudiante con un pretest promedio.
La interacción permite evaluar el supuesto de homogeneidad de pendientes del ANCOVA.
Si la interacción no es significativa, puede mantenerse el modelo sin interacción.
Las sumas de cuadrados Tipo IV se utilizan en diseños factoriales incompletos que contienen celdas vacías.
Una celda vacía ocurre cuando no existen observaciones para alguna combinación de niveles de dos factores.
En los datos simulados, ningún estudiante del método C pertenece a la jornada nocturna.
##
## Diurna Nocturna
## A 15 25
## B 14 21
## C 45 0
La combinación entre el método C y la jornada nocturna constituye una celda vacía.
En estos casos, algunos efectos pueden no ser estimables. Las sumas de cuadrados Tipo IV construyen pruebas para las funciones que sí pueden estimarse.
El Tipo IV:
car::Anova();No debe utilizarse automáticamente como una solución para cualquier diseño con celdas vacías.
La siguiente tabla integra las sumas de cuadrados Tipo I, II y III.
comparacion_sumas <- data.frame(
Termino = c(
"Pretest",
"Método"
),
Tipo_I_metodo_primero = c(
tipo1_metodo_primero[
"pretest_c",
"Sum Sq"
],
tipo1_metodo_primero[
"metodo",
"Sum Sq"
]
),
Tipo_I_pretest_primero = c(
tipo1_pretest_primero[
"pretest_c",
"Sum Sq"
],
tipo1_pretest_primero[
"metodo",
"Sum Sq"
]
),
Tipo_II = c(
tabla_tipo2[
"pretest_c",
"Sum Sq"
],
tabla_tipo2[
"metodo",
"Sum Sq"
]
),
Tipo_III = c(
tabla_tipo3[
"pretest_c",
"Sum Sq"
],
tabla_tipo3[
"metodo",
"Sum Sq"
]
)
)
kable(
comparacion_sumas,
digits = 3,
caption = "Comparación de los tipos de sumas de cuadrados"
)| Termino | Tipo_I_metodo_primero | Tipo_I_pretest_primero | Tipo_II | Tipo_III |
|---|---|---|---|---|
| Pretest | 2575.203 | 7727.794 | 2575.203 | 2575.203 |
| Método | 5685.776 | 533.185 | 533.185 | 533.185 |
La interpretación general es:
| Tipo | ¿Para qué se utiliza? | Característica |
|---|---|---|
| I | Modelos secuenciales o jerárquicos | Depende del orden |
| II | Modelos sin interacción | Ajusta por los demás efectos principales |
| III | Modelos con interacción | Ajusta por todos los términos |
| IV | Diseños con celdas vacías | Evalúa funciones estimables |
La significancia estadística permite evaluar la evidencia contra la hipótesis nula, pero no expresa directamente la magnitud del efecto.
El eta cuadrado parcial del método se calcula como:
\[ \eta_p^2 = \frac{ SS_{\text{método}} }{ SS_{\text{método}}+SS_E }. \]
ss_metodo <- tabla_tipo2[
"metodo",
"Sum Sq"
]
eta_parcial_metodo <- ss_metodo /
(
ss_metodo +
ss_error
)
eta_parcial_metodo## [1] 0.1666737
El eta cuadrado parcial representa la proporción de la variabilidad asociada con el método y el error que corresponde al método, después de controlar el pretest.
tabla_eta <- data.frame(
Efecto = "Método",
Suma_cuadrados = ss_metodo,
Suma_cuadrados_error = ss_error,
Eta_cuadrado_parcial = eta_parcial_metodo
)
kable(
tabla_eta,
digits = 4,
caption = "Tamaño del efecto ajustado del método"
)| Efecto | Suma_cuadrados | Suma_cuadrados_error | Eta_cuadrado_parcial |
|---|---|---|---|
| Método | 533.1848 | 2665.79 | 0.1667 |
Las sumas de cuadrados representan la reducción de la variabilidad residual producida al incorporar términos al modelo.
En diseños no ortogonales, la elección del tipo de suma de cuadrados determina cómo se asigna la variabilidad compartida entre los predictores.
Las sumas de cuadrados Tipo I dependen del orden y son apropiadas cuando existe una secuencia teórica o jerárquica.
Las sumas de cuadrados Tipo II evalúan cada efecto principal después de controlar los demás efectos principales. Por esta razón, suelen ser apropiadas para un ANCOVA sin interacción.
Las sumas de cuadrados Tipo III evalúan cada término condicionado a todos los demás términos y adquieren mayor relevancia en modelos que contienen interacciones.
Las sumas de cuadrados Tipo IV se reservan para diseños incompletos con celdas vacías y requieren estudiar previamente cuáles efectos son estimables.
Para el ejemplo desarrollado, la pregunta principal es:
¿Existen diferencias en el postest entre los métodos después de controlar las diferencias iniciales del pretest?
Cuando no existe una interacción significativa entre el pretest y el método, las sumas de cuadrados Tipo II permiten responder directamente esta pregunta.