StatsModels中的加权最小二乘法(WLS)详解与应用

StatsModels中的加权最小二乘法(WLS)详解与应用

statsmodels Statsmodels: statistical modeling and econometrics in Python statsmodels 项目地址: https://gitcode.com/gh_mirrors/st/statsmodels

引言

在回归分析中,普通最小二乘法(OLS)是最基础的方法,但它有一个重要假设:误差项的方差是恒定的(同方差性)。当数据存在异方差性时,OLS估计虽然仍然是无偏的,但不再是最有效的估计。加权最小二乘法(WLS)正是为了解决这一问题而设计的。

异方差性问题概述

异方差性是指误差项的方差随自变量的变化而变化。在实际数据分析中,这种情况非常常见:

  1. 金融数据中,高价值交易的波动通常更大
  2. 医学研究中,某些测量方法在不同浓度范围的精度不同
  3. 经济数据中,不同规模企业的财务指标波动性不同

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)

在实际应用中,我们通常不知道真实的方差结构。这时可以使用两阶段方法:

  1. 第一阶段:用OLS拟合模型,分析残差
  2. 第二阶段:根据残差估计方差结构,构建权重
  3. 用估计的权重进行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())

实际应用建议

  1. 权重选择:当对误差方差结构有先验知识时,直接使用WLS;否则考虑FWLS
  2. 模型诊断:即使使用WLS,也应检查残差图确认权重选择是否合理
  3. 稳健标准误:即使使用WLS,也可以计算稳健标准误作为参考
  4. 与稳健回归比较:在复杂异方差情况下,可以考虑使用其他稳健回归方法

总结

StatsModels中的WLS实现为解决异方差问题提供了有效工具。通过本教程,我们了解了:

  1. 如何构建和使用WLS模型
  2. WLS与OLS在参数估计和预测区间上的差异
  3. 两阶段FWLS方法的实现
  4. 异方差情况下的模型选择策略

WLS是处理异方差数据的有力工具,但需要合理选择权重。在实际应用中,建议结合残差分析和领域知识来确定适当的权重结构。

statsmodels Statsmodels: statistical modeling and econometrics in Python statsmodels 项目地址: https://gitcode.com/gh_mirrors/st/statsmodels

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

经薇皎

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值