具有恒定截距的断点

时间:2013-08-01 14:20:33

标签: r breakpoints linear-regression

我正在尝试使用breakpoints()函数(在strucchange包中)找到我的时间序列中的结构中断。我的目标是在我的数据集中找到“结”的位置。我正在寻找一个程序来测试所有可能的结,并选择最小化信息标准如AIC或BIC的程序。 breakpoints()做得很好,但我想绘制一个连续的分段线性函数。这个,我希望拦截在断点之前和之后是相同的。是否有人知道这样做的功能或选项?

在下图中,红线是真实模型,蓝线是使用breakpoints()拟合的。我想要一个适合真实模型的程序(在断点处没有跳跃)。

请参阅我的gist file以重现此示例。

enter image description here

2 个答案:

答案 0 :(得分:2)

'strucchange'包似乎旨在返回不连续的结果。您可能希望查看按照您想象的结构设计方式设计的包。 “分段”包就是这样的。

require(segmented)
out.lm<-lm(y~date3,data=df)
o<-segmented(out.lm, seg.Z= ~date3, psi=list(date3=c(-10)),
     control=seg.control(display=FALSE))
 slope(o)
#$date3
#          Est. St.Err. t value CI(95%).l CI(95%).u
#slope1  0.3964  0.1802   2.199   0.03531    0.7574
#slope2 -1.6970  0.1802  -9.418  -2.05800   -1.3360

str(fitted(o))
# Named num [1:60] 1.94 2.34 2.74 3.13 3.53 ...
# - attr(*, "names")= chr [1:60] "1" "2" "3" "4" ...
plot(y ~ date3, data=df)
lines(fitted(o) ~ date3, data=df)

enter image description here

答案 1 :(得分:0)

连续分段线性拟合也称为线性样条,并且可以与bs包中的splines一致(基础R附带)。

lm(y ~ bs(x, deg=1, df, knots), ...)

断点称为节点,您必须通过knots参数或df参数(根据x的分位数选择结点)指定它们。

你也可以手动完成;线性样条线编码特别简单。

lm(y ~ x + pmax(0, x - k1) + pmax(0, x - k2), ...)

其中k1k2是结。添加更多味道。