精华内容
下载资源
问答
  • 分位数回归

    2020-12-22 06:57:22
    分位数(Quantile),亦称分位点,是指将一个随机变量的概率分布范围分为几个等份的数值点,常用的有中位数(即二分位数)、四分位数、百分位数等。 任意一个累计分布函数 F(x)F(x)F(x) ,满足 F(x^)=σ,σ∈(0,1)F...
  • 本文描述了最新的回归技术随机森林分位数回归森林(QRF)的新扩展,以应用于具有数千个特征的高维数据。 我们提出了一种新的子空间采样方法,该方法从两个单独的特征集中随机抽取一个特征子集,一个特征集包含重要...
  • 分位数回归 matlab

    2018-03-22 15:27:17
    分位数回归matlab代码,绝对可用,有注释,以及运行时间显示
  • 量子蛋白 quantnn软件包在quantnn提供了分位数回归神经网络的实现。
  • 高维数据的惩罚复合分位数回归,李玉杰, 胡涛,在不同的科学领域中, 经常会遇到厚尾的高维数据. 此时经典的最小二乘回归的结果将变的很差. 本文章考虑模型假设为线性模型时, 模型�
  • 对于高维分位数回归模型提出了一种两步变量选择方法,这里协变量的维数pn远远大于样本量n.在第一步中,使用ι1惩罚,并且证明第一步由LASSO惩罚所得到的惩罚估计量能够把模型从超高维降到同真实模型同阶的维数,...
  • 基于神经网络分位数回归及核密度估计的概率密度预测方法,闻才喜,何耀耀,本文引入神经网络分位数回归和核密度估计方法,把神经网络强大的非线性自适应能力及分位数回归能更加细致刻画解释变量的优点结合
  • 多种方法实现分位数回归
  • 使用 LP 或内部方法的分位数回归。 它具有内核测试和wald测试。 请参阅 readme.m 中的示例。
  • 基于分位数回归模型对我国证券市场在险价值度量的实证研究,楼燕妮,陈燕武,本文从研究分位数回归模型入手,发现可将置信水平(分位数)内生化于模型的参数估计过程中,克服了在险价值(VaR)的置信水平只能
  • 针对电力系统短期负荷预测问题,在现有的组合预测和概率性区间预测的基础上,提出了基于RBF 神经网络分位数回归的概率密度预测方法,得出未来一天中任意时期负 荷的概率密度函数,可以得到比点预测和区间预测更多的...
  • 针对风电功率预测问题,在现有预测方法和概率性区间预测的基础上,提出基于深度学习分位数回归的风电功率概率预测方法。该方法采用Adam随机梯度下降法在不同分位数条件下对长短期记忆神经网络(LSTM)的输入、遗忘、...
  • 小波变换函数matlab代码标量上的贝叶斯分位数回归 一种执行贝叶斯标量函数的分位数回归的方法,即贝叶斯FQR。 所提出的方法适用于用p设计矩阵X给定响应函数y和n的N-被T矩阵数据集。 该存储库提供 一组MATLAB脚本,...
  • 目标是分位数回归学习的误差分析。 除了连续性和有界性之外,内核函数没有任何正则化条件。 基于图的半监督算法会导致一个额外的误差项,称为流形误差。 新的错误边界和收敛速度的一部分是使用由l1经验覆盖数和边界...
  • 针对某些商品的高易变性、不对称性的需求模式,基于预测方法高精确度的要求,采用计量经济学前沿预测研究方法指数加权分位数回归预测法,建立了由零售商、制造商的成本模型和供应链系统总成本模型构成的CPFR供应链系统...
  • 论文研究-带网络结构的自适应Lasso分位数回归及其应用.pdf, CVaR是衡量组合投资的重要风险测度,如何在CVaR组合模型中选择稳健的资产组合以降低管理时间和经济成本十分...
  • 分位数回归及其Python源码

    千次阅读 2020-12-06 14:51:03
    分位数回归及其Python源码天朗气清,惠风和畅。赋闲在家,正宜读书。前人文章,不得其解。代码开源,无人注释。你们不来,我行我上。废话少说,直入主题。o( ̄︶ ̄)o我们要探测自变量 与因变量 的关系,最简单的方法...

    分位数回归及其Python源码

    天朗气清,惠风和畅。赋闲在家,正宜读书。前人文章,不得其解。代码开源,无人注释。你们不来,我行我上。废话少说,直入主题。o( ̄︶ ̄)o

    我们要探测自变量

    与因变量

    的关系,最简单的方法是线性回归,即假设:

    我们通过最小二乘方法 (OLS: ordinary least squares),

    的可靠性问题,我们同时对残差

    做了假设,即:

    为均值为0,方差恒定的独立随机变量。

    即为给定自变量

    下,因变量

    的条件均值。

    假如残差

    不满足我们的假设,或者更重要地,我们不仅仅想要知道

    的在给定

    下的条件均值,而且想知道是条件中位数(更一般地,条件分位数),那么OLS下的线性回归就不能满足我们的需求。分位数回归(Quantile Regression)[2]解决了这些问题,下面我先给出一个分位数回归的实际应用例子,再简述其原理,最后再分析其在Python实现的源代码。

    1. 一个例子:收入与食品消费

    这个例子出自statasmodels:Quantile Regression.[3] 我们想探索家庭收入与食品消费的关系,数据出自working class Belgian households in 1857 (the Engel data).我们用Python包statsmodels实现分位数回归。

    1.1 预处理

    %matplotlib inline

    import numpy as np

    import pandas as pd

    import statsmodels.api as sm

    import statsmodels.formula.api as smf

    import matplotlib.pyplot as plt

    data = sm.datasets.engel.load_pandas().data

    data.head()

    income foodexp

    0420.157651255.839425

    1541.411707310.958667

    2901.157457485.680014

    3639.080229402.997356

    4750.875606495.560775

    1.2 中位数回归 (分位数回归的特例,q=0.5)

    mod = smf.quantreg('foodexp ~ income', data)

    res = mod.fit(q=.5)

    print(res.summary())

    QuantReg Regression Results

    ==============================================================================

    Dep. Variable: foodexp Pseudo R-squared: 0.6206

    Model: QuantReg Bandwidth: 64.51

    Method: Least Squares Sparsity: 209.3

    Date: Mon, 21 Oct 2019 No. Observations: 235

    Time: 17:46:59 Df Residuals: 233

    Df Model: 1

    ==============================================================================

    coef std err t P>|t| [0.025 0.975]

    ------------------------------------------------------------------------------

    Intercept 81.4823 14.634 5.568 0.000 52.649 110.315

    income 0.5602 0.013 42.516 0.000 0.534 0.586

    ==============================================================================

    The condition number is large, 2.38e+03. This might indicate that there are

    strong multicollinearity or other numerical problems.

    由结果可以知道

    ,如何得到回归系数的估计?结果中的std err, t, Pseudo R-squared等是什么?我会在稍后解释。

    1.3 数据可视化

    我们先拟合10个分位数回归,分位数q分别在0.05到0.95之间。

    quantiles = np.arange(.05, .96, .1)

    def fit_model(q):

    res = mod.fit(q=q)

    return [q, res.params['Intercept'], res.params['income']] + \

    res.conf_int().loc['income'].tolist()

    models = [fit_model(x) for x in quantiles]

    models = pd.DataFrame(models, columns=['q', 'a', 'b', 'lb', 'ub'])

    ols = smf.ols('foodexp ~ income', data).fit()

    ols_ci = ols.conf_int().loc['income'].tolist()

    ols = dict(a = ols.params['Intercept'],

    b = ols.params['income'],

    lb = ols_ci[0],

    ub = ols_ci[1])

    print(models)

    print(ols)

    q a b lb ub

    0 0.05 124.880096 0.343361 0.268632 0.418090

    1 0.15 111.693660 0.423708 0.382780 0.464636

    2 0.25 95.483539 0.474103 0.439900 0.508306

    3 0.35 105.841294 0.488901 0.457759 0.520043

    4 0.45 81.083647 0.552428 0.525021 0.579835

    5 0.55 89.661370 0.565601 0.540955 0.590247

    6 0.65 74.033435 0.604576 0.582169 0.626982

    7 0.75 62.396584 0.644014 0.622411 0.665617

    8 0.85 52.272216 0.677603 0.657383 0.697823

    9 0.95 64.103964 0.709069 0.687831 0.730306

    {'a': 147.47538852370562, 'b': 0.48517842367692354, 'lb': 0.4568738130184233,

    这里拟合了10个回归,其中q是对应的分位数,a是斜率,b是回归系数。lb和ub分别是b的95%置信区间的下界与上界。

    现在来画出这10条回归线:

    x = np.arange(data.income.min(), data.income.max(), 50)

    get_y = lambda a, b: a + b * x

    fig, ax = plt.subplots(figsize=(8, 6))

    for i in range(models.shape[0]):

    y = get_y(models.a[i], models.b[i])

    ax.plot(x, y, linestyle='dotted', color='grey')

    y = get_y(ols['a'], ols['b'])

    ax.plot(x, y, color='red', label='OLS')

    ax.scatter(data.income, data.foodexp, alpha=.2)

    ax.set_xlim((240, 3000))

    ax.set_ylim((240, 2000))

    legend = ax.legend()

    ax.set_xlabel('Income', fontsize=16)

    ax.set_ylabel('Food expenditure', fontsize=16);

    上图中虚线是分位数回归线,红线是线性最小二乘(OLS)的回归线。通过观察,我们可以发现3个现象:

    随着收入提高,食品消费也在提高。

    随着收入提高,家庭间食品消费的差别拉大。穷人别无选择,富人能选择生活方式,有喜欢吃贵的,也有喜欢吃便宜的。然而我们无法通过OLS发现这个现象,因为它只给了我们一个均值。

    对与穷人来说,OLS预测值过高。这是因为少数的富人拉高了整体的均值,可见OLS对异常点敏感,不是一个稳健的模型。

    2.分位数回归的原理

    这部分是数理统计的内容,只关心如何实现的朋友可以略过。我们要解决以下这几个问题:

    什么是分位数?

    如何求分位数?

    什么是分位数回归?

    分位数回归的回归系数如何求得?

    回归系数的检验如何进行?

    如何评估回归拟合优度?

    2.1 分位数的定义]

    是随机变量,

    的累积密度函数是

    .

    分位数为:

    ,

    假设有100个人,95%的人身高少于1.9m, 1.9m就是身高的95%分位数。

    2.2 分位数的求法

    通过选择不同的

    值,使

    最小,对应的

    值即为

    分位数的估计

    .

    2.3 分位数回归

    对于OLS, 我们有:

    最小化所对应的

    ,类比地,对于

    分位数回归,我们有:

    为最小化:

    即最小化

    所对应的

    2.4 系数估计

    由于

    不能直接对

    求导,我们只能用迭代的方法来逼近

    最小时对应的

    值。statsmodels采用了Iteratively reweighted least squares (IRLS)的方法。

    假设我们要求

    最小化形如下的

    范数:

    则第t+1步迭代的

    值为:

    是对角矩阵且初始值为

    第t次迭代

    以中位数回归为例子(q=0.5),我们求:

    即最小化形如上的

    范数,

    为避免分母为0,我们取

    ,

    是一个很小的数,例如0.0001.

    2.5 回归系数的检验

    我们通过2.4,多次迭代得出

    的估计值,为了得到假设检验的t统计量,我们只需得到

    的方差的估计。

    分位数回归

    的协方差矩阵的渐近估计为:

    其中

    是对角矩阵,

    ,

    , 当

    的估计为

    其中

    为核函数(Kernel),可取Epa,Gaussian等.

    为根据Stata 12所选的窗宽(bandwidth)[5]

    回归结果中的std err即由

    获得,t统计量等于

    2.6 拟合优度

    对于OLS,我们用

    来衡量拟合优度。对于

    分位数回归,我们类比得到:

    ,其中

    为所有

    观察值的

    分位数。

    即为回归结果中的Pseudo R-squared。

    3.Python源码分析

    实现分位数回归的完整源码在 ,里面主要含有两个类QuantReg 和 QuantRegResults. 其中QuantReg是核心,包含了回归系数估计,协方差计算等过程。QuantRegResults计算拟合优度并组织回归结果。

    3.1 QuantReg类

    #QuantReg是包中RegressionModel的一个子类

    class QuantReg(RegressionModel):

    #计算回归系数及其协方差矩阵。q是分位数,vcov是协方差矩阵,默认robust即2.5的方法。核函数kernel默认

    #epa,窗宽bandwidth默认hsheather.IRLS最大迭代次数默认1000,差值默认小于1e-6时停止迭代

    def fit(self, q=.5, vcov='robust', kernel='epa', bandwidth='hsheather',

    max_iter=1000, p_tol=1e-6, **kwargs):

    """

    Solve by Iterative Weighted Least Squares

    Parameters

    ----------

    q : float

    Quantile must be between 0 and 1

    vcov : str, method used to calculate the variance-covariance matrix

    of the parameters. Default is ``robust``:

    - robust : heteroskedasticity robust standard errors (as suggested

    in Greene 6th edition)

    - iid : iid errors (as in Stata 12)

    kernel : str, kernel to use in the kernel density estimation for the

    asymptotic covariance matrix:

    - epa: Epanechnikov

    - cos: Cosine

    - gau: Gaussian

    - par: Parzene

    bandwidth : str, Bandwidth selection method in kernel density

    estimation for asymptotic covariance estimate (full

    references in QuantReg docstring):

    - hsheather: Hall-Sheather (1988)

    - bofinger: Bofinger (1975)

    - chamberlain: Chamberlain (1994)

    """

    if q < 0 or q > 1:

    raise Exception('p must be between 0 and 1')

    kern_names = ['biw', 'cos', 'epa', 'gau', 'par']

    if kernel not in kern_names:

    raise Exception("kernel must be one of " + ', '.join(kern_names))

    else:

    kernel = kernels[kernel]

    if bandwidth == 'hsheather':

    bandwidth = hall_sheather

    elif bandwidth == 'bofinger':

    bandwidth = bofinger

    elif bandwidth == 'chamberlain':

    bandwidth = chamberlain

    else:

    raise Exception("bandwidth must be in 'hsheather', 'bofinger', 'chamberlain'")

    #endog样本因变量,exog样本自变量

    endog = self.endog

    exog = self.exog

    nobs = self.nobs

    exog_rank = np.linalg.matrix_rank(self.exog)

    self.rank = exog_rank

    self.df_model = float(self.rank - self.k_constant)

    self.df_resid = self.nobs - self.rank

    #IRLS初始化

    n_iter = 0

    xstar = exog

    beta = np.ones(exog_rank)

    # TODO: better start, initial beta is used only for convergence check

    # Note the following does not work yet,

    # the iteration loop always starts with OLS as initial beta

    # if start_params is not None:

    # if len(start_params) != rank:

    # raise ValueError('start_params has wrong length')

    # beta = start_params

    # else:

    # # start with OLS

    # beta = np.dot(np.linalg.pinv(exog), endog)

    diff = 10

    cycle = False

    history = dict(params = [], mse=[])

    #IRLS迭代

    while n_iter < max_iter and diff > p_tol and not cycle:

    n_iter += 1

    beta0 = beta

    xtx = np.dot(xstar.T, exog)

    xty = np.dot(xstar.T, endog)

    beta = np.dot(pinv(xtx), xty)

    resid = endog - np.dot(exog, beta)

    mask = np.abs(resid) < .000001

    resid[mask] = ((resid[mask] >= 0) * 2 - 1) * .000001

    resid = np.where(resid < 0, q * resid, (1-q) * resid)

    resid = np.abs(resid)

    #1/resid[:, np.newaxis]为更新权重W

    xstar = exog / resid[:, np.newaxis]

    diff = np.max(np.abs(beta - beta0))

    history['params'].append(beta)

    history['mse'].append(np.mean(resid*resid))

    #检查是否收敛,若收敛则提前停止迭代

    if (n_iter >= 300) and (n_iter % 100 == 0):

    # check for convergence circle, should not happen

    for ii in range(2, 10):

    if np.all(beta == history['params'][-ii]):

    cycle = True

    warnings.warn("Convergence cycle detected", ConvergenceWarning)

    break

    if n_iter == max_iter:

    warnings.warn("Maximum number of iterations (" + str(max_iter) +

    ") reached.", IterationLimitWarning)

    #计算协方差矩阵

    e = endog - np.dot(exog, beta)

    # Greene (2008, p.407) writes that Stata 6 uses this bandwidth:

    # h = 0.9 * np.std(e) / (nobs**0.2)

    # Instead, we calculate bandwidth as in Stata 12

    iqre = stats.scoreatpercentile(e, 75) - stats.scoreatpercentile(e, 25)

    h = bandwidth(nobs, q)

    h = min(np.std(endog),

    iqre / 1.34) * (norm.ppf(q + h) - norm.ppf(q - h))

    fhat0 = 1. / (nobs * h) * np.sum(kernel(e / h))

    if vcov == 'robust':

    d = np.where(e > 0, (q/fhat0)**2, ((1-q)/fhat0)**2)

    xtxi = pinv(np.dot(exog.T, exog))

    xtdx = np.dot(exog.T * d[np.newaxis, :], exog)

    vcov = chain_dot(xtxi, xtdx, xtxi)

    elif vcov == 'iid':

    vcov = (1. / fhat0)**2 * q * (1 - q) * pinv(np.dot(exog.T, exog))

    else:

    raise Exception("vcov must be 'robust' or 'iid'")

    #用系数估计值和协方差矩阵创建一个QuantResults对象,并输出结果

    lfit = QuantRegResults(self, beta, normalized_cov_params=vcov)

    lfit.q = q

    lfit.iterations = n_iter

    lfit.sparsity = 1. / fhat0

    lfit.bandwidth = h

    lfit.history = history

    return RegressionResultsWrapper(lfit)

    #核函数表达式

    def _parzen(u):

    z = np.where(np.abs(u) <= .5, 4./3 - 8. * u**2 + 8. * np.abs(u)**3,

    8. * (1 - np.abs(u))**3 / 3.)

    z[np.abs(u) > 1] = 0

    return z

    kernels = {}

    kernels['biw'] = lambda u: 15. / 16 * (1 - u**2)**2 * np.where(np.abs(u) <= 1, 1, 0)

    kernels['cos'] = lambda u: np.where(np.abs(u) <= .5, 1 + np.cos(2 * np.pi * u), 0)

    kernels['epa'] = lambda u: 3. / 4 * (1-u**2) * np.where(np.abs(u) <= 1, 1, 0)

    kernels['gau'] = lambda u: norm.pdf(u)

    kernels['par'] = _parzen

    #kernels['bet'] = lambda u: np.where(np.abs(u) <= 1, .75 * (1 - u) * (1 + u), 0)

    #kernels['log'] = lambda u: logistic.pdf(u) * (1 - logistic.pdf(u))

    #kernels['tri'] = lambda u: np.where(np.abs(u) <= 1, 1 - np.abs(u), 0)

    #kernels['trw'] = lambda u: 35. / 32 * (1 - u**2)**3 * np.where(np.abs(u) <= 1, 1, 0)

    #kernels['uni'] = lambda u: 1. / 2 * np.where(np.abs(u) <= 1, 1, 0)

    #窗宽计算

    def hall_sheather(n, q, alpha=.05):

    z = norm.ppf(q)

    num = 1.5 * norm.pdf(z)**2.

    den = 2. * z**2. + 1.

    h = n**(-1. / 3) * norm.ppf(1. - alpha / 2.)**(2./3) * (num / den)**(1./3)

    return h

    def bofinger(n, q):

    num = 9. / 2 * norm.pdf(2 * norm.ppf(q))**4

    den = (2 * norm.ppf(q)**2 + 1)**2

    h = n**(-1. / 5) * (num / den)**(1. / 5)

    return h

    def chamberlain(n, q, alpha=.05):

    return norm.ppf(1 - alpha / 2) * np.sqrt(q*(1 - q) / n)

    3.2 QuantRegResults类

    这里我只给出计算拟合优度的代码。

    class QuantRegResults(RegressionResults):

    '''Results instance for the QuantReg model'''

    @cache_readonly

    def prsquared(self):

    q = self.q

    endog = self.model.endog

    #e为残差

    e = self.resid

    e = np.where(e < 0, (1 - q) * e, q * e)

    e = np.abs(e)

    ered = endog - stats.scoreatpercentile(endog, q * 100)

    ered = np.where(ered < 0, (1 - q) * ered, q * ered)

    ered = np.abs(ered)

    return 1 - np.sum(e) / np.sum(ered)

    4.总结

    上文我先给出了一个分位数回归的应用例子,进而叙述了分位数回归的原理,最后再分析了Python实现的源码。

    分位数回归对比起OLS回归,虽然较为复杂,但它有三个主要优势:

    能反映因变量分位数与自变量的关系,而不仅仅反映因变量均值与自变量的关系。

    分位数回归对残差不作任何假设。

    分位数回归受异常点的影响较小。

    参考

    展开全文
  • 分位数回归已经获得了巨大的发展,不仅可以进行简单的横截面数据的估计,而且还可以进行panel数据模型估计、干预效应模型估计、计数模型估计、因变量是区间值的logistic模型估计、工具变量估计等。

    一、基本介绍

    回归分析的主要目的:实证检验理论分析中因变量与自变量之间的关系。传统的均值回归,主要使用因变量的条件均值函数来描述在自变量每一个特定数值下的因变量的均值,从而揭示自变量与因变量的关系。

    条件均值模型存在不足:当研究收入分配等问题时,我们可能主要关注的是处于分布低尾的穷人和分布高尾的富人等处于因变量非中心位置的情况,而 (1) 条件均值模型主要考虑的是因变量的均值,难以扩展到这种非中心位置,此时只能使用分位数模型进行估计。此外,(2) 条件均值模型经常受到离群值的困扰。在使用条件均值模型进行实证研究时,面对存在离群值的样本数据时,最常使用的方法是对数据进行缩尾,剔除离群值。然而,很多时候剔除离群值会导致对中心位置的测度具有误导性结论。尤其, (3) 条件均值模型假定残差项服从独立同分布、正态性、方差齐性等关键问题在现实中难以满足

    因此,提出了中位数模型替代条件均值模型中位数是表示分布的中心位置,即0.5分位数。其他位置上的分位数则描述了一种分布的非中心位置。随着协变量的变化,分位数回归模型强调了条件分位数的变化由于所有分位数都是可用的,所以对任何预先决定的分布位置进行建模都是可能的。因此,可以对分布的任意非中心位置进行建模,可选的研究的问题也就变得更加广泛。例如贫困问题(对穷人进行研究)、收入分配问题(穷人与富人的收入),教育问题(好成绩与差成绩),税收问题(对穷人与富人的不同影响)等等。与条件均值模型相比,分位数回归则具有无法比拟的优势。

    普通最小二乘估计(OLS)与分位数回归估计的异同
    在这里插入图片描述
    分位数回归是估计一组回归变量X与被解释变量Y的分位数之间线性关系的建模方法。以往的回归模型实际上是研究被解释变量的条件期望。而人们也关心解释变量与被解释变量分布的中位数、分位数呈何种关系。它最早由Koenker和Bassett(1978)提出。

    OLS回归估计量的计算是基于最小化残差平方。分位数回归估计量的计算也是基于一种非对称形式的绝对值残差最小化。其中,中位数回归运用的是最小绝对值离差估计(LAD,least absolute deviations estimator)。

    分位数回归的优点
    (1) 能够更加全面的描述被解释变量条件分布的全貌,而不是仅仅分析被解释变量的条件期望(均值),也可以分析解释变量如何影响被解释变量的中位数、分位数等。不同分位数下的回归系数估计量常常不同,即解释变量对不同水平被解释变量的影响不同。
    (2) 中位数回归的估计方法与最小二乘法相比,估计结果对离群值则表现的更加稳健,而且,分位数回归对误差项并不要求很强的假设条件,因此对于非正态分布而言,分位数回归系数估计量则更加稳健。

    目前,分位数回归已经获得了巨大的发展,不仅可以进行简单的横断面数据的估计,而且还可以进行panel数据模型估计、干预效应模型估计、计数模型估计、因变量是区间值的logistic模型估计、工具变量估计等。

    二、使用分位数回归的原因

    大部分的计量模型都是在估计条件期望值,因为条件期望值是因变量最好的估计值。对于非连续变量,期望值本身已经能够很大程度上描述出随机变量的分布。但是对于连续变量,仅仅依靠期望值并不能完整描述出变量的分布形态。比如收入水平,中位数相比于平均数更有代表性。因为平均数容易受到异常值的影响,如果只考虑平均值,那么穷人就会被富人代表,一个国家的平均收入也许很高,但是这或许只能代表一小部分人,而中位数则能代表大部分普通人的真实收入。

    下面这幅散点图反映了个人智商水平(IQ)和收入水平(wage)之间的关系,其中红线就是使用 OLS 进行线性回归得到的蓝线从上至下依次为 0.9 分位数、中位数、0.1 分位数的回归线。可以发现,对于前 10% 的收入群体,IQ 的增长对收入的边际效应更为明显。所以,使用分位数回归能够更加全面完整的分析因变量的条件分布
    在这里插入图片描述

    三、R 语言实现分位数回归

    R语言进行分位数回归需要quantreg包,其中, rq()函数的用法和 lm() 类似,但是多了一个设定分位数的参数 tau,这个参数可以接受单个值,也可以接受向量值。plot() 函数则可以绘制不同分位数回归的系数值的折线图,和 OLS 线性回归的系数值做比较。

    本文使用wooldridgeR包的示例数据集 wage2 进行解释说明,回归的因变量是收入水平 wageIQ某种程度上可以指代受访者的个人能力,educ 表示受访者的受教育年限,marriedblack 都分类变量,取值 1 表示受访者分别为已婚和黑裔。

    首先只采用 IQ 作为自变量进行回归,分位数选取 [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9]。

    library(tidyverse)
    library(wooldridge)
    library(quantreg)
    library(AER)
    
    ### 查看分布
    ggplot(data = wage2, mapping = aes(x = IQ, y = wage)) +
      geom_point() +
      geom_quantile(quantiles = c(0.1, 0.5, 0.9), size = 1) +
      geom_smooth(method = "lm", color = "red", se = F) +
      theme_bw()
    

    在这里插入图片描述

    ### OLS回归
    wage_lm1 <- lm(wage ~ IQ, data = wage2)
    ### 分位数回归
    wage_qr1 <- rq(wage ~ IQ, data = wage2, tau = 1:9/10)
    
    ### OLS回归和分位数回归线
    ggplot(data = wage2, aes(x = IQ, y = wage)) +
      geom_point() +
      geom_abline(intercept = coef(wage_qr1)[1, ], slope = coef(wage_qr1)[2, ], color = "blue") +
      geom_abline(intercept = coef(wage_lm1)[1], slope = coef(wage_lm1)[2], color = "red") +
      theme_bw()
    

    在这里插入图片描述

    summary(wage_lm1)
    # Call:
    #   lm(formula = wage ~ IQ, data = wage2)
    # 
    # Residuals:
    #   Min     1Q Median     3Q    Max 
    # -898.7 -256.5  -47.3  201.1 2072.6 
    # 
    # Coefficients:
    #   Estimate Std. Error t value Pr(>|t|)    
    # (Intercept) 116.9916    85.6415   1.366    0.172    
    # IQ            8.3031     0.8364   9.927   <2e-16 ***
    #   ---
    #   Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
    # 
    # Residual standard error: 384.8 on 933 degrees of freedom
    # Multiple R-squared:  0.09554,	Adjusted R-squared:  0.09457 
    # F-statistic: 98.55 on 1 and 933 DF,  p-value: < 2.2e-16
    
    summary(wage_qr1)
    wage_qr1
    # Call:
    #   rq(formula = wage ~ IQ, tau = 1:9/10, data = wage2)
    # 
    # Coefficients:
    #   tau= 0.1  tau= 0.2  tau= 0.3  tau= 0.4 tau= 0.5 tau= 0.6   tau= 0.7  tau= 0.8  tau= 0.9
    # (Intercept) 100.846154 76.096774 33.333333 52.769231   87.500       81 187.958333 174.81633 214.65517
    # IQ            4.173077  5.580645  6.933333  7.576923    8.125        9   9.041667  10.53061  11.93103
    # 
    # Degrees of freedom: 935 total; 933 residual
    
    ### 分位数回归和OLS回归系数对比图
    plot(summary(wage_qr1), parm = "IQ")
    

    在这里插入图片描述

    上述回归只有一个变量 IQ,根据分位数回归结果可知,个人能力对收入水平的边际效应对于前 10% 的收入群体更为明显,回归系数的折线图直观反映了这一特点。比如对于 0.9 分位数回归,自变量系数为 11.93103,即个人能力每增长一个单位,0.9 分位数对应的工资水平增长约 11.93。图中的红色直线为 OLS 回归的系数估计值,红色虚线为估计值的置信区间。

    下面我们将另外三个变量添加进 OLS 回归和分位数回归,和之前相比,个人能力对收入水平的边际效应有所降低。

    wage_lm2 <- lm(wage ~ IQ + educ + married + black, data = wage2)
    wage_qr2 <- rq(wage ~ IQ + educ + married + black, data = wage2, tau = 1:9/10)
    summary(wage_lm2)
    # Call:
    #   lm(formula = wage ~ IQ + educ + married + black, data = wage2)
    # 
    # Residuals:
    #   Min      1Q  Median      3Q     Max 
    # -853.23 -247.90  -27.76  186.07 2081.80 
    # 
    # Coefficients:
    #   Estimate Std. Error t value Pr(>|t|)    
    # (Intercept) -196.726    106.521  -1.847  0.06509 .  
    # IQ             3.944      1.002   3.935 8.94e-05 ***
    #   educ          44.472      6.446   6.899 9.68e-12 ***
    #   married      192.749     39.307   4.904 1.11e-06 ***
    #   black       -124.086     39.344  -3.154  0.00166 ** 
    #   ---
    #   Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
    # 
    # Residual standard error: 370 on 930 degrees of freedom
    # Multiple R-squared:  0.1662,	Adjusted R-squared:  0.1626 
    # F-statistic: 46.34 on 4 and 930 DF,  p-value: < 2.2e-16
    
    summary(wage_qr2)
    wage_qr2
    # Call:
    #   rq(formula = wage ~ IQ + educ + married + black, tau = 1:9/10, 
    #      data = wage2)
    # 
    # Coefficients:
    #   tau= 0.1    tau= 0.2    tau= 0.3 tau= 0.4    tau= 0.5    tau= 0.6    tau= 0.7   tau= 0.8    tau= 0.9
    # (Intercept)    30.00 -104.717514 -120.538462   -121.4 -168.230769 -206.190476 -254.484848 -380.45455 -476.949275
    # IQ              2.00    3.028249    3.769231      3.6    4.153846    3.539683    4.139394    5.69697    6.963768
    # educ           16.25   26.683616   26.038462     33.6   38.230769   50.333333   56.842424   60.94444   76.550725
    # married        94.00  126.559322  161.692308    168.0  194.769231  222.126984  221.018182  238.93939  180.311594
    # black         -74.00  -97.502825 -103.730769    -94.6 -118.846154 -141.809524 -141.521212 -124.66667  -37.985507
    # 
    # Degrees of freedom: 935 total; 930 residual
    
    plot(summary(wage_qr2), parm = c("IQ", "educ", "married", "black"))
    

    在这里插入图片描述
    根据回归系数的折线图我们可知,educ对收入水平的边际效应随着分位数的增加而增加,也就是说对于高收入群体其边际效应更大一些。IQ 代表的个人能力虽然有所波动,但整体随着分位数向上。married 婚姻状态比较有意思的是对于处于社会财富前 10% 的收入群体,其边际效应并不是最高的。联想到前段时间离婚的某些富豪,好像也就不难理解了。black 的分位数回归系数曲线是这四个变量中最为特殊的,不论处于哪一个收入水平段,黑人族裔身份都会带来负面影响,并且在中产阶级中最为显著。

    参考阅读:
    【R语言】横截面数据分位数回归简介
    【R语言】生存分析, 用R语言进行分位数回归(Quantile Regression)
    【Stata+R】分位数回归一文读懂
    【Stata】分位数回归
    【Stata】qregplot:分位数回归图示
    【SPSS】分位数回归[Quantile regression]

    展开全文
  • 论文研究-基于LASSO分位数回归的中期电力负荷概率密度预测方法.pdf, 中期电力负荷预测过程中往往会受到多种外界因素(诸如温度、节假日、风力大小等)的不确定性干扰,...
  • 这种理论也可以在预测统计中为我们服务,这正是分位数回归的意义所在——估计中位数(或其他分位数)而不是平均值。 通过选择任何特定的分位数阈值,我们既可以缓和异常值,也可以调整错误的正/负权衡。我们还可以...

    普通最小二乘法如何处理异常值? 它对待一切事物都是一样的——它将它们平方! 但是对于异常值,平方会显著增加它们对平均值等统计数据的巨大影响。

    我们从描述性统计中知道,中位数对异常值的鲁棒性比均值强。 这种理论也可以在预测统计中为我们服务,这正是分位数回归的意义所在——估计中位数(或其他分位数)而不是平均值。 通过选择任何特定的分位数阈值,我们既可以缓和异常值,也可以调整错误的正/负权衡。我们还可以处理需要分位数界限的情况,例如:婴儿的安全出生体重,顶级竞技电子竞技玩家的技能水平,等等。

    什么是分位数?

    分位数(Quantile),亦称分位点,是指将一个随机变量的概率分布范围分为几个等份的数值点,常用的有中位数(即二分位数)、四分位由3个部分组成(第25、50和75个百分位,常用于箱形图)和百分位数等。

    什么是分位数回归?

    分位数回归是简单的回归,就像普通的最小二乘法一样,但不是最小化平方误差的总和,而是最小化从所选分位数切点产生的绝对误差之和。 如果 q=0.50(中位数),那么分位数回归会出现一个特殊情况 - 最小绝对误差(因为中位数是中心分位数)。我们可以通过调整超参数 q,选择一个适合平衡特定于需要解决问题的误报和漏报的阈值。

    statsmodels中的分位数回归

    分位数回归是一种不太常见的模型,但 Python中的StatsModel库提供了他的实现。这个库显然受到了R的启发,并从它借鉴了各种语法和API。

    StatsModel使用的范例与scikit-learn稍有不同。但是与scikit-learn一样,对于模型对象来说,需要公开一个.fit()方法来实际训练和预测。但是不同的是scikit-learn模型通常将数据(作为X矩阵和y数组)作为.fit()的参数,而StatsModel是在初始化对象时传入数据,而fit方法只传递一些可以调试的超参数。

    下面是来自statsmodel的例子(Engel数据集包含在与statmodels中)

    %matplotlib inline
    import numpy as np
    import pandas as pd
    import statsmodels.api as sm
    import statsmodels.formula.api as smf
    import matplotlib.pyplot as plt
    
    data = sm.datasets.engel.load_pandas().data
    mod = smf.quantreg("foodexp ~ income", data)
    res = mod.fit(q=0.5)
    print(res.summary())
    

    我们可以看看quantile regression model fit的帮助文档:

    help(quant_mod.fit)
    

    分位数回归与线性回归

    标准最小二乘回归模型仅对响应的条件均值进行建模,并且计算成本较低。 相比之下,分位数回归最常用于对响应的特定条件分位数进行建模。 与最小二乘回归不同,分位数回归不假设响应具有特定的参数分布,也不假设响应具有恒定方差。

    下表总结了线性回归和分位数回归之间的一些重要区别:

    xgboost的分位数回归

    最后如果想使用xgboost,又想试试分位数回归,那么可以参考以下代码

    class XGBQuantile(XGBRegressor):
      def __init__(self,quant_alpha=0.95,quant_delta = 1.0,quant_thres=1.0,quant_var =1.0,base_score=0.5, booster='gbtree', colsample_bylevel=1,
                    colsample_bytree=1, gamma=0, learning_rate=0.1, max_delta_step=0,max_depth=3, min_child_weight=1, missing=None, n_estimators=100,
                    n_jobs=1, nthread=None, objective='reg:linear', random_state=0,reg_alpha=0, reg_lambda=1, scale_pos_weight=1, seed=None,silent=True, subsample=1):
        self.quant_alpha = quant_alpha
        self.quant_delta = quant_delta
        self.quant_thres = quant_thres
        self.quant_var = quant_var
        
        super().__init__(base_score=base_score, booster=booster, colsample_bylevel=colsample_bylevel,
           colsample_bytree=colsample_bytree, gamma=gamma, learning_rate=learning_rate, max_delta_step=max_delta_step,
           max_depth=max_depth, min_child_weight=min_child_weight, missing=missing, n_estimators=n_estimators,
           n_jobs= n_jobs, nthread=nthread, objective=objective, random_state=random_state,
           reg_alpha=reg_alpha, reg_lambda=reg_lambda, scale_pos_weight=scale_pos_weight, seed=seed,
           silent=silent, subsample=subsample)
        
        self.test = None
      
      def fit(self, X, y):
        super().set_params(objective=partial(XGBQuantile.quantile_loss,alpha = self.quant_alpha,delta = self.quant_delta,threshold = self.quant_thres,var = self.quant_var) )
        super().fit(X,y)
        return self
      
      def predict(self,X):
        return super().predict(X)
      
      def score(self, X, y):
        y_pred = super().predict(X)
        score = XGBQuantile.quantile_score(y, y_pred, self.quant_alpha)
        score = 1./score
        return score
          
      @staticmethod
      def quantile_loss(y_true,y_pred,alpha,delta,threshold,var):
        x = y_true - y_pred
        grad = (x<(alpha-1.0)*delta)*(1.0-alpha)-  ((x>=(alpha-1.0)*delta)& (x<alpha*delta) )*x/delta-alpha*(x>alpha*delta)
        hess = ((x>=(alpha-1.0)*delta)& (x<alpha*delta) )/delta 
     
        grad = (np.abs(x)<threshold )*grad - (np.abs(x)>=threshold )*(2*np.random.randint(2, size=len(y_true)) -1.0)*var
        hess = (np.abs(x)<threshold )*hess + (np.abs(x)>=threshold )
        return grad, hess
      
      @staticmethod
      def original_quantile_loss(y_true,y_pred,alpha,delta):
        x = y_true - y_pred
        grad = (x<(alpha-1.0)*delta)*(1.0-alpha)-((x>=(alpha-1.0)*delta)& (x<alpha*delta) )*x/delta-alpha*(x>alpha*delta)
        hess = ((x>=(alpha-1.0)*delta)& (x<alpha*delta) )/delta 
        return grad,hess
    
      
      @staticmethod
      def quantile_score(y_true, y_pred, alpha):
        score = XGBQuantile.quantile_cost(x=y_true-y_pred,alpha=alpha)
        score = np.sum(score)
        return score
      
      @staticmethod
      def quantile_cost(x, alpha):
        return (alpha-1.0)*x*(x<0)+alpha*x*(x>=0)
      
      @staticmethod
      def get_split_gain(gradient,hessian,l=1):
        split_gain = list()
        for i in range(gradient.shape[0]):
          split_gain.append(np.sum(gradient[:i])/(np.sum(hessian[:i])+l)+np.sum(gradient[i:])/(np.sum(hessian[i:])+l)-np.sum(gradient)/(np.sum(hessian)+l) )
        
        return np.array(split_gain)
    

    https://gist.github.com/benoitdescamps/af5a8e42d5cfc7981e960e4d559dad19#file-xgboostquantile-py

    对于LightGBM这里有一篇详细的实现文章:

    http://jmarkhou.com/lgbqr/

    展开全文
  • 摘要 贝叶斯回归分位数在最近的文献中受到广泛关注,本文实现了贝叶斯系数估计和回归分位数(RQ)中的变量选择,带有lasso和自适应...自引入以来,分位数回归一直是理论界非常关注的话题,也在许多研究领域得到了.

    原文链接:http://tecdat.cn/?p=22702

    原文出处:拓端数据部落公众号

    摘要

    贝叶斯回归分位数在最近的文献中受到广泛关注,本文实现了贝叶斯系数估计和回归分位数(RQ)中的变量选择,带有lasso和自适应lasso惩罚的贝叶斯。还包括总结结果、绘制路径图、后验直方图、自相关图和绘制分位数图的进一步建模功能。

    简介

    回归分位数(RQ)由(Koenker和Gilbert,1978)提出,将感兴趣的结果的条件分位数作为预测因子的函数来建模。自引入以来,分位数回归一直是理论界非常关注的话题,也在许多研究领域得到了大量的应用,如计量经济学、市场营销、医学、生态学和生存分析(Neelon等,2015;Davino等,2013;Hao和Naiman,2007)。假设我们有一个观察样本{(xi , yi);i = 1, 2, - -, n},其中yi表示因变量,xi表示协变量的k维矢量。 

    贝叶斯分位数回归

    Tobit RQ为描述非负因变量和协变量向量之间的关系提供了一种方法,可以被表述为因变量的数据未被完全观察到的分位数回归模型。关于Tobit 分位数回归模型有相当多的文献,我们可以参考Powell(1986)、Portnoy(2003)、Portnoy和Lin(2010)以及Kozumi和Kobayashi(2011)来了解概况。考虑一下这个模型。

    其中,yi是观察到的因变量,y∗i是相应的潜在的未观察到的因变量,y 0是一个已知的点。可以证明,RQ系数向量β可以通过以下最小化问题的解来持续估计

    Yu和Stander(2007)提出了一种Tobit RQ的贝叶斯方法,使用ALD计算误差,并使用Metropolis-Hastings(MH)方法从其后验分布中抽取β。


    真实数据实例

    我们考虑用真实的数据例子。

    免疫球蛋白G数据

    这个数据集包括298名6个月到6岁儿童的免疫球蛋白G的血清浓度(克/升),Isaacs等人(1983)对其进行了详细讨论,Yu等人(2003)也使用了该数据集。为了说明问题,该数据集的贝叶斯分位数回归模型(可以拟合如下)。 

    rq(血清浓度~年龄, tau=0.5, runs=2000)
    
    

    摘要函数提供估计值和95%的置信区间

     

    绘制数据,然后将五条拟合的RQ线叠加在散点图上。 

    
    R> for (i in 1:5) {
    + taus=c(0.05, 0.25, 0.5, 0.75, 0.95)
    + rq(tau=taus[i],runs=500, burn=100)
    + abline(fit, col=i)
    + }
    R> 
    R> for (i in 1:5) {
    + fit = rq(年龄+I(年龄^2),tau=taus[i],runs=500, burn=100)
    + curve(,add=TRUE)
    + }
    

    图2:免疫球蛋白G数据的散点图和RQ拟合。

    该图显示了298名6个月至6岁儿童的免疫球蛋白G的散点图。叠加在该图上的是{.05, .25, .50, .75, .95}的RQ线(左图)和 RQ线(左图)和RQ曲线(右图)。

    图可以用来评估吉布斯采样向平稳分布的收敛情况。我们在图1中只报告了τ=0.50时每个参数的路径图和后验直方图。我们使用以下代码

    plot(fit,"tracehist",D=c(1,2))
    
    

    可以通过生成路径图、后验直方图、自相关图来对Gibbs采样的绘制结果进行图形总结。路径和直方图,路径和自相关,直方图和自相关,以及路径、直方图和自相关。这个函数还有一个选项。在图3中,免疫球蛋白G数据系数的路径图表明,采样从后验空间的一个偏远区域跳到另一个区域的步骤相对较少。此外,直方图显示边际密度实际上是所期望的平稳的单变量常态。

    图3:当τ=0.50时,免疫球蛋白G数据集的系数的路径和密度图。

    前列腺癌数据

    在本小节中,我们说明贝叶斯分位数回归在前列腺癌数据集(Stamey等人,1989)上的表现。该数据集调查了等待根治性前列腺切除术的病人的前列腺特异性抗原(lpsa)水平和八个协变量之间的关系。

    这些协变量是:癌症对数体积(lcavol)、前列腺的对数重量(lweight)、年龄(age)、良性前列腺的对数体积(lbph)、精囊侵犯(svi)、胶囊穿透的对数(lcp)、格里森评分(gleason)以及格里森评分4或5的百分比(pgg45)。

    在本小节中,我们假设因变量(lpsa)均值为零,而预测因子已被标准化,均值为零。为了说明问题,我们考虑当τ=0.50时,贝叶斯lasso套索RQ(方法="BLqr")。在这种情况下,我们使用以下代码

    
    R> x=as.matrix(x)
    R> rq(y~x,tau = 0.5, method="BLqr", runs = 5000, burn = 1000, thin = 1)
    
    

    模型法可用于确定回归中的活跃变量。 

    相应的吉布斯采样的收敛性是通过生成样本的路径图和边际后验直方图评估的。因此,图可以用来提供一个关于吉布斯采样器收敛的图形检查,通过使用以下代码检查路径图和边际后验直方图。
     

    plot(fit, type="trace")
    

    上述代码的结果分别显示在图4和图5中。图4中的路径图显示,生成的样本迅速穿越了后验空间,图5中的边际后验直方图显示,条件后验分布实际上是所需的平稳单变量常态。 

    小麦数据

    我们考虑一个小麦数据集。这个数据集来自于国家小麦种植发展计划(2017)。这个小麦数据由11个变量的584个观测值组成。因变量是每2500平方米小麦产量增加的百分比。协变量是化肥尿素(U)、小麦种子播种日期(Ds)、小麦种子播种量(Qs)、激光平田技术(LT)、复合肥施肥(NPK)、播种机技术(SMT)、绿豆作物种植(SC)、作物除草剂(H)、作物高钾肥(K)、微量元素肥料(ME)。

    下面的命令给出了τ=0.50时Tobit RQ的后验分布。

    rq(y~x,tau=0.5, methods="Btqr")
    

     还可以拟合贝叶斯lassoTobit 分位数回归和贝叶斯自适应lassoTobit 分位数回归。当τ=0.50时,函数可以用来获得Tobit 分位数回归的后验平均值和95%的置信区间。 

    结论

    在本文中,我们已经说明了在分位数回归(RQ)中进行贝叶斯系数估计和变量选择。此外,本文还实现了带有lasso和自适应lasso惩罚的贝叶斯Tobit 分位数回归。还包括总结结果、绘制路径图、后验直方图、自相关图和绘制定量图的进一步建模。

    参考文献

    Alhamzawi, R., K. Yu, and D. F. Benoit (2012). Bayesian adaptive lasso quantile regression. Statistical Modelling 12 (3), 279–297.

    Brownlee, K. A. (1965). Statistical theory and methodology in science and engineering, Volume 150. Wiley New York.

    Davino, C., M. Furno, and D. Vistocco (2013). Quantile regression: theory and applications. John Wiley & Sons.


    最受欢迎的见解

    1.matlab使用贝叶斯优化的深度学习

    2.matlab贝叶斯隐马尔可夫hmm模型实现

    3.R语言Gibbs抽样的贝叶斯简单线性回归仿真

    4.R语言中的block Gibbs吉布斯采样贝叶斯多元线性回归

    5.R语言中的Stan概率编程MCMC采样的贝叶斯模型

    6.Python用PyMC3实现贝叶斯线性回归模型

    7.R语言使用贝叶斯 层次模型进行空间数据分析

    8.R语言随机搜索变量选择SSVS估计贝叶斯向量自回归(BVAR)模型

    9.matlab贝叶斯隐马尔可夫hmm模型实现

    展开全文
  • 基于非对称拉普拉斯分布的吉布斯采样算法,本文从贝叶斯的角度考虑了自适应拉索和拉索罚分的分位数回归。 在非贝叶斯和贝叶斯框架下,针对具有不同分布和异方差的误差项,系统比较了几种正则化分位数回归方法。 在...
  • 分位数回归及其实例

    千次阅读 2021-04-22 02:53:01
    分位数回归及其实例一、分位数回归的概念分位数回归(Quantile Regression):是计量经济学的研究前沿方向之一,它利用解释变量的多个分位数(例如四分位、十分位、百分位等)来得到被解释变量的条件分布的相应的分位数...
  • 分位数回归 CAViaR

    2014-10-06 22:12:05
    CAViaR:基于分位数回归和条件自回归风险价值模型计算风险价值
  • 分位数估计 使用 callibrartion 进行分位数估计

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 9,884
精华内容 3,953
关键字:

分位数回归

友情链接: SMR1602-J.rar