statsmodels.tsa.statespace.dynamic_factor_mq.DynamicFactorMQ

class statsmodels.tsa.statespace.dynamic_factor_mq.DynamicFactorMQ(endog, k_endog_monthly=None, factors=1, factor_orders=1, factor_multiplicities=None, idiosyncratic_ar1=True, standardize=True, endog_quarterly=None, init_t0=False, obs_cov_diag=False, **kwargs)[source]

使用EM算法的动态因子模型;适用于月度/季度数据。

Bańbura 和 Modugno (2014) 的动态因子模型 ([1]) 以及 Bańbura、Giannone 和 Reichlin (2011) 的实现 ([2])。使用 EM 算法进行参数拟合,因此可以容纳大量的左侧变量。规范可以包括任何因子块的集合,包括不同的因子自回归阶数,并且可以包括特殊扰动的 AR(1) 过程。可以按照 Mariano 和 Murasawa (2011) 的方式合并月度/季度混合频率数据 ([4])。该模型的一个特例是 Bok 等人的 Nowcasting 模型 (2017) ([3])。此外,该模型可用于计算与更新数据发布相关的新闻。

Parameters:
endogarray_like

观察到的时间序列过程 \(y\)。有关如何使用月度/季度混合频率数据设置模型的详细信息,请参阅“注释”部分。

k_endog_monthlyint, optional

如果在指定月度/季度混合频率模型时,提供的endog数据集中包含月度和季度数据,则应使用此变量来指示有多少变量是月度的。请注意,当使用k_endog_monthly参数时,endog中的月度变量列应首先排序,季度变量列应随后排序。有关如何设置月度/季度混合频率数据的模型的详细信息,请参阅“注释”部分。

factorsint, list, or dict, optional

整数表示(全局)因子的数量,一个包含(全局)因子名称的列表,或者一个包含以下内容的字典:

  • keys : 内生变量的名称

  • values : 因子名称的列表。

如果这是一个整数,那么因子名称将是0, 1, …。默认是一个加载在所有变量上的单一因子。请注意,指定的因子数量不能超过月度变量的数量。

factor_ordersint or dict, optional

整数,描述控制所有因子块动态的向量自回归(VAR)的顺序,或包含以下内容的字典:

  • keys : 因子名称或块中因子名称的元组

  • values : 整数,描述该因子块的VAR阶数

如果是一个字典,这定义了状态向量中因子块的顺序。否则,因子的顺序是根据加载在更多变量上的因子优先(然后按字母顺序排列,以打破平局)。

factor_multiplicitiesint or dict, optional

这个参数提供了一种便捷的方式来指定多个在变量上具有相同负载的因子。例如,可能需要两个“全局”因子(即在所有变量上负载的因子),它们根据VAR共同演化。可以在factors参数中指定两个全局因子,并在factor_orders参数中指定它们在同一个块中,但更简单的方法是在factors参数中指定一个全局因子,并在factor_orders参数中设置其顺序,然后将因子多重性设置为2。

此参数必须是一个整数,描述所有因子的重数,或是一个字典,包含:

  • 键:因子名称

  • values : 整数,描述给定块中因子的因子重数

idiosyncratic_ar1bool

是否将每个序列的特质成分建模为AR(1)过程。如果为False,则特质成分将建模为白噪声。

standardizebool or tuple, optional

如果是一个布尔值,表示在拟合模型之前是否将每个内生变量标准化为均值为零且标准差为1。有关此选项如何与后估计输出一起工作的详细信息,请参见“注释”。如果是一个元组(通常仅在内部使用),则该元组必须具有长度2,每个元素包含一个索引等于内生变量名称的Pandas系列。第一个元素应包含均值,第二个元素应包含标准差。默认值为True。

endog_quarterlypandas.Series or pandas.DataFrame

观察到的季度变量。如果提供,必须是一个带有DatetimeIndex或PeriodIndex的Pandas Series或DataFrame,频率为季度。有关如何使用月度/季度混合频率数据设置模型的详细信息,请参阅“注释”部分。

init_t0bool, optional

如果为True,此选项使用\(\alpha_0\)的分布初始化卡尔曼滤波器,而不是\(\alpha_1\)。有关更多详细信息,请参阅“注释”部分。此选项很少使用,除非用于测试。默认值为False。

