StatsModels中的加权最小二乘法(WLS)详解与应用
引言
在回归分析中,普通最小二乘法(OLS)是最基础的方法,但它有一个重要假设:误差项的方差是恒定的(同方差性)。当数据存在异方差性时,OLS估计虽然仍然是无偏的,但不再是最有效的估计。加权最小二乘法(WLS)正是为了解决这一问题而设计的。
异方差性问题概述
异方差性是指误差项的方差随自变量的变化而变化。在实际数据分析中,这种情况非常常见:
- 金融数据中,高价值交易的波动通常更大
- 医学研究中,某些测量方法在不同浓度范围的精度不同
- 经济数据中,不同规模企业的财务指标波动性不同
WLS基本原理
WLS的核心思想是对不同观测值赋予不同的权重,方差较小的观测值获得更大的权重。数学上,WLS最小化的目标函数是:
∑ wᵢ(yᵢ - Xᵢβ)²
其中wᵢ是与误差方差成反比的权重。
人工数据构建
让我们通过一个模拟示例来理解WLS的应用:
import numpy as np
import statsmodels.api as sm
# 设置随机种子保证结果可复现
np.random.seed(1024)
# 生成50个样本点
nsample = 50
x = np.linspace(0, 20, nsample)
# 真实模型是二次的,但我们只拟合线性模型(故意错误设定)
X = np.column_stack((x, (x - 5) ** 2))
X = sm.add_constant(X)
beta = [5.0, 0.5, -0.01] # 真实系数
# 构造异方差误差:前60%样本误差小,后40%样本误差大
sig = 0.5
w = np.ones(nsample)
w[nsample * 6 // 10 :] = 3 # 后40%样本误差标准差是前60%的3倍
# 生成响应变量
y_true = np.dot(X, beta)
e = np.random.normal(size=nsample)
y = y_true + sig * w * e
# 只使用线性项进行拟合(故意忽略二次项)
X = X[:, [0, 1]]
已知权重情况下的WLS
当我们确切知道不同观测的误差方差比例时,可以直接使用WLS:
# 权重与误差方差成反比
mod_wls = sm.WLS(y, X, weights=1.0 / (w**2))
res_wls = mod_wls.fit()
print(res_wls.summary())
WLS与OLS比较
让我们比较WLS和OLS的结果差异:
# 普通OLS拟合
res_ols = sm.OLS(y, X).fit()
# 比较参数估计
print("OLS参数:", res_ols.params)
print("WLS参数:", res_wls.params)
# 比较各种标准误
se = np.vstack([
[res_wls.bse], # WLS标准误
[res_ols.bse], # OLS标准误
[res_ols.HC0_se], # 异方差稳健标准误HC0
[res_ols.HC1_se], # 异方差稳健标准误HC1
[res_ols.HC2_se], # 异方差稳健标准误HC2
[res_ols.HC3_se], # 异方差稳健标准误HC3
])
从结果可以看到,WLS的标准误通常比OLS更小,说明效率更高。而各种异方差稳健标准误(HC0-HC3)则提供了在异方差情况下对OLS标准误的修正。
预测区间比较
我们可以可视化两种方法的预测区间差异:
import matplotlib.pyplot as plt
# 获取预测区间
pred_ols = res_ols.get_prediction()
iv_l_ols = pred_ols.summary_frame()["obs_ci_lower"]
iv_u_ols = pred_ols.summary_frame()["obs_ci_upper"]
pred_wls = res_wls.get_prediction()
iv_l = pred_wls.summary_frame()["obs_ci_lower"]
iv_u = pred_wls.summary_frame()["obs_ci_upper"]
# 绘制图形
fig, ax = plt.subplots(figsize=(10, 6))
ax.plot(x, y, "o", label="观测数据")
ax.plot(x, y_true, "b-", label="真实关系")
# OLS结果
ax.plot(x, res_ols.fittedvalues, "r--")
ax.plot(x, iv_u_ols, "r--", label="OLS")
ax.plot(x, iv_l_ols, "r--")
# WLS结果
ax.plot(x, res_wls.fittedvalues, "g--.")
ax.plot(x, iv_u, "g--", label="WLS")
ax.plot(x, iv_l, "g--")
ax.legend(loc="best")
plt.title("WLS与OLS预测比较")
plt.show()
从图中可以明显看出,WLS对高方差区域(右侧)的预测区间更宽,反映了数据的不确定性,而OLS则假设所有区域的方差相同,导致预测区间不够准确。
两阶段可行加权最小二乘法(FWLS)
在实际应用中,我们通常不知道真实的方差结构。这时可以使用两阶段方法:
- 第一阶段:用OLS拟合模型,分析残差
- 第二阶段:根据残差估计方差结构,构建权重
- 用估计的权重进行WLS回归
# 分组估计方差
resid1 = res_ols.resid[w == 1.0] # 低方差组残差
var1 = resid1.var(ddof=int(res_ols.df_model) + 1)
resid2 = res_ols.resid[w != 1.0] # 高方差组残差
var2 = resid2.var(ddof=int(res_ols.df_model) + 1)
# 构建估计权重
w_est = w.copy()
w_est[w != 1.0] = np.sqrt(var2) / np.sqrt(var1)
# 使用估计权重进行WLS
res_fwls = sm.WLS(y, X, 1.0 / ((w_est**2))).fit()
print(res_fwls.summary())
实际应用建议
- 权重选择:当对误差方差结构有先验知识时,直接使用WLS;否则考虑FWLS
- 模型诊断:即使使用WLS,也应检查残差图确认权重选择是否合理
- 稳健标准误:即使使用WLS,也可以计算稳健标准误作为参考
- 与稳健回归比较:在复杂异方差情况下,可以考虑使用其他稳健回归方法
总结
StatsModels中的WLS实现为解决异方差问题提供了有效工具。通过本教程,我们了解了:
- 如何构建和使用WLS模型
- WLS与OLS在参数估计和预测区间上的差异
- 两阶段FWLS方法的实现
- 异方差情况下的模型选择策略
WLS是处理异方差数据的有力工具,但需要合理选择权重。在实际应用中,建议结合残差分析和领域知识来确定适当的权重结构。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考