Как включить два наблюдаемых временных ряда в модель пространства состояний - PullRequest
0 голосов
/ 03 января 2019

Я работаю с примером "Моделирование пространства состояний: локальные линейные тренды" (https://www.statsmodels.org/stable/examples/notebooks/generated/statespace_local_linear_trend.html). Я пытаюсь изменить код для работы с двумя наблюдаемыми временными рядами (то есть с двумя уравнениями наблюдения).

Я изменил матрицу проектирования (в методе init ) и obs_cov (в методе обновления) для учета двух наблюдаемых временных рядов, но результаты оценивают только одинepsilon.

class LocalLinearTrend(sm.tsa.statespace.MLEModel):
    def __init__(self, endog):
        .
        .
        .
        # Initialize the matrices
        self.ssm['design'] = np.array([[1, 0],
                                  [1, 0]])      # <--- added this
        .
        .
        .


    def update(self, params, *args, **kwargs):
        .
        .
        .
        self.ssm['obs_cov', 0, 0] = params[0]
        self.ssm['obs_cov', 1, 1] = params[0]      # <--- added this
        .
        .
        .

Я ожидаю, что параметры дисперсии результата (в переменной «params») будут включать 4 элемента (один эпсилон для каждого уравнения наблюдения и значения chi и zeta, соответствующие двум переменным состояния),но включает только 3 элемента (чи, дзета и один эпсилон)

1 Ответ

0 голосов
/ 04 января 2019

Вы на правильном пути. Проблема в том, что params - это массив параметров, а params[0] относится к первому параметру. По этой причине строки:

self.ssm['obs_cov', 0, 0] = params[0]
self.ssm['obs_cov', 1, 1] = params[0]

установить оба диагональных элемента ковариационной матрицы наблюдения на одно и то же значение.

Вы хотите добавить новый параметр, который вы делаете, добавляя новый параметр в свойства * param_names и start_params. Например, вы хотите что-то вроде:

@property
def param_names(self):
    return ['sigma2.measurement.v1', 'sigma2.measurement.v2', 'sigma2.level', 'sigma2.trend']

@property
def start_params(self):
    std = np.std(self.endog, axis=0)
    return np.r_[std, 1., 1.]

Тогда в вашем методе update вы бы хотели что-то вроде:

def update(self, params, **kwargs):
    params = super(LocalLinearTrend, self).update(params, **kwargs)

    # Observation covariance
    self.ssm['obs_cov',0,0] = params[0]
    self.ssm['obs_cov',1,1] = params[1]

    # State covariance
    self.ssm[self._state_cov_idx] = params[2:]

(Примечание: при добавлении новых параметров вы, как правило, также хотите настроить transform_params и untransform_params для применения любых ограничений на пространство параметров. Однако версии этих функций в примере класса LocalLinearTrend, который вы связали to будет продолжать работать для нового вектора параметров, определенного как выше, поэтому в этом случае вам не нужно ничего делать там).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...