1 Introducción

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:

  • sumas de cuadrados Tipo I;
  • sumas de cuadrados Tipo II;
  • sumas de cuadrados Tipo III;
  • sumas de cuadrados Tipo IV;
  • cálculo manual mediante comparación de modelos;
  • tamaño del efecto ajustado.

2 Paquetes utilizados

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.

# Guardar la configuración original
contrastes_originales <- options("contrasts")

# Establecer contrastes de suma a cero
options(
  contrasts = c(
    "contr.sum",
    "contr.poly"
  )
)

3 Creación del conjunto de datos

Se simulará un estudio educativo con tres métodos de enseñanza:

  • método A;
  • método B;
  • método C.

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)

4 Descripción de los 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"
)
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.

5 Exploración gráfica

5.1 Distribución del pretest

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.

5.2 Relación entre pretest y postest

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()

6 Modelo ANCOVA

El modelo ANCOVA sin interacción se expresa como:

\[ Y_{ij} = \beta_0 + \beta_1X_{ij} + \tau_i + \varepsilon_{ij}, \]

donde:

  • \(Y_{ij}\) es el postest;
  • \(X_{ij}\) es el pretest centrado;
  • \(\tau_i\) representa el efecto del método;
  • \(\varepsilon_{ij}\) representa el error aleatorio.
modelo_ancova <- lm(
  postest ~ pretest_c + metodo,
  data = datos
)

summary(modelo_ancova)
## 
## 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.

7 Descomposición general de la variabilidad

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"
)
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. \]

c(
  SS_total = ss_total,
  SS_modelo_mas_error = ss_modelo + ss_error
)
##            SS_total SS_modelo_mas_error 
##            10926.77            10926.77

8 No ortogonalidad

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.

modelo_pretest <- lm(
  pretest ~ metodo,
  data = datos
)

anova(modelo_pretest)

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.

9 Sumas de cuadrados Tipo I

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:

  • teórico;
  • temporal;
  • jerárquico;
  • metodológico.

9.1 Método ingresado primero

modelo_metodo_primero <- lm(
  postest ~ metodo + pretest_c,
  data = datos
)

tipo1_metodo_primero <- anova(
  modelo_metodo_primero
)

tipo1_metodo_primero

En este modelo, el método se evalúa antes de controlar el pretest.

La suma de cuadrados del método incluye tanto:

  • la variabilidad propia del método;
  • parte de la variabilidad que comparte con el pretest.

9.2 Pretest ingresado primero

modelo_pretest_primero <- lm(
  postest ~ pretest_c + metodo,
  data = datos
)

tipo1_pretest_primero <- anova(
  modelo_pretest_primero
)

tipo1_pretest_primero

En 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.

9.3 Comparación del orden

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"
)
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

10 Sumas de cuadrados Tipo II

Las sumas de cuadrados Tipo II evalúan cada efecto principal después de controlar los demás efectos principales.

Se utilizan cuando:

  • el modelo no contiene interacciones;
  • interesa evaluar el aporte independiente de cada predictor;
  • no se desea que el resultado dependa del orden de la fórmula.
tabla_tipo2 <- car::Anova(
  modelo_ancova,
  type = 2
)

tabla_tipo2

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?

10.1 Cálculo manual del Tipo II

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"
)
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

10.2 Cálculo manual del estadístico F

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"
)
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

11 Sumas de cuadrados Tipo III

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:

  • el modelo contiene interacciones;
  • se desea evaluar cada término condicionado al modelo completo;
  • el diseño es desbalanceado.
modelo_tipo3 <- lm(
  postest ~ pretest_c + metodo,
  data = datos
)

tabla_tipo3 <- car::Anova(
  modelo_tipo3,
  type = 3
)

tabla_tipo3

En 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.

12 Tipo III con interacción

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_interaccion

En 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.

13 Sumas de cuadrados Tipo IV

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.

tabla_celdas <- table(
  datos$metodo,
  datos$jornada
)

tabla_celdas
##    
##     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:

  • no se utiliza habitualmente en un ANCOVA simple;
  • no está implementado directamente en car::Anova();
  • puede depender de la parametrización utilizada;
  • requiere examinar cuidadosamente qué efectos son estimables.

No debe utilizarse automáticamente como una solución para cualquier diseño con celdas vacías.

14 Comparación general

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"
)
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

15 Tamaño del efecto ajustado

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"
)
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

16 Conclusiones

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.

17 Restauración de los contrastes

Finalmente, se restaura la configuración original de contrastes de R.

options(
  contrasts = contrastes_originales$contrasts
)