为何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结果(按尺度换算后)一致
核心原因
问题出在设计矩阵的数值尺度失衡导致的数值稳定性问题:
- 病态设计矩阵:当使用原始年份值(2000、2001、2002)时,设计矩阵包含截距项(对应
year=0时的预测值)和大数值的year变量,两者的数值尺度差异极大。这种差异会导致设计矩阵的条件数过高——条件数越大,矩阵越接近奇异,数值计算中的误差会被严重放大,干扰优化算法的收敛。 - 优化算法收敛问题:Statsmodels分位数回归使用的优化算法(内点法或单纯形法)在处理病态矩阵时,容易因数值精度限制无法找到全局最优解,反而收敛到局部最优或者偏离预期的结果。而SAS的PROC QUANTREG可能内部对设计矩阵做了数值稳定处理(比如中心化、缩放),或者采用了更鲁棒的数值计算策略,因此能直接得到理论预期的结果。
- 标准化后的一致性:将年份标准化为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
相关产品推荐
相关产品推荐

