从分段线性函数中找到数据的变化点

机器算法验证 回归 变化点
2022-02-28 06:50:46

问候,

我正在进行研究,这将有助于确定观察到的空间的大小以及自大爆炸以来经过的时间。希望您能提供帮助!

我有符合分段线性函数的数据,我想对其执行两个线性回归。有一个斜率和截距发生变化的点,我需要(编写一个程序来)找到这个点。

想法?

4个回答

R 包结构可能会对您有所帮助。看看小插图,它很好地概述了如何解决类似的问题。

如果点数不是太大,你可以尝试所有的可能性。让我们假设点是Xi=(xi,yi)在哪里i=1,..,N. 比,你可以循环使用j2N2并适合两条线{X1,...,Xj}{X(j+1),...,XN}. 最后,你选j两条线的残差平方和之和最小。

这是一个(离线)变化点检测问题。我们之前的讨论提供了对期刊文章和 R 代码的参考。首先看一下Barry 和 Hartigan的“产品划分模型”,因为它可以处理斜率的变化并且有高效的实现。

mcp包可以做到这一点说你的数据是

首先,让我们模拟一些数据:

df = data.frame(x = 1:100,
                y = c(rnorm(40, 10 + (1:40)*0.5),
                      rnorm(60, 10 + 40*0.5 -8 + (1:60)*0.2)))

现在让我们看看我们是否可以使用以下方法恢复 40 处的变化点(和参数值)mcp

model = list(
  y ~ 1 + x,  # linear segment
  ~ 1 + x  # another linear segment
)
library(mcp)
fit = mcp(model, df)

绘制它。灰线是从拟合中随机抽取的,表明它捕捉到了趋势。蓝色曲线是估计的变化点位置:

在此处输入图像描述

让我们看看各个参数估计值。int_是截距,x_是 x 上的斜率,cp_是变化点:

summary(fit)

Population-level parameters:
    name  mean lower upper Rhat n.eff
    cp_1 40.48 40.02 41.00    1  2888
   int_1 11.12  9.11 13.17    1   778
   int_2 21.72 20.09 23.49    1   717
 sigma_1  3.23  2.76  3.69    1  5343
     x_1  0.46  0.36  0.54    1   724
     x_2  0.21  0.16  0.26    1   754

免责声明:我是mcp.