Por lo que veo, los parámetros de los modelos de espacio de estados se tratarán automáticamente como invariantes en el tiempo y no sé cómo especificar una matriz variable en el tiempo en un modelo de espacio de estados mediante statsmodels en Python. He leído el documento, pero todavía no he encontrado la manera.
documento statsmodels: https://www.statsmodels.org/stable/statespace.html
Por ejemplo, para el modelo más sencillo a nivel local
\begin{align*} X_{t+1} &= X_t + V_t \\ Y_t &= X_t + W_t \end{align*}
donde $V$ y $W$ son ruidos blancos. Al estimar este modelo, hay que especificar el estado inicial. Sin embargo, si asumo el estado inicial $X_1$ es una constante desconocida (por tanto, un parámetro) que también debe estimarse, entonces el modelo anterior puede formularse como
\begin{align*} X_{t+1} &= a_t + X_t + V_t \\ Y_t &= X_t + W_t \end{align*}
donde para $j \ge 2$ , $a_j=0$ . Y con esta formulación, puedo establecer inicialmente $X_1 = 0$ y estimar $a_1$ como si fuera la constante desconocida $X_1$ . Entonces $a_t$ es un parámetro variable en el tiempo.
Obsérvese que, en este modelo sencillo, la dificultad mencionada anteriormente puede sortearse formulando como \begin{align*} X_{t+1} &= X_t + V_t \\ Y_t &= b_t + X_t + W_t \end{align*} set $X_1 = 0$ y estimar $b_t$ como parámetro invariable en el tiempo. Pero en general, no puedo hacerlo.
class LocalLevel(sm.tsa.statespace.MLEModel):
def __init__(self, endog):
super().__init__(endog, k_states=1)
self['design', 0, 0] = 1.0
self['transition', 0, 0] = 1.0
self['selection', 0, 0] = 1.0
self.initialize_known([0], [[0]])
# Note the **kwargs argument must be included
def update(self, params, transformed=True, **kwargs):
params = super().update(params, transformed, **kwargs)
self['obs_cov', 0, 0] = params[0]
self['state_cov', 0, 0] = params[1]
self['obs_intercept', 0, 0] = params[2]
@property
def start_params(self):
return [1.0, 1.0, 0]
Me pregunto cómo puedo configurar 'state_intercept' para que sea variable en el tiempo. Debería ser la dimensión k_state * n_obs, pero cuando intenté establecer self['state_intercept'], descubrí que se trataba automáticamente como la dimensión k_state * 1, que es invariable en el tiempo.