PytensorRepresentation#

class pymc_extras.statespace.core.PytensorRepresentation(k_endog: int, k_states: int, k_posdef: int, design: ndarray | None = None, obs_intercept: ndarray | None = None, obs_cov=None, transition=None, state_intercept=None, selection=None, state_cov=None, initial_state=None, initial_state_cov=None)[source]#

用于保存线性高斯状态空间模型所需的所有对象的核心类

线性状态空间模型的符号表示法取自 [1],而具体实现则改编自 statsmodels 的实现:statsmodels/statsmodels,在 [2] 中描述。

参数:
  • k_endog (int) – 观测状态的数量(在 statsmodels 中称为“内生状态”)

  • k_states (int) – 隐藏状态的数量

  • k_posdef (int) – 具有外生冲击的状态数量;也是选择矩阵 R 的秩。

  • design (ArrayLike, 可选) – 设计矩阵,在 [1] 中表示为 ‘Z’。

  • obs_intercept (ArrayLike, 可选) – 观测方程中的常数向量,在 [1] 中表示为 ‘d’。目前未使用。

  • obs_cov (ArrayLike, 可选) – 观测方程中多元正态误差的协方差矩阵。在 [1] 中表示为 ‘H’。

  • transition (ArrayLike, 可选) – 在时间步之间更新隐藏状态的转移方程。在 [1] 中表示为 ‘T’。

  • state_intercept (ArrayLike, 可选) – 观测方程的常数向量,在 [1] 中表示为 ‘c’。目前未使用。

  • selection (ArrayLike, 可选) – 将冲击与隐藏状态匹配的选择矩阵,在 [1] 中表示为 ‘R’。当 k_posdef = k_states 时,这是单位矩阵。

  • state_cov (ArrayLike, 可选) – 状态方程的协方差矩阵,在 [1] 中表示为 ‘Q’。当没有观测噪声时为零矩阵。

  • initial_state (ArrayLike, 可选) – 允许贝叶斯估计初始状态的实验性设置,在 [1] 中表示为 alpha_0。默认值应可能被移除,以支持闭式扩散初始化。

  • initial_state_cov (ArrayLike, 可选) – 允许贝叶斯估计初始状态的实验性设置,在 [1] 中表示为 P_0。默认值应可能被移除,以支持闭式扩散初始化。

注释

线性状态空间系统由两个方程定义

\[\begin{split}\begin{align} x_t &= A_t x_{t-1} + c_t + R_t \varepsilon_t \tag{1} \\ y_t &= Z_t x_t + d_t + \eta_t \tag{2} \\ \end{align}\end{split}\]

其中 \(\{x_t\}_{t=0}^T\) 是隐藏状态的轨迹,\(\{y_t\}_{t=0}^T\) 是可观测状态的轨迹。方程 1 被称为“状态转移方程”,它描述了系统如何随时间演变。方程 2 是“观测方程”,它将潜在状态过程映射到观测数据。当创新 \(\varepsilon_t\) 和测量误差 \(\eta_t\) 服从正态分布时,系统是高斯的。该定义通过指定这些分布以及初始状态分布来完成

\[\begin{split}\begin{align} \varepsilon_t &\sim N(0, Q_t) \tag{3} \\ \eta_t &\sim N(0, H_t) \tag{4} \\ x_0 &\sim N(\bar{x}_0, P_0) \tag{5} \end{align}\end{split}\]

构成方程 1 至 5 的 9 个矩阵汇总在下表中。我们称 \(N\) 为观测次数,\(m\) 为隐藏状态数,\(p\) 为观测状态数,\(r\) 为创新数。

名称

符号

形状

初始隐藏状态均值

\(x_0\)

\(m \times 1\)

初始隐藏状态协方差

\(P_0\)

\(m \times m\)

隐藏状态向量截距

\(c_t\)

\(m \times 1\)

观测状态向量截距

\(d_t\)

\(p \times 1\)

转移矩阵

\(T_t\)

\(m \times m\)

设计矩阵

\(Z_t\)

\(p \times m\)

选择矩阵

\(R_t\)

\(m \times r\)

观测噪声协方差

\(H_t\)

\(p \times p\)

隐藏状态创新协方差

\(Q_t\)

\(r \times r\)

上面列出的形状是核心形状,但在一般情况下,所有这些矩阵(除了 \(x_0\)\(P_0\))都可以是时变的。在这种情况下,可以添加形状为 \(n\) 的时间维度,等于观测次数。

警告

时间维度在卡尔曼滤波期间用作批次维度,因此必须始终最左边的维度。

此类别的目的是存储这些矩阵,并允许用户轻松地索引它们。矩阵存储为 pytensor TensorVariables,形状已知。形状始终可以通过 .type.shape 方法访问,该方法永远不应返回 None。在首先按所需数组的名称进行索引后,可以通过正常的 numpy 数组切片访问矩阵。时间维度存储在最左侧,并且会自动切片掉,除非用户明确请求。有关详细信息,请参见示例。

示例

from pymc_extras.statespace.core.representation import PytensorRepresentation
ssm = PytensorRepresentation(k_endog=1, k_states=3, k_posdef=1)

# Access matrices by their names
print(ssm['transition'].type.shape)
>>> (3, 3)

# Slice a matrices
print(ssm['observation_cov', 0, 0].eval())
>>> 0.0

# Set elements in a slice of a matrix
ssm['design', 0, 0] = 1
print(ssm['design'].eval())
>>> np.array([[1, 0, 0]])

# Setting an entire matrix is also permitted. If you set a time dimension, it must be the first dimension, and
# the "core" dimensions must agree with those set when the ssm object was instantiated.
ssm['obs_intercept'] = np.arange(10).reshape(10, 1) # 10 timesteps
print(ssm['obs_intercept'].eval())
>>> np.array([[1.], [2.], [3.], [4.], [5.], [6.], [7.], [8.], [9.]])

参考文献

__init__(k_endog: int, k_states: int, k_posdef: int, design: ndarray | None = None, obs_intercept: ndarray | None = None, obs_cov=None, transition=None, state_intercept=None, selection=None, state_cov=None, initial_state=None, initial_state_cov=None) None[source]#

方法

__init__(k_endog, k_states, k_posdef[, ...])

copy()

属性

k_endog

k_states

k_posdef

shapes

design

obs_intercept

obs_cov

transition

state_intercept

selection

state_cov

initial_state

initial_state_cov