在Python中运行广义最小二乘法

时间:2019-05-25 11:48:11

标签: python python-3.x pandas statsmodels

我正在尝试使用statsmodels.api在Python中进行一些回归,但是我的模型都存在自相关和异方差的问题。因此,我想到了尝试使用广义最小二乘(GLS)。我对运行这种最小二乘形式不是很熟悉,因此非常接近下一页上的说明:

https://www.statsmodels.org/dev/generated/statsmodels.regression.linear_model.GLS.html

具有以下代码:

X = b2_final_Train[explan_vars]
Y = b2_final_Train[[ExognVar]]    
model = sm.OLS(Y, X).fit()

##GLS Component    
ols_resid = model.resid
res_fit = sm.OLS(list(ols_resid[1:]), list(ols_resid[:-1])).fit()
rho = res_fit.params

from scipy.linalg import toeplitz
order = toeplitz(np.arange(50014))
sigma = rho**order

gls_model = sm.GLS(Y, X, sigma=sigma)
gls_results = gls_model.fit()
print(gls_results.summary())

我可能会通过查看代码来解决我的问题,即sigma是一个非常大的矩阵,这使我在运行50014 x 50014矩阵时运行的任何计算机超载。但是据我所知,GLS矩阵对于每个错误都足够大,这就是我在数据中拥有多少观察值,也就是我有多少错误。那么,关于运行GLS,我是否会缺少某些东西,从而使问题在计算上更易于管理?

谢谢

1 个答案:

答案 0 :(得分:0)

GLS是使用整个观测值的全密集协方差矩阵实现的,大小为(点,点)。这仅适用于小样本。 (nobs是观察次数)

作为替代方案,模型类具有whiten方法,该方法可用于转换数据,以使数据不相关且均等。 WLS使用它进行加权,GLS的子类可以使用它来实现一种更有效的白化方法,该方法不需要完整的nobs乘以nobs协方差矩阵或cholesky分解。

例如,GLSAR https://www.statsmodels.org/dev/generated/statsmodels.regression.linear_model.GLSAR.html使用AR过滤器将数据白化以进行串行相关。但是,它并不能消除异方差性。

作为估算GLS模型的替代方法:
如果存在异方差和序列相关性,OLS仍然是一致的,尽管渐近地效率较低。通过在cov_type中指定fit参数,可以在这些情况下获得正确的标准错误。