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