【问题标题】:Breakpoints with constant intercept具有恒定截距的断点
【发布时间】:2016-05-19 00:13:27
【问题描述】:

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

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

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

【问题讨论】:

  • 请提供reproducible example
  • 除了不包括require(strucchange)(我认为这是您在代码中获得breakpoints 的位置)之外,您还有一个未加载的函数ymd
  • @DWin,谢谢,gist 文件已更新

标签: r breakpoints linear-regression


【解决方案1】:

“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)

【讨论】:

  • 谢谢,我收到以下错误消息:Error in segmented.lm(out.lm, seg.Z = ~date3, psi = list(date3 = c(-10)), : starting psi out of the admissible range
  • 您使用的是哪个日期变量?
  • 我的意思是:在您构建的三个不同的日期变量中……您使用的是哪一个?
  • 我原以为 date2 会出错。我真的不知道该说什么。我只是重新运行了该代码,没有出现任何错误。
  • 现在可以了。我已将psi=list(date3=c(-10)) 更改为psi=list(date3=c(10))
【解决方案2】:

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

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

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

您也可以手动操作;线性样条曲线的编码特别简单。

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

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

【讨论】:

  • 据我所知,bs() 没有找到最小化信息标准但采用任意节点(例如 x 的分位数)的节点。它没有告诉我断点到底在哪里。
  • 正确。但是您没有在问题中指定这一点,对吗?编写代码来选择结以最小化这样的标准可能是一个有趣的练习......
  • 您可能只使用breakpoints 的输出来设置节点位置。从你的图表中可以看出,它实际上已经相当准确地检测到了断点。
  • 我不清楚在更复杂的数据集中这些结是否真的相同。我看不出有什么理由会这样。
猜你喜欢
  • 2021-06-10
  • 2011-12-31
  • 2019-05-27
  • 1970-01-01
  • 2018-09-07
  • 2022-12-14
  • 1970-01-01
  • 1970-01-01
  • 2014-07-27
相关资源
最近更新 更多