在统计学中,协方差矩阵的估计对于许多应用领域都是至关重要的。然而,在样本量较少的情况下,传统的样本协方差矩阵可能不稳定。为了解决这个问题,Ledoit和Wolf提出了一种计算渐近最优收缩参数的闭合公式,该参数最小化了均方误差(MSE)标准,从而得到了Ledoit-Wolf协方差估计。Chen等人提出了Ledoit-Wolf收缩参数的改进版本,即OAS系数,其在假设数据为高斯分布的情况下,收敛性能显著更好。本例受到Chen等人发表的文献[1]的启发,展示了使用高斯分布数据估计LW和OAS方法的MSE,并进行了比较。
在进行协方差估计时,收缩算法是一种常用的技术,它通过将样本协方差矩阵向一个目标矩阵(通常是单位矩阵)收缩来提高估计的稳定性。Ledoit-Wolf方法和OAS方法都是基于这种思想,但它们在收缩参数的计算上有所不同。Ledoit-Wolf方法通过最小化MSE准则来确定收缩参数,而OAS方法则在此基础上进行了改进,以获得更好的收敛性能。
为了比较这两种方法的性能,进行了模拟实验。首先,生成了一个具有AR(1)过程的模拟协方差矩阵,然后使用高斯分布数据来模拟不同的样本大小。对于每个样本大小,重复了100次实验,并计算了Ledoit-Wolf和OAS方法的MSE。实验结果表明,OAS方法在大多数情况下都能提供比Ledoit-Wolf方法更小的MSE,这表明了其在高斯分布数据下的优越性。
此外,还绘制了两种方法的收缩系数。收缩系数是衡量协方差矩阵收缩程度的一个指标,其值越接近1,表示收缩程度越小。从图中可以看出,随着样本量的增加,两种方法的收缩系数都趋向于1,这意味着在大样本情况下,两种方法的性能逐渐接近。然而,在小样本情况下,OAS方法的收缩系数更接近1,这表明其在小样本情况下具有更好的稳定性。
import matplotlib.pyplot as plt
import numpy as np
from scipy.linalg import cholesky, toeplitz
from sklearn.covariance import OAS, LedoitWolf
np.random.seed(0)
n_features = 100
r = 0.1
real_cov = toeplitz(r**np.arange(n_features))
coloring_matrix = cholesky(real_cov)
n_samples_range = np.arange(6, 31, 1)
repeat = 100
lw_mse = np.zeros((n_samples_range.size, repeat))
oa_mse = np.zeros((n_samples_range.size, repeat))
lw_shrinkage = np.zeros((n_samples_range.size, repeat))
oa_shrinkage = np.zeros((n_samples_range.size, repeat))
for i, n_samples in enumerate(n_samples_range):
for j in range(repeat):
X = np.dot(np.random.normal(size=(n_samples, n_features)), coloring_matrix.T)
lw = LedoitWolf(store_precision=False, assume_centered=True)
lw.fit(X)
lw_mse[i, j] = lw.error_norm(real_cov, scaling=False)
lw_shrinkage[i, j] = lw.shrinkage_
oa = OAS(store_precision=False, assume_centered=True)
oa.fit(X)
oa_mse[i, j] = oa.error_norm(real_cov, scaling=False)
oa_shrinkage[i, j] = oa.shrinkage_
plt.subplot(2, 1, 1)
plt.errorbar(n_samples_range, lw_mse.mean(1), yerr=lw_mse.std(1), label="Ledoit-Wolf", color="navy", lw=2)
plt.errorbar(n_samples_range, oa_mse.mean(1), yerr=oa_mse.std(1), label="OAS", color="darkorange", lw=2)
plt.ylabel("Squared error")
plt.legend(loc="upper right")
plt.title("Comparison of covariance estimators")
plt.xlim(5, 31)
plt.subplot(2, 1, 2)
plt.errorbar(n_samples_range, lw_shrinkage.mean(1), yerr=lw_shrinkage.std(1), label="Ledoit-Wolf", color="navy", lw=2)
plt.errorbar(n_samples_range, oa_shrinkage.mean(1), yerr=oa_shrinkage.std(1), label="OAS", color="darkorange", lw=2)
plt.xlabel("n_samples")
plt.ylabel("Shrinkage")
plt.legend(loc="lower right")
plt.ylim(plt.ylim()[0], 1.0 + (plt.ylim()[1] - plt.ylim()[0]) / 10.0)
plt.xlim(5, 31)
plt.show()
总的来说,Ledoit-Wolf和OAS方法都是有效的协方差估计收缩算法,但OAS方法在高斯分布数据下具有更好的收敛性能。在实际应用中,可以根据数据的分布特性和样本量的大小来选择合适的方法。此外,通过绘制收缩系数的图表,可以直观地了解不同方法在不同样本量下的表现,从而为实际问题提供更准确的解决方案。