在 statsmodels 中使用卡尔曼滤波器时忽略 state_cov
Posted
技术标签:
【中文标题】在 statsmodels 中使用卡尔曼滤波器时忽略 state_cov【英文标题】:state_cov is being ignored when using the Kalman filter in statsmodels 【发布时间】:2021-08-27 01:08:00 【问题描述】:我正在尝试创建一个从 statsmodels.tsa.statespace.MLEModel(下面的代码)派生的仿射期限结构模型,该模型使用最小二乘法进行初始化。
'''
class affine_term_structure(sm.tsa.statespace.MLEModel):
def __init__(self, yields, tau, k_states=3, **kwargs):
# Initialize the statespace
super(affine_term_structure, self).__init__(yields, k_states=k_states, **kwargs)
self.initialize_known(np.zeros(self.k_states), np.eye(self.k_states) * 10000)
def update(self, params, **kwargs):
params = super(dynamic_nelson_siegel, self).update(params, **kwargs)
# Extract the parameters
Phi = np.reshape(params[:9], (3, 3))
k = np.array(params[9:12])
Sx = np.zeros((3, 3))
Sx[np.tril_indices(3)] = params[12:18]
lmbd = params[18]
sy = params[-1]
b = self.nss(self.tau, lmbd)
self['transition'] = Phi # transition matrix
self['state_intercept'] = k # transition offset
self['state_cov'] = Sx @ Sx.T # transition covariance. 3x3 SPD matrix
self['design'] = b # design matrix
# self['obs_intercept'] = 0 # observation intercept
self['obs_cov'] = sy * sy * np.eye(self.k_endog) # observation covariance
'''
但是,我注意到在运行过滤器/平滑器时,状态被过度平滑了。挖掘过滤结果,似乎 state_cov 没有用于预测步骤。
例如
self.predicted_state_cov[:,:,1]
匹配
self.transition[:,:,0] @ self.filtered_state_cov[:,:,0] @ self.transition[:,:,0].T
虽然我希望它等于
self.transition[:,:,0] @ self.filtered_state_cov[:,:,0] @ self.transition[:,:,0].T + self.state_cov[:,:,0]
为了良好的顺序,请注意所有参数矩阵都是时间不变的。
我不确定我在这里缺少什么,任何帮助将不胜感激。
谢谢
【问题讨论】:
【参考方案1】:在 Statsmodels 中,状态方程为:
x(t+1) = T x(t) + R eta(t+1)
其中 eta(t+1) ~ N(0, Q)
当你设置state_cov
时,你设置了Q,但你还需要设置R,即selection
。
例如,如果您希望状态方程为:
x(t+1) = T x(t) + eta(t+1)
然后你会做这样的事情:
self['selection'] = np.eye(3)
R 不是每个状态空间模型中的恒等式,它甚至不能总是被初始化为恒等矩阵,因为 x(t) 的维度和 eta(t) 的维度可以与众不同。这就是为什么 R 不会自动初始化为单位矩阵的原因。
【讨论】:
非常感谢乍得。我虽然错过了一些明显的东西,但我显然是。再次感谢您的快速回复。 没问题。这绝对是一个不幸的“陷阱”。以上是关于在 statsmodels 中使用卡尔曼滤波器时忽略 state_cov的主要内容,如果未能解决你的问题,请参考以下文章