我正在尝试使用breakpoints()
函数(在strucchange
包中)找到我的时间序列中的结构中断。我的目标是在我的数据集中找到“结”的位置。我正在寻找一个程序来测试所有可能的结,并选择最小化信息标准如AIC或BIC的程序。 breakpoints()
做得很好,但我想绘制一个连续的分段线性函数。这个,我希望拦截在断点之前和之后是相同的。是否有人知道这样做的功能或选项?
在下图中,红线是真实模型,蓝线是使用breakpoints()
拟合的。我想要一个适合真实模型的程序(在断点处没有跳跃)。
请参阅我的gist file以重现此示例。
答案 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)
答案 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), ...)
其中k1
和k2
是结。添加更多味道。