segmented包中selgmented与segmented函数输出差异原因及对齐方法问询
R语言segmented包:selgmented与segmented结果不一致的原因及对齐方法
差异原因
- 初始值策略差异:
selgmented()会通过内部bootstrap或候选点筛选生成最优初始断点,而手动调用segmented()仅指定npsi时,默认用线性预测值分位数作为初始值,初始值的不同会导致迭代收敛到不同局部最优解。 - 模型选择逻辑不同:
selgmented()在选择断点数量的同时,会结合AIC/BIC等准则筛选最优断点位置与斜率组合;而segmented()指定npsi是强制固定断点数量,无模型复杂度惩罚,可能收敛到满足数量要求但非selgmented()选中的解。 - 迭代控制参数细节差异:
selgmented()内部使用的默认控制参数(如tol收敛阈值、boot.type抽样类型)可能与手动设置的seg.control()参数不一致,仅调整n.boot和it.max无法覆盖所有差异。 - 时间序列特性适配差异:自定义时间序列存在自相关、时序依赖性时,
selgmented()可能针对性使用时序bootstrap抽样,而segmented()默认按普通线性回归处理,忽略时序特性导致结果偏差。
对齐结果的可行方法
- 复用selgmented的最优断点作为初始值:从
selgmented()返回对象中提取已确定的断点位置(obj$psi),直接传入segmented()的psi参数,而非仅指定npsi。示例代码:
library(segmented) # 拟合初始线性模型(以时间序列为例) lm_ts <- lm(y ~ time, data = ts_data) # 用selgmented选择断点 seg_sel <- selgmented(lm_ts, seg.Z = ~time) # 传入selgmented的断点作为初始值运行segmented seg_aligned <- segmented(lm_ts, seg.Z = ~time, psi = seg_sel$psi, control = seg.control(it.max = 1000, tol = 1e-6))
- 完全匹配selgmented的控制参数:查看
selgmented()的默认控制参数(可通过selgmented源码或args(selgmented)确认),在segmented()的seg.control()中设置完全相同的参数,包括n.boot、tol、boot.type(时间序列需设为"ts")等。 - 统一优化算法:在
seg.control()中指定与selgmented()一致的优化方法(如optim.method = "BFGS"),确保迭代过程的一致性。 - 时间序列预处理:对自定义时间序列先校正自相关(如拟合ARIMA模型提取残差,再对残差做分段回归),消除时序依赖性对断点估计的影响。
实例验证(Plant organ数据集)
data(plant) lm_plant <- lm(y ~ x, data = plant) # 运行selgmented seg_sel_plant <- selgmented(lm_plant, seg.Z = ~x) # 传入断点对齐结果 seg_fix_plant <- segmented(lm_plant, seg.Z = ~x, psi = seg_sel_plant$psi, control = seg.control(it.max = 500, tol = 1e-7)) # 对比结果 summary(seg_sel_plant) summary(seg_fix_plant)
执行后可观察到断点位置与分段斜率完全一致。
内容的提问来源于stack exchange,提问作者Will B
相关产品推荐
相关产品推荐

