Modelo autorregresivo de media móvil (ARMA)
El modelo ARMA(\(p,q\)) combina \(p\) términos autorregresivos y \(q\) términos de media móvil en un único marco. Es más parsimonioso que usar un modelo AR o MA puro por separado: muchos procesos que requieren un AR o MA de orden elevado pueden representarse exacta o aproximadamente mediante un ARMA de orden bajo. Solo se aplica a series estacionarias.
Definición
\[y_t = \phi_1 y_{t-1} + \cdots + \phi_p y_{t-p} + \varepsilon_t + \theta_1 \varepsilon_{t-1} + \cdots + \theta_q \varepsilon_{t-q}\]
En notación con operador de retardo:
\[\Phi(L)\,y_t = \Theta(L)\,\varepsilon_t\]
\[\Phi(L) = 1 - \phi_1 L - \cdots - \phi_p L^p, \qquad \Theta(L) = 1 + \theta_1 L + \cdots + \theta_q L^q\]
El polinomio AR \(\Phi(L)\) actúa sobre \(y_t\); el polinomio MA \(\Theta(L)\) actúa sobre \(\varepsilon_t\).
Estacionariedad e invertibilidad
Un ARMA(\(p,q\)) es:
- Estacionario si todas las raíces de \(\Phi(z) = 0\) están fuera del círculo unitario (misma condición que el AR(\(p\)) puro).
- Invertible si todas las raíces de \(\Theta(z) = 0\) están fuera del círculo unitario (misma condición que el MA(\(q\)) puro).
- Identificable: no deben existir raíces comunes entre \(\Phi(z)\) y \(\Theta(z)\) (sin cancelaciones). Si una raíz es compartida, el orden efectivo es menor y el modelo está sobreparametrizado.
⚠️ Cancelación de factores comunes: la trampa de la redundancia paramétrica
Si \(\Phi(z)\) y \(\Theta(z)\) comparten una raíz común, el modelo verdadero es de orden inferior. Por ejemplo, ARMA(2,1) con \(\phi_1 = 0{,}9\), \(\phi_2 = -0{,}2\), \(\theta_1 = 0{,}4\): si \(z = 0{,}5\) es raíz de ambos polinomios, el modelo se reduce en realidad a ARMA(1,0). Ajustar el modelo sobreparametrizado produce errores estándar grandes e inestabilidad.
Síntoma: si los coeficientes \(\phi\) y \(\theta\) ajustados son de magnitud similar con signos opuestos en el mismo retardo, sospecha de cancelación. Compruébalo calculando las raíces de ambos polinomios.
Por qué ARMA es más parsimonioso
Por el teorema de descomposición de Wold, cualquier proceso estacionario puede representarse como MA(\(\infty\)). Un ARMA(\(p,q\)) proporciona una aproximación racional usando solo \(p+q\) parámetros en lugar de infinitos.
Un ejemplo clásico: la representación MA(\(\infty\)) de un AR(1) es:
\[y_t = \varepsilon_t + \phi\varepsilon_{t-1} + \phi^2\varepsilon_{t-2} + \cdots\]
que requiere infinitos parámetros MA. El ARMA(1,0) captura esto con un único parámetro \(\phi\).
A la inversa, algunos procesos que parecen AR o MA de orden elevado al examinar la ACF/PACF pueden representarse exactamente mediante un ARMA de orden bajo. Esta es la motivación principal para usar ARMA frente a AR o MA puros.

Tanto la ACF como la PACF se atenúan gradualmente, confirmando la estructura ARMA. Ninguna se corta bruscamente, razón por la que identificar solo AR o MA requeriría órdenes elevados.
Selección del orden: AIC y BIC
Para ARMA(\(p,q\)), la identificación por ACF/PACF es menos clara que para AR o MA puros. El enfoque estándar consiste en ajustar varios modelos candidatos y comparar por:
\[\text{AIC} = -2\log\hat{L} + 2(p+q+1), \qquad \text{BIC} = -2\log\hat{L} + \log(T)(p+q+1)\]

El mapa de calor muestra el AIC en una cuadrícula de órdenes AR y MA. Un AIC menor (azul más oscuro) indica mejor ajuste penalizado por complejidad. El borde rojo marca el mejor modelo. Los modelos de orden alto en la esquina superior derecha muestran peor AIC a pesar de tener más parámetros.
Ejemplo: ARMA(1,1) para ventas mensuales
Los datos de ventas mensuales suelen mostrar tanto persistencia (componente AR) como corrección tras errores de predicción (componente MA). Un ARMA(1,1) captura ambos con solo dos parámetros.

La ACF de los residuos no muestra picos significativos: el ARMA(1,1) ha capturado la estructura de autocorrelación. Confirma con el test de Ljung-Box: Box.test(residuals(fit), lag = 20, type = "Ljung-Box", fitdf = 2).
💡 Ajustar modelos ARMA en R
# Ajustar ARMA(1,1)
fit <- arima(y, order = c(1, 0, 1))
summary(fit)
# Selección automática por AIC
library(forecast)
auto.arima(y, d = 0, max.p = 4, max.q = 4, stationary = TRUE)
# Verificar residuos
checkresiduals(fit) # representa residuos, ACF y p-valor de Ljung-Box