如何从segmented()函数中稳定断点?

时间:2017-09-03 18:58:58

标签: r breakpoints

我在breakpoints()包中找到了strucchange函数的断点。我的解释变量是纬度,响应变量是β多样性值。

然后,我使用这些断点来拟合回归线,并使用segmented()包中的segmented绘制它。 Segmented提供断点估计值,当我再次运行该函数时,它会发生变化。但是,断点功能的断点不会改变。我想,断点会随着更大的数据集而变化,就像我的一样。我需要报告这些断点。

如何从segmented()函数稳定断点?

分段函数的断点不会随着一小组数据而改变,如本例所示。

我使用了相同的示例代码。

示例:

set.seed(12)
xx <- 1:100
zz <- runif(100)
yc <- 2+1.5*pmax(xx-35,0)-1.5*pmax(xx-70,0)+15*pmax(zz-.5,0)+
  rnorm(100,0,2)+1.5*pmax(xx-20,0)+15*pmax(zz-.2,0)+
  rnorm(100,0,2)
plot(xx, yc)
# Seeking breakpoints
varbp <- breakpoints(yc ~ xx)
bp <- xx[varbp$breakpoints]
# Using segmented to fit regression line 
modvars <- lm(yc ~ xx)   
seg.var <- segmented(modvars, seg.Z = ~xx, psi = c(25,78))
summary(seg.var) 
#  Estimated Break-Point(s):
#    Est. St.Err
#  psi1.xx 25.694  1.240
#  psi2.xx 72.786  2.086
# Plotando
plot(seg.var, add = T) 
abline(v=25.694, col="green", lwd = 2)
abline(v = 72.786, col="green", lwd = 2)

1 个答案:

答案 0 :(得分:0)

从文档中:

  

自0.2-9.0版本以来,分段实现了Wood(2001)中描述的引导重新启动算法。当分段关系为平坦关系时,引导程序的重新启动有望逃脱目标函数的局部最优值。请注意,引导程序重新启动会运行n.boot迭代,而不考虑会影响内部循环内收敛的费用。

由于默认情况下使用了引导程序,因此segmented()检测到的断点不稳定也就不足为奇了(尽管当我遇到相同的问题时我也感到惊讶)。

文档描述了一种抑制引导的方法。可以通过使用n.boot这样的参数来完成此操作:

seg.var <- segmented(modvars, seg.Z = ~xx, psi = c(25,78), 
  control = seg.control(n.boot=0))

希望此帮助。干杯!