You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何Statsmodels非标准化数据下分位数回归系数与SAS不同?

为什么Statsmodels分位数回归在非标准化年份数据下与SAS结果不一致?

问题背景

给定数据集:

import pandas as pd
df = pd.DataFrame({
    'year': [2000]*5 + [2001]*5 + [2002]*5,
    'metric': [2,3,4,5,6,12,13,14,15,16,22,23,24,25,26]
})

使用Statsmodels执行0.5分位数(中位数)回归:

import statsmodels.formula.api as smf
model = smf.quantreg('metric ~ year', df)
result = model.fit(q=0.5, vcov='robust', kernel='epa', bandwidth='hsheather', max_iter=1000, p_tol=1e-06)

出现以下问题:

  • 已知三年的metric中位数分别为4、14、24,理论回归系数应为10(与SAS PROC QUANTREG结果一致),但Statsmodels输出的系数不符合预期
  • 调整kernel、bandwidth等参数后结果无变化
  • Statsmodels输出提示:condition number is large
  • 将年份标准化为0、0.5、1后,Statsmodels回归系数变为20,与SAS结果(按尺度换算后)一致

核心原因

问题出在设计矩阵的数值尺度失衡导致的数值稳定性问题:

  1. 病态设计矩阵:当使用原始年份值(2000、2001、2002)时,设计矩阵包含截距项(对应year=0时的预测值)和大数值的year变量,两者的数值尺度差异极大。这种差异会导致设计矩阵的条件数过高——条件数越大,矩阵越接近奇异,数值计算中的误差会被严重放大,干扰优化算法的收敛。
  2. 优化算法收敛问题:Statsmodels分位数回归使用的优化算法(内点法或单纯形法)在处理病态矩阵时,容易因数值精度限制无法找到全局最优解,反而收敛到局部最优或者偏离预期的结果。而SAS的PROC QUANTREG可能内部对设计矩阵做了数值稳定处理(比如中心化、缩放),或者采用了更鲁棒的数值计算策略,因此能直接得到理论预期的结果。
  3. 标准化后的一致性:将年份标准化为0、0.5、1后,变量尺度与截距项趋于均衡,条件数大幅降低,优化算法能稳定收敛到全局最优解。此时得到的系数20对应原尺度下的10(因为标准化后year每变化0.5等价于原year变化1,所以系数=10/0.5=20),和SAS结果完全一致。

验证与解决办法

  • 验证条件数:运行print(result.model.exog.cond())可以看到,原始year的条件数远高于标准化后的数值,直观证明矩阵病态问题。
  • 解决办法:
    • 对year做中心化处理(比如减去2000,得到0、1、2),此时回归系数会直接输出10,与SAS结果完全一致
    • 保持标准化变量回归,再根据尺度转换回原变量的系数
    • 避免使用与截距项尺度差异极大的自变量,尤其是分位数回归这类对数值稳定性敏感的算法

内容的提问来源于stack exchange,提问作者bagelanta

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 17:06:12