1 votos

Cómo especificar una matriz variable en el tiempo en un modelo de espacio de estados mediante statsmodels en Python

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.

1voto

masto Puntos 946

La solución es definir la matriz como variable en el tiempo en el constructor:

self['state_intercept'] = np.zeros((self.k_states, self.nobs))

por lo que el código completo sería:

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['state_intercept'] = np.zeros((self.k_states, self.nobs))

        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]

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X