obs_cov_diagbool, optional

如果为真且idiosyncratic_ar1 为真,则此选项在观测扰动协方差矩阵中放置小的正值。这对于估计不是必需的,除了测试之外很少使用。(有时用于防止数值错误,例如在使用EM初始化时,第一个时间步的预测误差协方差矩阵为半正定的情况,但Statsmodels中的状态空间模型在这些情况下切换到单变量方法,因此不需要使用此技巧)。默认值为False。

Attributes:
endog_names

内生变量的名称。

exog_names

外生变量的名称。

initial_variance
initialization
loglike_constant

联合对数似然函数中的常数项。

loglikelihood_burn
param_names

(list of str) 人类可读的参数名称列表。

start_params

(数组) 最大似然估计的初始参数。

state_names

(list of str) 未观测状态的可读名称列表。

tolerance

注释

基本模型是:

\[\begin{split}y_t & = \Lambda f_t + \epsilon_t \\ f_t & = A_1 f_{t-1} + \dots + A_p f_{t-p} + u_t\end{split}\]

其中:

  • \(y_t\) 是在时间 t 的观测数据

  • \(\epsilon_t\) 是时间 t 的特质扰动(详见下文,包括对此项序列相关性的建模)

  • \(f_t\) 是在时间 t 的未观测因子

  • \(u_t \sim N(0, Q)\) 是时间 t 的因子扰动

和:

  • \(\Lambda\) 被称为因子载荷矩阵

  • \(A_i\) 是自回归系数的矩阵

此外,我们允许特异性扰动具有序列相关性,因此,如果 idiosyncratic_ar1=True\(\epsilon_{i,t} = \rho_i \epsilon_{i,t-1} + e_{i,t}\),其中 \(e_{i,t} \sim N(0, \sigma_i^2)\)。如果 idiosyncratic_ar1=False, 则我们改为有 \(\epsilon_{i,t} = e_{i,t}\)

这个基本设置可以在[1], [2], [3], 和 [4]中找到。

我们允许对此模型进行两种泛化:

  1. 根据[2],我们允许多个“因子块”,这些因子块与其他因子块相互独立。不同的块可以设置为加载在不同的观测变量子集上,并且可以使用不同的滞后阶数进行指定。

  2. 根据[4][2],我们允许在模型中使用混合频率数据,即同时使用月度和季度数据。有关更多详细信息,请参阅下面的“混合频率模型”部分。

附加说明:

  • 观察到的数据可能包含任意模式的缺失条目。

EM算法

该模型包含大量可能的参数,使用拟牛顿法数值优化似然函数可能会非常困难且耗时过长。因此,该模型的默认拟合方法使用EM算法,如[1]中所述。因此,该模型可以处理包含数百个观测变量的数据集。

混合频率数据

该模型可以通过两种方式处理混合频率数据。在本节中,我们仅简要描述这一点,并建议读者参考[2][4]以获取所有详细信息。

首先,由于在观测向量中可能存在任意模式的缺失数据,因此可以简单地将较低频率的变量作为在特定较高频率期间观测到的数据,而在其他情况下则缺失。例如,在月度模型中,可以将季度数据作为在每个季度的第三个月发生的数据。要使用这种方法,只需将数据合并到一个可以在较高频率下传递给该模型的单一数据集中,作为endog参数。然而,根据分析中使用的变量类型和对数据生成过程的假设,这种方法可能无效。

例如,假设我们对实际GDP的增长率感兴趣, 这是按季度频率测量的。如果基本因子模型 是按月频率指定的,那么每个季度的第三个月的季度增长率 ——这是我们实际观察到的——是通过未观察到的月度增长率的特定加权平均值来近似的。 我们需要在构建模型时考虑这个特定的加权移动平均值,这就是第二种方法所做的。

第二种方法遵循[2][4],通过构建状态空间形式来明确地以未观测到的月度增长率来建模季度增长率。要使用这种方法,有两种方法:

  1. 将月度和季度的数据合并为一个以月度频率表示的单一数据集,其中月度数据位于前几列,季度数据位于最后几列。将此数据集作为endog参数传递给模型,并将月度变量的数量作为k_endog_monthly参数传递。

  2. 构建一个以月为频率的 Pandas DataFrame,使用 DatetimeIndex 或 PeriodIndex,并单独构建一个以季度为频率的 Pandas DataFrame,使用 DatetimeIndex 或 PeriodIndex。将月度 DataFrame 传递给模型作为 endog 参数,并将季度 DataFrame 传递给模型作为 endog_quarterly 参数。

