Contenido
Introducción
El paquete dlm
: funciones básicas
DLM de primer orden (Modelo de nivel local)
DLM de segundo orden
Ejemplo: AR(1)
Combinación de modelos de espacio de estados
Existe una variedad de literatura y paquetes en R para tratar los modelos de espacio de estados.
Paquetes generales que proporciona estimación máxima verosimilitud, filtro de Kalman y estimación Bayesiana para DLM o modelos de espacio de estados lineal Gaussiano:
La dificultad de que cada referencia usa una notación diferente, pero la estructura del modelo es la misma.
Una buena referencia que resume las diferencias y ventajas de algunos paquetes: State Space Models in R
dlm
para \(t=1,...,n,\) con la condición inicial \(\theta_0 \sim N_p(m_0,C_0)\).
En la práctica, el interéses es estimar el valor de \(\theta_t\) dado los datos observados \(y_{1:s}=\left\lbrace y_1,...,y_s \right\rbrace\).
La estimación de \(\theta_t\) se puede clasificar en 3 situaciones:
dlm
: funciones básicasContenido
Introducción
El paquete dlm
: funciones básicas
DLM de primer orden (Modelo de nivel local)
DLM de segundo orden
Ejemplo: AR(1)
Combinación de modelos de espacio de estados
dlm
: funciones básicasLa ecuación de observaciones:
\[y_{t}=F_t \theta_{t} + v_{t},~~v_t \overset{iid}{\sim} N_m(0,V_t)\]
La ecuación de estados:
\[\theta_{t}=G_t \theta_{t-1} + w_{t},~~w_t \overset{iid}{\sim} N_p(0,W_t)\]
para \(t=1,...,n,\) con la condición inicial \(\theta_0 \sim N_p(m_0,C_0)\).
Parámetro | Argumento de la función |
---|---|
\(F\) | FF |
\(V\) | V |
\(G\) | GG |
\(W\) | W |
\(C_0\) | C0 |
\(m_0\) | m0 |
Nota
La escogencia de \(F_t\) y \(G_t\) depende del usuario al observar la naturaleza de las series observadas.
La especificación del modelo requiere la descripción de las variancias \(V_t\) y \(W_t\). En la práctica, es común suponer que son constantes en el tiempo, i.e. \(V_t=V\) y \(W_t=W\).
Funciones | Modelo |
---|---|
dlm |
DLM genérico |
dlmModARMA |
modelo ARMA |
dlmModPoly |
DLM del polinomio del n-ésimo orden |
dlmReg |
Regresión lineal |
dlmSeas |
factores periódicos, o estacionales |
dlmTrig |
funciones periódicas o trigonométricas |
funciones | Método |
---|---|
dlmFilter |
Filtro de Kalman |
dlmSmooth |
Suavizamiento de Kalman |
dlmForecast |
Predicción |
dlmLL |
Función de verosimilitud |
dlmMLE |
Estimación ML |
Contenido
Introducción
El paquete dlm
: funciones básicas
DLM de primer orden (Modelo de nivel local)
DLM de segundo orden
Ejemplo: AR(1)
Combinación de modelos de espacio de estados
\[\left. \begin{eqnarray} y_t& = & \theta_t +v_t, & ~~~v_t \overset{iid}{\sim}N(0,V_t) \\ \theta_t& = & \theta_{t-1} +w_t, &~~~ w_t \overset{iid}{\sim}N(0,W_t) \\ \end{eqnarray}\right.\]
\(\theta_t\) es escalar y \(F_t=G_t=1\).
La ecuación de estados consiste en una caminata aleatoria y la ecuación de observaciones consiste en la suma del componente de tendencia y un ruido.
Observe que la variancia de las observaciones y de los estados puede variar en el tiempo.
\[\left. \begin{eqnarray} y_t& = & \theta_t +v_t, & v_t \overset{iid}{\sim}N(0,0.8) \\ \theta_t& = & \theta_{t-1} +w_t, & w_t \overset{iid}{\sim}N(0,0.1) \\ \end{eqnarray}\right.\]
dlmModPoly
Mediciones del caudal anual del Nilo en Asuán, Egipto., 1871–1970, en \(10^8 m^3\),
dlm.orden1 <- function(theta) {
dlmModPoly(order = 1, dV = theta[1], dW = theta[2])
}
fit <- dlmMLE(Nile, parm = c(100, 2), dlm.orden1, lower = rep(1e-4, 2))
fit
$par
[1] 15099.787 1468.438
$value
[1] 549.6918
$counts
function gradient
32 32
$convergence
[1] 0
$message
[1] "CONVERGENCE: REL_REDUCTION_OF_F <= FACTR*EPSMCH"
\[\hat{V}=15099, \hat{W}=1468\]
foreNile <- dlmForecast(filterNile, nAhead = 10)
attach(foreNile)
hwidth <- qnorm(0.25, lower = FALSE) * sqrt(unlist(Q))
fore <- cbind(f, as.vector(f) + hwidth %o% c(-1, 1))
rg <- range(c(fore, window(Nile, start = c(1900, 1))))+c(0,300)
plot(fore, type = "o", pch = 16, plot.type = "s", lty = c(1, 3, 3),
ylab = "Nile level", xlab = "", xlim = c(1900, 1980), ylim = rg)
lines(window(Nile, start = c(1900, 1)), type = 'o')
lines(window(smoothNile$s, start = c(1900,1)), lty = 5)
abline(v = mean(c(time(f)[1], tail(time(Nile), 1))),
lty = "dashed", col = "darkgrey")
legend("topleft", lty = c(1, 5, 1, 3), pch = c(1, NA, 16, 16), bty = "n",
legend = c("observed level", "smoothed level", "forecasted level",
"50% probability limits"))
Contenido
Introducción
El paquete dlm
: funciones básicas
DLM de primer orden (Modelo de nivel local)
DLM de segundo orden
Ejemplo: AR(1)
Combinación de modelos de espacio de estados
\[\left. \begin{eqnarray} y_t& = & \theta_{1,t} & & +v_t, & &~~~v_t \overset{iid}{\sim}N(0,V_t) \\ \theta_{1,t}& = & \theta_{1,t-1} +&\theta_{2,t-1} & +w_{1,t}, & & \\ \theta_{2,t}& = & & \theta_{2,t-1} & +w_{2,t}, & & ~~~ \\ \end{eqnarray}\right.\]
donde \(w_t=(w_{1,t},w_{2,t})'\overset{iid}{\sim}N(0,W_t)\)
Este modelo se puede escribir con la fórmula general: \[F_t=(1,0),~~~G_t=\begin{bmatrix}1 & 1\\ 0 & 1 \end{bmatrix}\]
dlm.orden2 <- function(theta) {
dlmModPoly(order = 2, dV = theta[1], dW = c(theta[2],theta[3]))
}
fit2 <- dlmMLE(Nile, parm = c(1,1,1), dlm.orden2, lower = rep(1e-4,1e-4,1e-4))
fit2
$par
[1] 1.058979e+04 5.639765e+03 -3.464080e-07
$value
[1] 557.4118
$counts
function gradient
78 78
$convergence
[1] 0
$message
[1] "CONVERGENCE: REL_REDUCTION_OF_F <= FACTR*EPSMCH"
modNile2 <- dlm.orden2(fit2$par)
filteredNile <- dlmFilter(Nile, mod = modNile2)
resids <- residuals(filteredNile, sd = FALSE)
smoothNile <- dlmSmooth(Nile, modNile2)
theta1 <- dropFirst(smoothNile$s[, 1])
theta2 <- dropFirst(smoothNile$s[, 2])
par(mfrow = c(3, 1), mar = c(2.2, 2.2, 1, 1), cex = 0.8)
plot.ts(Nile, col = "darkgrey", xlab = "", ylab = "", lwd = 2)
lines(theta1, col = "black")
legend("topright", legend = c("Observación", "Estado"),
lwd = c(2, 1), col = c("darkgrey", "black"), bty = "n")
plot.ts(theta2, col = "darkgrey", xlab = "", ylab = "",
lwd = 2)
legend("topright", legend = "Pendiente", lwd = 2, col = "darkgrey",
bty = "n")
plot.ts(resids, ylab = "", xlab = "", col = "darkgrey",
lwd = 2)
abline(h = 0)
legend("topright", legend = "Residuales", lwd = 2, col = "darkgrey",
bty = "n")
Contenido
Introducción
El paquete dlm
: funciones básicas
DLM de primer orden (Modelo de nivel local)
DLM de segundo orden
Ejemplo: AR(1)
Combinación de modelos de espacio de estados
Habíamos visto su representación de espacio de estados:
donde \[\theta_1=Y_1=\sum_{j=0}^{\infty} \phi_1^j w_{1-j}\]
\[E(\theta_t)=E(Y_t)=0 ~\text{, y}~~~\gamma_\theta(h)=\frac{\sigma_w^2 \phi^h}{1-\phi^2}\]
Para las condiciones iniciales, tenemos:
\[E(\theta_0)=0 ~\text{, y}~~~Var(\theta_0)=\gamma_\theta(0)=\frac{\sigma_w^2}{1-\phi^2}.\]
Es decir, \(F=1,, V=0, G=\phi, W=\sigma^2\)
La estimación:
# Estimación
fitAR1 = dlmMLE(y=y,parm=c(0.7,1.0),build=dlm0,hessian=T)
# Estimaciones
(coef = fitAR1$par)
[1] 0.7383927 0.5244622
El error estándar:
dlmForecast
:mod = dlm0(fitAR1$par)
modf = dlmFilter(y,mod)
#pronóstico
pronostico = dlmForecast(modf,nAhead=5,method="plain")
hwidth <- qnorm(0.1, lower = FALSE)*sqrt(unlist(pronostico$Q))
fore <- cbind(pronostico$f, as.vector(pronostico$f)
+ hwidth %o% c(-1, 1))
colnames(fore) <- c("forecast","li","ls")
fore
Time Series:
Start = 251
End = 255
Frequency = 1
forecast li ls
251 -0.26994808 -0.9420735 0.4021773
252 -0.19932769 -1.0348268 0.6361714
253 -0.14718212 -1.0595147 0.7651505
254 -0.10867820 -1.0602926 0.8429362
255 -0.08024719 -1.0526107 0.8921164
Arima
:#Comparación con Arima
mod.ar = Arima(y,order=c(1,0,0),
include.mean=FALSE)
forecast::forecast(mod.ar,h=5)
Point Forecast Lo 80 Hi 80 Lo 95 Hi 95
251 -0.26994825 -0.9434199 0.4035234 -1.299934 0.7600378
252 -0.19932795 -1.0365008 0.6378449 -1.479673 1.0810174
253 -0.14718240 -1.0613428 0.7669780 -1.545270 1.2509053
254 -0.10867848 -1.0621995 0.8448426 -1.566963 1.3496061
255 -0.08024745 -1.0545593 0.8940644 -1.570329 1.4098339
Contenido
Introducción
El paquete dlm
: funciones básicas
DLM de primer orden (Modelo de nivel local)
DLM de segundo orden
Ejemplo: AR(1)
Combinación de modelos de espacio de estados
\[\left. \begin{eqnarray} y_{t}^{(i)}&= & F_t^{(i)} \theta_{t}^{(i)} & + v_{t}^{(i)}, && v_{t}^{(i)}\sim N(0,V^{(i)})\\ \theta_{t}^{(i)}&= & G_t^{(i)} \theta_{t-1}^{(i)} & + w_{t}^{(i)},&& w_{t}^{(i)}\sim N(0,W^{(i)}) \end{eqnarray}\right.\]
para \(t=1,...,n,\) con las condiciones iniciales \(\theta_0^{(i)} \sim N_p(m_0^{(i)},C_0^{(i)})\) para \(i=1,...,k\).
Note que las dimensiones de los estados de cada DLM puede ser diferente. Denote \(p_1,...,p_k\) por las dimensiones de cada DLM.
Se puede especificar varios DLMs (tendencias, ARIMA, estacionalidad, variables exógenas, etc.) y sumarlas de forma independiente para formar un modelo que contempla todas estos componentes.
\[F_t=\left(F_t^{(1)} \mid ... \mid F_t^{(k)} \right),~~~ V_t=\sum_{i=1}^k V_t^{(i)}\] \[G_t=\begin{bmatrix} G_t^{(1)} & & \\ & \ddots & \\ & & G_t^{(k)} \end{bmatrix}~~W_t=\begin{bmatrix} W_t^{(1)} & & \\ & \ddots & \\ & & W_t^{(k)} \end{bmatrix}\] \[m'_t=\left({m_0^{(1)}}' ... {m_0^{(k)}}' \right),~~~ C_t=\begin{bmatrix} C_0^{(1)} & & \\ & \ddots & \\ & & C_0^{(k)} \end{bmatrix}\]
dlmModPoly
y dlmModARMA
dlm1 = function(parm){
dlm = dlmModPoly(1,dV=1e-7,dW=c(0)) +
dlmModARMA(ar=parm[1], ma=NULL, sigma2=parm[2])
# set initial state distribution
dlm$C0[2,2] <- solve(1-parm[1]^2)*parm[2]
return(dlm)
}
# Estimación
fit1 = dlmMLE(y=yt,parm=c(0,0),build=dlm1,hessian=T)
Error in solve.default(1 - parm[1]^2): Lapack routine dgesv: system is exactly singular: U[1,1] = 0
parm_rest = function(parm){
return( c(parm[1],exp(parm[2])) )
}
# Configuración de DLM
dlm1 = function(parm){
parm = parm_rest(parm)
dlm = dlmModPoly(1,dV=1e-7,dW=c(0)) +
dlmModARMA(ar=parm[1], ma=NULL, sigma2=parm[2])
# set initial state distribution
dlm$C0[2,2] <- solve(1-parm[1]^2)*parm[2]
return(dlm)
}
# Estimación
fit1 = dlmMLE(y=yt,parm=c(0,0),build=dlm1,hessian=T)
\[F_t=(1,0,...,0),~~~ G=\begin{bmatrix} -1 & -1 & \dots & -1 & -1\\ 1 & 0 & \dots & 0 & 0\\ 0 & 1 & \dots & 0 & 0\\ \vdots & \vdots & \ddots & 0 & 0\\ 0 & 0 & \dots & 1 & 0 \end{bmatrix}\]
Variacia de las innovaciones de los estados: \(diag(W,...,0)\)