【问题标题】:How can I stabilize breakpoints from segmented() function?如何稳定分段()函数的断点?
【发布时间】:2017-09-03 18:58:57
【问题描述】:

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

然后,我使用这些断点拟合回归线,并使用 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)

【问题讨论】:

  • 虽然我自己对segmented 的经验与您声称它不稳定的说法不谋而合。但是你的这个例子不支持它。我用不同的 psi 值运行了很多次,结果非常相似。

标签: r breakpoints


【解决方案1】:

来自文档:

从 0.2-9.0 版本开始,分段实现了 Wood (2001) 中描述的引导重启算法。当分段关系平坦时,自举重启有望逃脱目标函数的局部最优。请注意,bootstrap restart 运行 n.boot 迭代,而不考虑只影响内部循环内收敛的收费。

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

文档描述了一种抑制引导的方法。这可以通过使用n.boot 参数来完成,如下所示:

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

希望对您有所帮助。干杯!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多