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

如何让分段回归首段过原点且末段延伸至指定值?

固定断点分段回归:首段过原点+末段延伸至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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 23:41:31