一、什么是Quantile Regression?
Quantile Regression,又称分位数回归,是统计学中的一种方法,与传统的最小二乘法回归不同,在回归模型中不仅仅估计因变量的均值,还估计不同分位数下的因变量。这意味着,Quantile Regression可以对于异常值不敏感,适用于长尾数据分布的情况。
Quantile Regression的目标是估计不同分位数下的条件分布,而不是简单的预测单个因变量的均值。哪怕在数据的非对称分布和离群值的情况下,Quantile Regression也具有很好的表现。
使用的时候需要选择目标分位数,目标分位数表示的是小于等于这个数的概率。
二、Quantile Regression的原理
Quantile Regression可以表示为:
min Σ(i=1)^n psiτ(yi−xiTβ)
其中,τ是目标分位数,psi是一个可导函数,当τ=0.5时,psi=|u|;当τ<0.5时,psi=u(这里的u=y-xTβ);当τ>0.5时,psi=-u。这里的β是所求的系数向量,yi是因变量值,xi是自变量向量。
通过上式可以看出,Quantile Regression是以分位数为目标,然后对数据进行回归拟合,而最小二乘法是以均值为目标。因此,当数据存在极端值或者偏斜分布时,Quantile Regression拥有更强的鲁棒性。
三、Quantile Regression的优点
与传统的最小二乘法回归相比,Quantile Regression的优点主要包括:
- 鲁棒性强:因为Quantile Regression的目标是估计不同分位数下的条件分布,因此对于数据中的离群值不敏感。
- 更广泛的应用:在长尾数据分布的情况下,Quantile Regression可以更好地拟合数据分布。
- 更全面的数据描述:传统的回归方法只能描述因变量的均值变化,而Quantile Regression可以描述不同分位数下的因变量。
四、应用案例
下面我们以Python中的statsmodels库为例,演示如何实现Quantile Regression。
五、代码示例
首先加载需要用到的库:
import pandas as pd import statsmodels.formula.api as smf
我们使用官方提供的汽车数据集Auto来进行演示。
auto = pd.read_csv('https://raw.githubusercontent.com/vincentarelbundock/Rdatasets/master/csv/ISLR/Auto.csv')
对数据进行处理,将所有的非数字值替换为NaN。
auto = auto.apply(pd.to_numeric, errors='coerce') auto = auto.dropna()
然后,我们以车身长为自变量,价格为因变量,来拟合不同分位数下的条件分布。这里我们以分位数0.5和0.9为例:
mod = smf.quantreg('price ~ length', auto) res_half = mod.fit(q=.5) res_ninetieth = mod.fit(q=.9)
计算结果之后,我们可以得到在0.5和0.9两个分位数下的系数估计结果:
print(res_half.summary()) print(res_ninetieth.summary())
我们也可以将结果可视化:
import numpy as np import matplotlib.pyplot as plt quantiles = np.arange(.05, .96, .1) def fit_model(q): res = mod.fit(q=q) return [q, res.params['Intercept'], res.params['length']] + \ res.conf_int().loc['length'].tolist() models = [fit_model(x) for x in quantiles] models = pd.DataFrame(models, columns=['q', 'a', 'b', 'lb', 'ub']) ols = smf.ols('price ~ length', auto).fit() ols_ci = ols.conf_int().loc['length'].tolist() ols = dict(a=ols.params['Intercept'], b=ols.params['length'], lb=ols_ci[0], ub=ols_ci[1]) plt.figure(figsize=(8,6), dpi=80) plt.scatter(auto['length'], auto['price'], alpha=.2) plt.plot(auto['length'], models['a'], color='black', label=r'$\alpha$') plt.plot(auto['length'], models['a'] + models['b'], linestyle='--', color='blue', label=f"{models['q'][1]:.2f} percentile") plt.plot(auto['length'], models['a'] + models['lb'], linestyle='--', color='blue', alpha=.5) plt.plot(auto['length'], models['a'] + models['ub'], linestyle='--', color='blue', alpha=.5) plt.plot(auto['length'], ols['a'] + ols['b'] * auto['length'], color='red', label='OLS') plt.title('Quantile Regression') plt.legend() plt.show()
运行上述代码后,可以看到一个图表,其横轴为车身长,纵轴为车价。红线代表OLS回归拟合,黑线代表不同分位数下的Quantile Regression拟合结果。
六、总结
Quantile Regression是在统计学中一类最小距离估计方法,主要用于估计条件分布的分位数函数。Quantile Regression的分位数估计和最小二乘法回归有所差别,因此它在处理长尾分布和离群值的情况时更加有效,拥有更强的鲁棒性。