1

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

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

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

在此处输入图像描述

4

2 回答 2

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)

在此处输入图像描述

于 2013-08-01T16:37:39.457 回答
0

连续分段线性拟合也称为线性样条,可以bssplines包中拟合(带有基数 R)。

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

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

您也可以手动操作;线性样条曲线特别容易编码。

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

哪里k1k2是结。添加更多的味道。

于 2013-08-01T15:03:17.320 回答