BayesianVARMAX#

class pymc_extras.statespace.models.BayesianVARMAX(order: tuple[int, int], endog_names: list[str] | None = None, k_endog: int | None = None, stationary_initialization">: bool = False, filter_type: str = 'standard', measurement_error">: bool = False, verbose=True)[source]#

带外生回归量的向量自回归移动平均模型

参数:
  • order (tuple of (int, int)) – 模型中包含的自回归 (AR) 和移动平均 (MA) 项的数量。包括直到指定阶数的所有项。对于限制模型,直接在先验中设置零。

  • endog_names (list of str, optional) –

    被建模的内生变量的名称。用于生成状态和冲击坐标的名称。如果为 None,则状态名称将仅编号。

    必须指定 endog_namesk_endog 中的一个。

  • k_endog (int, optional) –

    要建模的内生状态的数量。

    必须指定 endog_namesk_endog 中的一个。

  • stationary_initialization (bool, default False) –

    如果为 true,则初始状态和初始状态协方差将不会分配先验。相反,将使用它们的稳态值。如果为 False,则用户负责设置初始状态和初始协方差的先验。

    ..warning :: 此选项对 AR 和 MA 参数的先验非常敏感。如果模型动态

    对于给定的样本不是平稳的,则抽样将失败,并显示“协方差不是正半定矩阵”错误。

  • filter_type (str, default "standard") – 要使用的卡尔曼滤波器的类型。选项为“standard”、“single”、“univariate”、“steady_state”和“cholesky”。有关更多详细信息,请参阅卡尔曼滤波器的文档。

  • state_structure (str, default "fast") –

    如何表示状态空间系统。当为“interpretable”时,状态向量的每个元素都将具有精确的含义,表示为滞后数据、创新或滞后创新。这以更大的状态向量为代价,这可能会损害性能。

    当为“fast”时,状态被组合以最小化状态向量的维度,但滞后和创新因此混合在一起。只有第一个状态(建模的时间序列)在这种情况下才具有明显的解释。

  • measurement_error (bool, default True) – 如果为 true,则向模型添加测量误差项。

  • verbose (bool, default True) – 如果为 true,则将在终端上记录一条消息,解释变量名称、维度和支持。

注释

VARMA 模型是 SARIMAX 模型的多变量扩展。给定一组时间序列 \(\{x_t\}_{t=0}^T\),其中 \(x_t = \begin{bmatrix} x_{1,t} & x_{2,t} & \cdots & x_{k,t} \end{bmatrix}^T\),VARMA 将每个序列建模为所有序列历史的函数。具体来说,将 AR-MA 阶数表示为 (p, q),VARMA 可以写成

\[x_t = A_1 x_{t-1} + A_2 x_{t-2} + \cdots + A_p x_{t-p} + B_1 \varepsilon_{t-1} + \cdots + B_q \varepsilon_{t-q} + \varepsilon_t\]

其中 \(\varepsilon_t = \begin{bmatrix} \varepsilon_{1,t} & \varepsilon_{2,t} & \cdots & \varepsilon_{k,t}\end{bmatrix}^T \sim N(0, \Sigma)\) 是 i.i.d 随机创新或冲击向量,它们驱动数据中的时间变化。矩阵 \(A_i, B_i\)\(k \times k\) 系数矩阵

\[\begin{split}A_i = \begin{bmatrix} \rho_{1,i,1} & \rho_{1,i,2} & \cdots & \rho_{1,i,k} \\ \rho_{2,i,1} & \rho_{2,i,2} & \cdots & \rho_{2,i,k} \\ \vdots & \vdots & \cdots & \vdots \\ \rho{k,i,1} & \rho_{k,i,2} & \cdots & rho_{k,i,k} \end{bmatrix}\end{split}\]

在内部,不使用此表示形式。相反,向量 \(x_t, x_{t-1}, \cdots, x_{t-p}, \varepsilon_{t-1}, \cdots, \varepsilon_{t-q}\) 被连接成长度为 k * (p+q) 的单个列向量,而系数矩阵也同样被连接成单个系数矩阵 \(T\)

