Una forma natural de hacerlo consiste en utilizar la representación en espacio de estados del filtro HP y estimar los parámetros mediante máxima verosimilitud con el filtro de Kalman.
La siguiente función estima el parámetro implícito del filtro HP utilizando el paquete KFAS.
y <- as.numeric(y)
model <- SSModel(
y ~ SSMtrend(degree = 2, Q = list(0, NA)),
H = NA
)
fit <- fitSSM(model, inits = c(log(var(y)), log(var(y))),
method = "BFGS")
model_fit <- fit$model
sigma_eta <- model_fit$Q[2, 2, 1] # pendiente (tendencia)
sigma_c <- model_fit$H[1, 1, 1] # ciclo (irregular)
lambda_hat <- sigma_c / sigma_eta
return(list(
lambda = lambda_hat,
sigma_cycle = sigma_c,
sigma_trend = sigma_eta,
model = model_fit
))
}
.
- Kalman smoother: estimación usando toda la muestra.
y ~ SSMtrend(degree = 2, Q = list(0, NA)),
H = NA
)
La varianza del error de observación debe estimarse mediante máxima verosimilitud.
H = NA
Estimación por máxima verosimilitud. La función fitSSM estima los parámetros desconocidos del modelo utilizando máxima verosimilitud (se estima varianza del ciclo y varianza de la innovación de la tendencia).
method = "BFGS")
-
inits:
valores iniciales para los parámetros
-
method
= "BFGS": algoritmo de optimización cuasi-Newton
sigma_eta <- model_fit$Q[2, 2, 1] # pendiente (tendencia)
sigma_c <- model_fit$H[1, 1, 1] # ciclo (irregular)
El filtro HP puede interpretarse como un modelo estructural en el que el parámetro de suavizamiento es:
lambda_hat <- sigma_c / sigma_eta
Uso de la función:
Una vez definida la función estimate_hp_lambda(), el primer paso consiste en aplicarla a la serie ajustada estacionalmente.
hp_ml <- estimate_hp_lambda(pib_sa)
El parámetro estimado puede consultarse con:
hp_ml$lambda
Este
valor representa el parámetro de suavizamiento implícito en los datos, en lugar
de imponer el valor estándar .
Una vez estimado el modelo, el siguiente paso es aplicar el filtro y suavizador de Kalman para recuperar los estados no observados del modelo (nivel y pendiente de la tendencia).
Recuperación de la tendencia estimada
trend_hp_mle <- smoothed$alphahat[, "level"]