请注意,这仅包含一种特定类型的混合频率数据。另请参阅 Banbura 等人(2013 年)的“Now-Casting 和实时数据流”,以讨论此框架不支持的其他类型的混合频率数据。

实时预测与新闻

通过其对月度/季度混合频率数据的支持,该模型可以基于月度观测值对季度变量进行预测。特别是,[2][3] 使用该模型构建了实际GDP的预测,并分析了“新闻”的影响,这些“新闻”是基于实时数据得出的。后一种功能可以通过结果对象的 news 方法访问。

标准化数据

在制定动态因子模型时,通常情况下,我们不会显式地考虑每个观测变量的均值。相反,默认行为是在估计之前对每个变量进行标准化。因此,如果 \(y_t\) 是给定的观测数据,动态因子模型实际上是在由以下定义的标准化数据上进行估计的:

\[x_{i, t} = (y_{i, t} - \bar y_i) / s_i\]

其中 \(\bar y_i\) 是样本均值,\(s_i\) 是样本标准差。

默认情况下,如果在估计之前应用标准化,结果如样本内预测、样本外预测以及“新闻”的计算,将以原始数据的尺度报告(即模型输出在返回给用户之前应用了反向变换)。

标准化可以通过在模型构造函数中传递standardization=False来禁用。

识别因素和载荷

该模型中的估计因子和因子载荷仅在可逆变换的范围内被识别。正如(工作论文版本中的)[2]所述,虽然可以施加归一化以实现识别,但EM算法仍将收敛。此外,出于短期预测和预测的目的,识别不是必需的。该模型没有施加任何归一化来识别因子和因子载荷。

杂项

在模型构造函数中有两个很少使用但值得一提的参数:init_t0obs_cov_diag。这些参数的提供是为了允许完全匹配其他包的输出,这些包在底层状态空间模型的设置/应用方式上略有不同。

  • init_t0: Statsmodels 中的状态空间模型遵循 Durbin 和 Koopman 的方法,使用 \(\alpha_1 \sim N(a_1, P_1)\) 初始化模型。其他实现有时会使用 \(\alpha_0 \sim N(a_0, P_0)\) 进行初始化。我们可以通过在观测数据集中添加一行 NaN 来适应这种情况。

  • obs_cov_diag: 在[1]中的状态空间形式包含了观测扰动协方差矩阵的对角元素为非零(但非常小)。

参考文献

[1] (1,2,3,4)

Bańbura, Marta, 和 Michele Modugno. “具有任意缺失数据模式的数据集上的因子模型最大似然估计。” 《应用计量经济学杂志》29, 第1期 (2014): 133-160.

[2] (1,2,3,4,5,6,7,8)

Bańbura, Marta, Domenico Giannone, 和 Lucrezia Reichlin. “实时预测。” 《牛津经济预测手册》。2011年7月8日。

[3] (1,2,3)

博克, 布兰丁, 达涅莱·卡拉泰利, 多梅尼科·贾诺内, 阿尔吉亚·M·斯巴多内, 和安德烈亚·坦巴洛蒂. 2018. “宏观经济实时预测与大数据预测.” 经济学年度评论 10 (1): 615-43. https://doi.org/10.1146/annurev-economics-080217-053214.

[4] (1,2,3,4,5)

马里亚诺,罗伯托·S.,和安本友友。 “一个同步指数,共同因素和月度实际GDP。” 牛津经济学与统计公报 72, 第1期 (2010): 27-46.

示例

构建和拟合一个DynamicFactorMQ模型。

>>> data = sm.datasets.macrodata.load_pandas().data.iloc[-100:]
>>> data.index = pd.period_range(start='1984Q4', end='2009Q3', freq='Q')
>>> endog = data[['infl', 'tbilrate']].resample('M').last()
>>> endog_Q = np.log(data[['realgdp', 'realcons']]).diff().iloc[1:] * 400

基本用法

