python加权最小二乘_解决异方差问题--加权最小二乘法

异方差问题

Ordinary Least Squares (OLS) 需要四个 - -有些人说五或六个 - 假设要满足,但建模时我们经常会遇到异方差(Heteroskedasticity)问题,

那是因为,很多数据都表现出这种“异方差性”。我们通常可以直观地解释原因:

随着年龄的增长,净值往往会出现分歧

随着公司规模的扩大,收入趋于分化

或者,随着婴儿身高的增加,体重趋于分散

OLS的主要假设之一是数据的残差相同的,当不满足同方差的假设时,即存在异方差时候,我们需要另外的方法--加权最小二乘法(WLS)去处理。

WLS实例

importnumpy as npimportpandas as pdimportseaborn as snsimportstatsmodels.api as sm#generate random data

np.random.seed(24)

x= np.random.uniform(-5,5,25)

e= 2*np.random.randn(25)

y= 2*x+e

#alternate error as a function of x

e2 = e*(x+5)

y2= 2*x+e2

sns.regplot(x,y);

sns.regplot(x,y2);

可以看到,这些集合来自相同的实例函数,但是作为x的函数的增加的方差导致橙色模型拟合不同于蓝色的线。 在另一个随机抽取中,斜率可能低于蓝色,但一般会更加不稳定。

#add a strong outlier for high x

x_high = np.append(x,5)

y_high= np.append(y2,160)#add a strong outlier for low x

x_low = np.append(x,-4)

y_low= np.append(y2,160)

sns.regplot(x_high,y_high);

sns.regplot(x_low,y_low);

上面的第一个附加模仿了一个常见的情况,即高方差区域(预期)会看到极端观察。 这将比WLS更多地影响OLS,因为WLS将减去方差及其“惩罚”。

计算样本权重,我们添加的错误随(x + 5)的变化而变化; 我们可以使用它来对值进行反向加权。

#calculate weights for sets with low and high outlier

sample_weights_low = [1/(x+5) for x inx_low]

sample_weights_high= [1/(x+5) for x in x_high]

#reshape for compatibility

X_low = x_low.reshape(-1, 1)

X_high= x_high.reshape(-1, 1)#import and fit an OLS model, check coefficients

from sklearn.linear_model importLinearRegression

model=LinearRegression()

model.fit(X_low, y_low)#fit WLS using sample_weights

WLS =LinearRegression()

WLS.fit(X_low, y_low, sample_weight=sample_weights_low)print(model.intercept_, model.coef_)print('WLS')print(WLS.intercept_, WLS.coef_)

需要注意的是,WLS中的斜率受到低异常值的影响。 低区域应该具有低可变性,因此异常值被放大到高于OLS的范围,推动斜率更负。 让我们看下面如何在WLS中抑制高异常值。

model =LinearRegression()

model.fit(X_high, ymod)

WLS.fit(X_high, ymod, sample_weight=sample_weights_high)print(model.intercept_, model.coef_)print('WLS')print(WLS.intercept_, WLS.coef_)

总结

这是WLS的一个基本介绍,在这个领域还有很多东西要探索。例如:在建模时始终寻求使用经验或先验信息。使用模型的残差 - 例如,如果var(εi)=σ2x_i* var(εi)=σ2x_i  那么我们可以决定使用w_i = 1 / x_i。

如果响应是n观察的平均值,则类似var(y_i)= var(ε_i)=σ2/ n_i * var(y_i)= var(ε_i)=σ2/ n_i,那么我们可以决定使用w_i = n_i。

有时我们知道异方差的类型。在这种情况下,我们可能决定使用权重与测量误差的方差成反比。

在统计学和计量经济学中,异方差(heteroscedasticity)是指一个变量的方差不是恒定的,而是与该变量的均值或其他自变量相关。这会导致统计分析结果的不准确性和偏差。下面介绍一些常见的 Python 实现异方差问题修正方法。 1. 线性回归模型异方差问题修正 在线性回归模型中,如果存在异方差问题,可以使用加权最小二乘法(WLS,Weighted Least Squares)来修正。WLS 方法将每个观测值的权重与其方差成反比,即方差越大的观测值权重越小,方差越小的观测值权重越大。这样可以使得方差大的观测值对回归系数的影响减小,从而得到更准确的结果。下面是使用 statsmodels 库实现 WLS 的代码示例: ```python import numpy as np import statsmodels.api as sm # 构造数据 x = np.random.randn(100) y = 2 * x + np.random.normal(0, 1, 100) * x # 构造权重矩阵 w = 1 / np.sqrt(np.abs(x)) # 构造线性回归模型 model = sm.WLS(y, sm.add_constant(x), weights=w) # 拟合模型并输出结果 results = model.fit() print(results.summary()) ``` 2. 非线性回归模型异方差问题修正 对于非线性回归模型,可以使用加权最小二乘法的非线性版本(WNLS,Weighted Nonlinear Least Squares)来修正异方差问题。WNLS 方法将每个观测值的权重与其方差成反比,并将权重应用于目标函数的优化过程中。下面是使用 scipy 库实现 WNLS 的代码示例: ```python import numpy as np from scipy.optimize import leastsq # 目标函数 def func(params, x): a, b = params return a * x + b * np.exp(x) # 误差函数 def error(params, x, y, w): return w * (y - func(params, x)) # 构造数据 x = np.random.randn(100) y = 2 * x + np.random.normal(0, 1, 100) * x # 构造权重矩阵 w = 1 / np.sqrt(np.abs(x)) # 构造初始参数 params0 = [1, 1] # 使用 WNLS 优化参数并输出结果 params, cov_x, info, mesg, ier = leastsq( error, params0, args=(x, y, w), full_output=True) print(params) ``` 以上是常见的 Python 实现异方差问题修正方法,不同的问题可能需要不同的方法来解决,具体应根据实际情况选择合适的方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值