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_names
或k_endog
中的一个。k_endog (int, optional) –
要建模的内生状态的数量。
必须指定
endog_names
或k_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 长度的字符串列表,与模型的隐藏状态相关联