在最简单的情况下,仅传递 endog 参数会导致模型中有一个遵循 AR(1) 过程的单一因子。请注意,因为我们没有同时提供 endog_quarterly 数据集,endog 可以是具有任意索引的 numpy 数组或 Pandas DataFrame(它不必是每月的)。

The summary 方法在检查模型规范时可能很有用。

>>> mod = sm.tsa.DynamicFactorMQ(endog)
>>> print(mod.summary())
                    Model Specification: Dynamic Factor Model
==========================================================================
Model:         Dynamic Factor Model   # of monthly variables:          2
            + 1 factors in 1 blocks   # of factors:                    1
              + AR(1) idiosyncratic   Idiosyncratic disturbances:  AR(1)
Sample:                     1984-10   Standardize variables:        True
                          - 2009-09
Observed variables / factor loadings
========================
Dep. variable          0
------------------------
         infl          X
     tbilrate          X
    Factor blocks:
=====================
     block      order
---------------------
         0          1
=====================

因素

使用factors=2,将有两个独立的因子,每个因子将根据单独的AR(1)过程进行演化。

>>> mod = sm.tsa.DynamicFactorMQ(endog, factors=2)
>>> print(mod.summary())
                    Model Specification: Dynamic Factor Model
==========================================================================
Model:         Dynamic Factor Model   # of monthly variables:          2
            + 2 factors in 2 blocks   # of factors:                    2
              + AR(1) idiosyncratic   Idiosyncratic disturbances:  AR(1)
Sample:                     1984-10   Standardize variables:        True
                          - 2009-09
Observed variables / factor loadings
===================================
Dep. variable          0          1
-----------------------------------
         infl          X          X
     tbilrate          X          X
    Factor blocks:
=====================
     block      order
---------------------
         0          1
         1          1
=====================

因子重数

通过指定 factor_multiplicities=2,我们仍然会有两个因子,但它们将是相互依赖的,并且会根据 VAR(1) 过程共同演化。

>>> mod = sm.tsa.DynamicFactorMQ(endog, factor_multiplicities=2)
>>> print(mod.summary())
                    Model Specification: Dynamic Factor Model
==========================================================================
Model:         Dynamic Factor Model   # of monthly variables:          2
            + 2 factors in 1 blocks   # of factors:                    2
              + AR(1) idiosyncratic   Idiosyncratic disturbances:  AR(1)
Sample:                     1984-10   Standardize variables:        True
                          - 2009-09
Observed variables / factor loadings
===================================
Dep. variable        0.1        0.2
-----------------------------------
         infl         X          X
     tbilrate         X          X
    Factor blocks:
=====================
     block      order
---------------------
  0.1, 0.2          1
=====================

因子顺序

在上述任一情况下,我们可以通过使用factor_orders参数来扩展(向量)自回归的阶数。例如,下面的模型将包含两个独立的因子,每个因子根据各自的AR(2)过程演化:

>>> mod = sm.tsa.DynamicFactorMQ(endog, factors=2, factor_orders=2)
>>> print(mod.summary())
                    Model Specification: Dynamic Factor Model
==========================================================================
Model:         Dynamic Factor Model   # of monthly variables:          2
            + 2 factors in 2 blocks   # of factors:                    2
              + AR(1) idiosyncratic   Idiosyncratic disturbances:  AR(1)
Sample:                     1984-10   Standardize variables:        True
                          - 2009-09
Observed variables / factor loadings
===================================
Dep. variable          0          1
-----------------------------------
         infl          X          X
     tbilrate          X          X
    Factor blocks:
=====================
     block      order
---------------------
         0          2
         1          2
=====================

特质扰动中的序列相关性

默认情况下,模型允许每个特异性扰动项根据AR(1)过程演化。如果需要,可以通过传递ididosyncratic_ar1=False来指定它们为序列独立的。

>>> mod = sm.tsa.DynamicFactorMQ(endog, idiosyncratic_ar1=False)
>>> print(mod.summary())
                    Model Specification: Dynamic Factor Model
==========================================================================
Model:         Dynamic Factor Model   # of monthly variables:          2
            + 1 factors in 1 blocks   # of factors:                    1
                + iid idiosyncratic   Idiosyncratic disturbances:    iid
Sample:                     1984-10   Standardize variables:        True
                          - 2009-09
Observed variables / factor loadings
========================
Dep. variable          0
------------------------
         infl          X
     tbilrate          X
    Factor blocks:
