您的位置:

Quantile Regression详解

一、什么是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的优点主要包括:

  1. 鲁棒性强:因为Quantile Regression的目标是估计不同分位数下的条件分布,因此对于数据中的离群值不敏感。
  2. 更广泛的应用:在长尾数据分布的情况下,Quantile Regression可以更好地拟合数据分布。
  3. 更全面的数据描述:传统的回归方法只能描述因变量的均值变化,而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的分位数估计和最小二乘法回归有所差别,因此它在处理长尾分布和离群值的情况时更加有效,拥有更强的鲁棒性。