我正在使用“状态空间建模:局部线性趋势”示例(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)
答案 0 :(得分:0)
您在正确的轨道上。这里的问题是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
以对参数空间施加任何限制。但是,示例{{1 }}链接到的类将继续适用于如上定义的新参数向量,因此在这种情况下,您无需在其中做任何事情。