statsmodels.stats.correlation_tools.corr_nearest_factor

statsmodels.stats.correlation_tools.corr_nearest_factor(corr, rank, ctol=1e-06, lam_min=1e-30, lam_max=1e+30, maxiter=1000)[source]

找到与给定方阵最接近的具有因子结构的协方差矩阵。

Parameters:
corrsquare array

目标矩阵(寻找最近的相关矩阵)。必须是方阵,但不需要是半正定的。

rankint

解的因子结构的秩,即,X中线性独立列的数量。

ctolpositive real

收敛准则。

lam_minfloat

谱投影梯度优化的调优参数(搜索方向中最小允许步长)。

lam_maxfloat

谱投影梯度优化的调优参数(搜索方向中允许的最大步长)。

maxiterint

谱投影梯度优化中的最大迭代次数。

Returns:
rsltBunch

rslt.corr 是一个定义估计相关结构的 FactoredPSDMatrix。rslt 的其他字段包含从 spg_optim 返回的值。

注释

如果一个相关矩阵可以写成 I + XX’ - diag(XX’) 的形式,其中 X 是 n x k 且列线性无关,并且每行的平方和最多等于 1,那么它就具有因子结构。近似计算是基于 Frobenius 范数进行的。

当存在一个近似的非半正定相关矩阵,并且需要估计总体相关矩阵的逆、平方根或逆平方根时,此例程非常有用。因子结构允许在不构建任何 n x n 矩阵的情况下完成这些任务。

这是一个非凸问题,没有已知的保证全局收敛的算法来计算解决方案。Borsdof、Higham 和 Raydan (2010) 比较了几种方法并发现谱投影梯度 (SPG) 方法(此处使用)表现最佳。

输入矩阵 corr 可以是密集的 numpy 数组或任何 scipy 稀疏矩阵。如果输入矩阵是通过对非常大的样本相关矩阵进行阈值处理获得的,后者非常有用。如果 corr 是稀疏的,计算会进行优化以节省内存,因此不会构建超过 10^6 个元素的工作矩阵。

参考文献

示例

对相关矩阵进行硬阈值处理可能会导致矩阵不是半正定的。我们可以通过以下方法近似一个硬阈值处理后的相关矩阵为一个半正定矩阵,其中corr是输入的相关矩阵。

>>> import numpy as np
>>> from statsmodels.stats.correlation_tools import corr_nearest_factor
>>> np.random.seed(1234)
>>> b = 1.5 - np.random.rand(10, 1)
>>> x = np.random.randn(100,1).dot(b.T) + np.random.randn(100,10)
>>> corr = np.corrcoef(x.T)
>>> corr = corr * (np.abs(corr) >= 0.3)
>>> rslt = corr_nearest_factor(corr, 3)

Last update: Oct 16, 2024