=====================
     block      order
---------------------
         0          1
=====================

月度/季度混合频率

要指定月度/季度混合频率模型,请参阅(关于这些模型的详细信息,请参见注释部分):

>>> mod = sm.tsa.DynamicFactorMQ(endog, endog_quarterly=endog_Q)
>>> print(mod.summary())
                    Model Specification: Dynamic Factor Model
==========================================================================
Model:         Dynamic Factor Model   # of monthly variables:          2
            + 1 factors in 1 blocks   # of quarterly variables:        2
            + Mixed frequency (M/Q)   # of factors:                    1
              + AR(1) idiosyncratic   Idiosyncratic disturbances:  AR(1)
Sample:                     1984-10   Standardize variables:        True
                          - 2009-09
Observed variables / factor loadings
========================
Dep. variable          0
------------------------
         infl          X
     tbilrate          X
      realgdp          X
     realcons          X
    Factor blocks:
=====================
     block      order
---------------------
         0          1
=====================

自定义观察变量/因子载荷

要指定某些观察变量仅加载在某些因子上,可以将字典传递给factors参数。

>>> factors = {'infl': ['global']
...            'tbilrate': ['global']
...            'realgdp': ['global', 'real']
...            'realcons': ['global', 'real']}
>>> mod = sm.tsa.DynamicFactorMQ(endog, endog_quarterly=endog_Q)
>>> print(mod.summary())
                    Model Specification: Dynamic Factor Model
==========================================================================
Model:         Dynamic Factor Model   # of monthly variables:          2
            + 2 factors in 2 blocks   # of quarterly variables:        2
            + Mixed frequency (M/Q)   # of factor blocks:              2
              + AR(1) idiosyncratic   Idiosyncratic disturbances:  AR(1)
Sample:                     1984-10   Standardize variables:        True
                          - 2009-09
Observed variables / factor loadings
===================================
Dep. variable     global       real
-----------------------------------
         infl       X
     tbilrate       X
      realgdp       X           X
     realcons       X           X
    Factor blocks:
=====================
     block      order
---------------------
    global          1
      real          1
=====================

拟合参数

要拟合模型,请使用fit方法。该方法默认使用EM算法。

>>> mod = sm.tsa.DynamicFactorMQ(endog)
>>> res = mod.fit()
>>> print(res.summary())
                          Dynamic Factor Results
==========================================================================
Dep. Variable:      ['infl', 'tbilrate']   No. Observations:         300
Model:              Dynamic Factor Model   Log Likelihood       -127.909
                 + 1 factors in 1 blocks   AIC                   271.817
                   + AR(1) idiosyncratic   BIC                   301.447
Date:                   Tue, 04 Aug 2020   HQIC                  283.675
Time:                           15:59:11   EM Iterations              83
Sample:                       10-31-1984
                            - 09-30-2009
Covariance Type:            Not computed
                    Observation equation:
==============================================================
Factor loadings:          0    idiosyncratic: AR(1)       var.
--------------------------------------------------------------
            infl      -0.67                    0.39       0.73
        tbilrate      -0.63                    0.99       0.01
       Transition: Factor block 0
=======================================
                 L1.0    error variance
---------------------------------------
         0       0.98              0.01
=======================================
Warnings:
[1] Covariance matrix not calculated.

显示迭代进度

要显示关于EM迭代的信息,请使用disp参数。

>>> mod = sm.tsa.DynamicFactorMQ(endog)
>>> res = mod.fit(disp=10)
EM start iterations, llf=-291.21
EM iteration 10, llf=-157.17, convergence criterion=0.053801
EM iteration 20, llf=-128.99, convergence criterion=0.0035545
EM iteration 30, llf=-127.97, convergence criterion=0.00010224
EM iteration 40, llf=-127.93, convergence criterion=1.3281e-05
EM iteration 50, llf=-127.92, convergence criterion=5.4725e-06
EM iteration 60, llf=-127.91, convergence criterion=2.8665e-06
EM iteration 70, llf=-127.91, convergence criterion=1.6999e-06
EM iteration 80, llf=-127.91, convergence criterion=1.1085e-06
EM converged at iteration 83, llf=-127.91,
   convergence criterion=9.9004e-07 < tolerance=1e-06