随着 VARMA 系统的维度增加——无论是由于分析中包含大量时间序列,还是因为阶数很大——抽样平稳矩阵 \(T\) 的概率变为零。这对应用工作有两个影响。首先,非平稳系统将表现出爆炸性行为,可能导致脉冲响应函数和长期预测变得无用。其次,不可能进行平稳初始化。平稳初始化显着加快了抽样速度,应尽可能优先使用。

示例

以下代码片段估计 VARMA(1, 1)

import pymc_extras.statespace as pmss
import pymc as pm

# Create VAR Statespace Model
bvar_mod = pmss.BayesianVARMAX(endog_names=data.columns, order=(2, 0),
                               stationary_initialization=False, measurement_error=False,
                               filter_type="standard", verbose=True)

# Unpack dims and coords
x0_dims, P0_dims, state_cov_dims, ar_dims = bvar_mod.param_dims.values()
coords = bvar_mod.coords

# Estimate PyMC model
with pm.Model(coords=coords) as var_mod:
    x0 = pm.Normal("x0", dims=x0_dims)
    P0_diag = pm.Gamma("P0_diag", alpha=2, beta=1, size=data.shape[1] * 2, dims=P0_dims[0])
    P0 = pm.Deterministic("P0", pt.diag(P0_diag), dims=P0_dims)

    state_chol, _, _ = pm.LKJCholeskyCov(
        "state_chol", eta=1, n=bvar_mod.k_posdef, sd_dist=pm.Exponential.dist(lam=1)
    )

    ar_params = pm.Normal("ar_params", mu=0, sigma=1, dims=ar_dims)
    state_cov = pm.Deterministic("state_cov", state_chol @ state_chol.T, dims=state_cov_dims)

    bvar_mod.build_statespace_graph(data, mode="JAX")
    idata = pm.sample(nuts_sampler="numpyro")
__init__(order: tuple[int, int], endog_names: list[str] | None = None, k_endog: int | None = None, stationary_initialization: bool = False, filter_type: str = 'standard', measurement_error: bool = False, verbose=True)[source]#

方法

__init__(order[, endog_names, k_endog, ...])

add_default_priors()

将默认先验添加到活动的 PyMC 模型上下文中

build_statespace_graph(data[, ...])

给定参数向量 theta,构造描述状态空间模型和相关数据对数概率的完整计算图。

forecast(idata[, start, periods, end, ...])

生成未来状态空间模型轨迹的预测。

impulse_response_function(idata[, n_steps, ...])

从状态空间模型动态生成脉冲响应函数 (IRF)。

make_and_register_data(name, shape[, dtype])

辅助函数,用于创建 pytensor 符号变量并在 _name_to_data 字典中注册它

make_and_register_variable(name[, shape, dtype])

辅助函数,用于创建 pytensor 符号变量并在 _name_to_variable 字典中注册它

make_symbolic_graph()

make_symbolic_graph 函数的目的是向用户隐藏繁琐的参数分配。

sample_conditional_posterior(idata[, ...])

从条件后验分布中抽样;也就是说,给定来自后验分布的参数抽样,计算卡尔曼滤波轨迹。

sample_conditional_prior(idata[, random_seed])

从条件先验分布中抽样;也就是说,给定来自先验分布的参数抽样,计算卡尔曼滤波轨迹。

sample_statespace_matrices(idata, matrix_names)

从提供的 idata 中抽取请求的状态空间矩阵的样本

sample_unconditional_posterior(idata[, ...])

使用模型参数后验分布的随机样本,根据状态空间动力学绘制无条件样本轨迹。

sample_unconditional_prior(idata[, steps, ...])

使用模型参数先验分布的随机样本,根据状态空间动力学绘制无条件样本轨迹。

unpack_statespace()

辅助函数,用于快速获取标准顺序的所有状态空间矩阵。

属性

coords

PyMC 模型坐标

data_info

关于需要在 PyMC 模型块中声明的数据变量的信息。

data_names

模型预期的数据变量的名称。

default_priors

模型参数名称和可调用函数的字典,用于构建模型的默认先验

observed_states

一个 k_endog 长度的字符串列表,与模型的观测状态相关联

param_dims

每个模型参数的命名维度的字典

param_info

声明先验所需的参数信息

param_names

模型参数的名称

shock_names

一个 k_posdef 长度的字符串列表,与模型的冲击过程相关联

state_names

一个 k_states 长度的字符串列表,与模型的隐藏状态相关联