如何从Patsy的B样条中获取GLM模型的原始系数与分段斜率?
关于分段回归斜率计算的确认与解释
首先给你一个明确的结论:你的判断完全正确!不管用Patsy的bs()函数还是手动构造截断变量,分段2的斜率都是对应区间内所有生效解释变量的系数之和,分段1的斜率则直接取对应区间内生效的系数。下面详细拆解两种模型的逻辑:
1. Patsy bs(length, degree=1, knots=[32]) 的后台逻辑
当你指定degree=1(线性样条)和knots=[32]时,bs()会生成两个样条基函数:
- 基函数1:当
length <= 32时,值等于length;当length > 32时,值固定为32 - 基函数2:当
length <= 32时,值为0;当length > 32时,值等于length - 32
你的模型得到的系数是0.3763(对应基函数1)和0.4335(对应基函数2),所以:
- 分段1(
length <=32):只有基函数1生效,斜率就是第一个系数 →0.3763 - 分段2(
length >32):两个基函数都生效,斜率是两个系数之和 →0.3763 + 0.4335 = 0.8098
2. 手动构造变量 y ~ length + np.maximum(length-32,0) 的逻辑
这种写法是**折断回归(Broken Stick Regression)**的手动实现,两个解释变量的作用是:
- 第一个变量
length:全程生效,对应基础斜率 - 第二个变量
np.maximum(length-32,0):仅当length >32时生效,对应斜率的变化量
你的模型系数是0.0118(对应length)和-0.0074(对应截断变量),所以:
- 分段1(
length <=32):截断变量为0,斜率就是第一个系数 →0.0118 - 分段2(
length >32):两个变量都生效,斜率是系数之和 →0.0118 + (-0.0074) = 0.0044
为什么两种模型预测结果一致?
虽然两种写法的系数看起来差异很大,但本质是对同一个分段线性关系的不同参数化方式——你可以通过线性变换把bs()生成的基函数转换成手动构造的变量,反之亦然。参数化方式不同,但拟合出来的预测曲面(这里是分段直线)完全相同,所以预测结果一致。
通用规则总结
对于这两种分段线性回归的写法,计算分段斜率的规则是通用的:
- 找到目标区间内所有非零的解释变量(不管是样条基还是手动截断变量)
- 将这些变量对应的系数相加,就是该区间的斜率
- 分段1(第一个区间)通常只有一个解释变量生效,斜率直接取其系数
内容的提问来源于stack exchange,提问作者Jordan
相关产品推荐
相关产品推荐