结果:预测、脉冲响应等

模型拟合后,结果对象提供了许多方法。一些例子包括:

预测

>>> mod = sm.tsa.DynamicFactorMQ(endog)
>>> res = mod.fit()
>>> print(res.forecast(steps=5))
             infl  tbilrate
2009-10  1.784169  0.260401
2009-11  1.735848  0.305981
2009-12  1.730674  0.350968
2010-01  1.742110  0.395369
2010-02  1.759786  0.439194

脉冲响应

>>> mod = sm.tsa.DynamicFactorMQ(endog)
>>> res = mod.fit()
>>> print(res.impulse_responses(steps=5))
       infl  tbilrate
0 -1.511956 -1.341498
1 -1.483172 -1.315960
2 -1.454937 -1.290908
3 -1.427240 -1.266333
4 -1.400069 -1.242226
5 -1.373416 -1.218578

有关其他可用方法(包括样本内预测、时间序列模拟、扩展结果以包含新数据以及新闻),请参阅状态空间模型的文档。

方法

clone(endog[, k_endog_monthly, ...])

克隆状态空间模型并使用新数据,可选择新的规格。

construct_endog(endog_monthly, endog_quarterly)

从单独的月度和季度数据构建一个组合数据集。

filter(params[, transformed, ...])

卡尔曼滤波。

fit([start_params, transformed, ...])

通过卡尔曼滤波以最大似然法拟合模型。

fit_constrained(约束[, start_params])

使用一些受等式约束的参数拟合模型。

fit_em([start_params, transformed, ...])

通过EM算法以最大似然估计拟合模型。

fix_params(params)

将参数固定为特定值(上下文管理器)

from_formula(公式, 数据[, 子集])

状态空间模型未实现

handle_params(params[, transformed, ...])

确保模型参数满足形状和其他要求

hessian(params, *args, **kwargs)

似然函数的Hessian矩阵,在给定参数处求值

impulse_responses(params[, steps, impulse, ...])

脉冲响应函数。

information(params)

模型的费舍尔信息矩阵。

initialize()

初始化(可能重新初始化)一个模型实例。

initialize_approximate_diffuse([variance])

初始化近似漫反射

initialize_known(初始状态, ...)

初始化已知

initialize_statespace(**kwargs)

初始化状态空间表示

initialize_stationary()

初始化静止状态

loading_constraints(i)

季度变量的因子载荷约束的矩阵形式。

loglike(参数, *参数, **关键字参数)

对数似然评估

loglikeobs(params[, transformed, ...])

对数似然评估

observed_information_matrix(params[, ...])

观测信息矩阵

opg_information_matrix(参数[, ...])

梯度信息矩阵的外积

predict(参数[, 外生变量])

模型拟合后,predict 返回拟合值。

prepare_data()

准备用于状态空间表示的数据

score(params, *args, **kwargs)

在参数处计算得分函数。

score_obs(params[, method, transformed, ...])

计算每个观测值的得分,在参数处进行评估

set_conserve_memory([conserve_memory])

设置内存保护方法

set_filter_method([filter_method])

设置过滤方法

set_inversion_method([inversion_method])

设置反演方法

set_smoother_output([smoother_output])

设置平滑输出

set_stability_method([stability_method])

设置数值稳定性方法

simulate(params, nsimulations[, ...])

模拟一个遵循状态空间模型的新时间序列。

simulation_smoother([simulation_output])

获取状态空间模型的模拟平滑器。

smooth(参数[, 转换, ...])

卡尔曼平滑。

summary([truncate_endog_names])

创建一个描述模型的摘要表。

transform_jacobian(无约束[, ...])

参数变换函数的雅可比矩阵

transform_params(unconstrained)

将优化器空间中的参数转换为模型空间中的参数。

untransform_params(constrained)

将参数从模型空间转换到优化器空间。

update(params, **kwargs)

更新模型的参数。

属性

endog_names

内生变量的名称。

exog_names

外生变量的名称。

initial_variance

初始化

loglike_constant

联合对数似然函数中的常数项。

loglikelihood_burn

param_names

(list of str) 人类可读的参数名称列表。

start_params

(数组) 最大似然估计的初始参数。

state_names

(list of str) 未观测状态的可读名称列表。

tolerance


Last update: Oct 16, 2024