如何在状态空间模型中包括两个观察到的时间序列

时间:2019-01-03 00:28:59

标签: python statsmodels

我正在使用“状态空间建模:局部线性趋势”示例(https://www.statsmodels.org/stable/examples/notebooks/generated/statespace_local_linear_trend.html)。我正在尝试修改代码以使用两个观测到的时间序列(即两个观测方程)。

我已经修改了设计矩阵(在 init 方法中)和'obs_cov'(在update方法中)以说明两个观察到的时间序列,但是结果仅估计了一个ε

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个元素(每个观测方程一个epsilon以及与两个状态变量相对应的chi和zeta值),但是它仅包含3个元素(chi ,zeta和单个epsilon)

1 个答案:

答案 0 :(得分:0)

您在正确的轨道上。这里的问题是params是一个参数数组,而params[0]是第一个参数。因此,这些行:

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

将观察协方差矩阵的两个对角元素设置为相同的值。

您想添加一个新参数,方法是将新参数添加到param_namesstart_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_paramsuntransform_params以对参数空间施加任何限制。但是,示例{{1 }}链接到的类将继续适用于如上定义的新参数向量,因此在这种情况下,您无需在其中做任何事情。