估计回归中的断点数

机器算法验证 r 回归 变化点 结构变化 分段回归
2022-03-31 13:37:44

我一直在玩 R 中的包strucchange(在某种程度上segmented)。我试图确定线性回归中的斜率是否有变化,更重要的是,有多少断点。玩具数据集:

x <- c(0, 5, 10, 15, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80)
y <- c(-84.16, -86.67, -87.74, -86.07, -89.15, -91.90, -93.64, -95.92,
  -95.96, -99.19, -100.73, -107.29, -106.10, -107.29)

第一个问题:如果我使用断点函数:

breakpoints(y ~ x, data = data.frame(x, y))

我收到以下错误:

Error in breakpoints.formula(y ~ x, data = data.frame(x, y)) : 
minimum segment size must be greater than the number of regressors

我认为出现这种情况是因为断点命令中的默认 h 参数是 0.15 和 14(我拥有的观察数)* 0.15 = 2.1,向下舍入不大于 2(“回归量”:顺便说一下,我考虑到我的公式,我会认为回归变量的数量为 1,但我从其他工作示例中了解到y ~ x在这些情况下 nreg = 2。我猜截距算作回归变量?)。

如果我将 h 设置为 3 或某个分数,例如 14 * h >= 3,则该命令有效。

breakpoints(y ~ x, data = data.frame(x, y), h = 3)

返回两个断点。但结果对 h 很敏感。这样,如果我使用:

breakpoints(y ~ x, data = data.frame(x, y), h = 4)

我得到了不同的解决方案。在后一种情况下,可以找到单个最佳中断,因为可以调用中断之前的最小观察次数更高。有没有办法以某种方式确定一个解决方案是否比另一个解决方案有更多的支持?换句话说,如何最好地优化断点的位置而不是断点的数量(可能跨越 h 的值)?我认为 Fstats 命令可能是关键,但我在理解此命令的帮助时遇到了很多麻烦......

1个回答

一些备注:

  • 您需要估计每个段中的两个参数(截距和斜率)。因此breakpoints()要求每个段中至少有三个观察值......否则您无法估计参数(没有完美拟合)。

  • 但三是技术上可能的最小值。它是否会导致有意义的结果是一个不同的问题。通常,您可能不会只对三个观察结果使用回归模型,对吗?

  • 因此,仅从 14 个观察值中识别 2 个断点加上 6 个回归系数(三个截距和三个斜率)的任务确实具有挑战性。如果不使用额外的先验知识,可能很难说这不会过度拟合数据。

  • 如果将最小分段大小设置为 5(或更高),则无法估计 14 个观察值的 2 个断点。因此,设置h = 3orh = 4是允许 2 个断点的唯一选项。后者只喜欢 1 个断点的原因是不可能再将最后三个观察值分组到它们自己的段中。

  • citation("strucchange")在讨论断点估计中的实际问题时,第三参考文献中的文档比手册页上的更多。

要比较 1 和 2 断点解决方案,您可以首先估计断点:

bp <- breakpoints(y ~ x, h = 3)

然后您可以可视化拟合:

plot(y ~ x, pch = 19)
lines(fitted(bp, breaks = 1) ~ x, col = 4, lwd = 1.5)
lines(fitted(bp, breaks = 2) ~ x, col = 2, lwd = 1.5)

带断点的散点图

如上所述:从纯粹的数据驱动的角度来看,我可能会认为这两个模型都过拟合。但也许一个或另一个模型对你有一个合理的解释。