如何让分段回归首段过原点且末段延伸至指定值?
固定断点分段回归:首段过原点+末段延伸至50的实现
核心需求回顾
固定断点为15、20、30,实现首段回归直线过原点,末段延伸至50,解决plot.segmented报错问题。
1. 手动构建固定断点的分段回归(首段过原点)
由于segmented包对无截距模型的支持有限,且所有断点为固定值,直接用lm结合虚拟变量拟合更可靠,同时强制首段过原点:
# 加载数据 bond_data <- data.frame( yield_change = c(-1.2,-0.9,-1.8,-1.4,-1.8,-2.1,-2.3,-2.1,-2.5,-2.2,-2.4,-2.5,-2.4,-2.4, -3.0,-2.6,-5.1,-4.8,-4.9,-5.0,-5.0,-6.2,-6.1,-6.3,-5.0,-5.0), maturity =c(10.2795,10.8603,11.7753,12.3562,12.5205,13.3589,13.8630,14.2822,14.3589,15.3589, 15.8630,16.778,17.3616,17.8658,18.3616,21.8685,22.5288,23.8685,24.3644,25.3671, 26.8712,27.8712,28.8712,29.8740,44.3781,49.3836)) # 构建分段虚拟变量(保证断点处连续) bond_data$d15 <- pmax(bond_data$maturity - 15, 0) # 15以上的分段增量 bond_data$d20 <- pmax(bond_data$maturity - 20, 0) # 20以上的分段增量 bond_data$d30 <- pmax(bond_data$maturity - 30, 0) # 30以上的分段增量 # 拟合模型:0+强制首段无截距(过原点) segmented_fixed <- lm(yield_change ~ 0 + maturity + d15 + d20 + d30, data = bond_data)
模型解释:
- 首段(
maturity ≤15):yield_change = β1*maturity,完全过原点 - 第二段(
15 < maturity ≤20):yield_change = β1*maturity + β2*(maturity-15),斜率为β1+β2,断点15处两段连续 - 第三段(
20 < maturity ≤30):yield_change = β1*maturity + β2*(maturity-15) + β3*(maturity-20),斜率为β1+β2+β3,断点20处连续 - 第四段(
maturity >30):yield_change = β1*maturity + β2*(maturity-15) + β3*(maturity-20) + β4*(maturity-30),斜率为β1+β2+β3+β4,断点30处连续
2. 绘制末段延伸至50的回归曲线
生成包含目标终点50的预测数据,再绘图:
# 生成包含断点和50的预测序列 xp <- c(min(bond_data$maturity), 15, 20, 30, 50) new_data <- data.frame(maturity = xp) # 给预测数据添加对应的虚拟变量 new_data$d15 <- pmax(new_data$maturity - 15, 0) new_data$d20 <- pmax(new_data$maturity - 20, 0) new_data$d30 <- pmax(new_data$maturity - 30, 0) # 计算预测值 yp <- predict(segmented_fixed, new_data) # 绘图:设置x轴范围包含50,同时展示原始数据点 plot(bond_data$maturity, bond_data$yield_change, pch=16, col="blue", ylim = c(-8,0), xlim = c(10,50), xlab="maturity", ylab="yield_change") lines(xp, yp, lwd=2, col="red")
3. 关于plot.segmented报错的说明
你设置了fixed.psi = c(15,20,30)且it.max=0,这会让segmented模型跳过断点估计流程,导致模型内部缺少plot.segmented依赖的结构信息(比如断点的置信区间、迭代记录),因此触发"Error in Allpsi[[i]] : subscript out of bounds"错误。对于固定断点的场景,直接用lm拟合+手动绘图的方式更稳定。
内容的提问来源于stack exchange,提问作者leonardo
相关产品推荐
相关产品推荐

