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

How to include two observed time series in state space model

我正在使用 "State space modeling: Local Linear Trends" 示例 (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个元素(每个观测方程一个epsilon和两个状态变量对应的chi和zeta值),但它只包括3 个元素(chi、zeta 和一个 epsilon)

你走在正确的轨道上。这里的问题是 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来对参数space施加任何限制。但是,这些函数的版本在您链接到的示例 LocalLinearTrend class 中将继续为上面定义的新参数向量工作,因此在这种情况下您不需要在那里做任何事情。