如何对多个未知结进行分段线性回归?


14

是否有任何软件包可以进行分段线性回归,从而可以自动检测多个结?谢谢。当我使用strucchange包时。我无法检测到更改点。我不知道它如何检测更改点。从地块中,我可以看到有一些要点可以帮助我挑选出来。有人可以在这里举个例子吗?


1
这似乎是与stats.stackexchange.com/questions/5700/…相同的问题。如果有实质性差异,请编辑您的问题以反映差异,让我们知道;否则,我们将其关闭。
ub

1
我已经编辑了问题。
Honglang Wang

1
我认为您可以将其作为非线性优化问题来解决。只需编写要拟合的函数的方程式,并将系数和结点位置作为参数即可。
mark999 2011年

1
我认为segmented包裹是您要找的东西。
AlefSin 2011年

1
我有一个相同的问题,用R的segmented包装
不同的本

Answers:



8

通常,要拟合为分段线性的东西有点奇怪。但是,如果您确实希望这样做,那么MARS算法是最直接的。它将一次建立一个功能。然后通常会减少结数,以对抗过拟合的ala决策树。您可以通过earth或访问R中的MARS算法mda。一般而言,它与GCV相符,而GCV与其他信息标准(AIC,BIC等)相距不远

MARS不会真正为您提供“最佳”的匹配,因为每个结一次会结一个。真正适合“最佳”数量的结确实很困难,因为结位置的可能排列会迅速爆炸。

通常,这就是为什么人们转向平滑样条线的原因。大多数平滑样条线都是立方的,因此您可以使人眼误以为不连续。但是,很可能会进行线性平滑样条曲线。平滑样条曲线的最大优点是可以优化它们的单个参数。这使您可以快速找到真正“最佳”的解决方案,而不必搜索排列的对象。但是,如果您真的想寻找拐点,并且您有足够的数据可以这样做,那么最好使用MARS之类的东西。

这是R中的惩罚线性平滑样条曲线的一些示例代码:

require(mgcv);data(iris);
gam.test <- gam(Sepal.Length ~ s(Petal.Width,k=6,bs='ps',m=0),data=iris)
summary(gam.test);plot(gam.test);

然而,选择的实际结不一定与任何真实的拐点相关。


3

几年前,我从头开始对此进行编程,并且我有一个Matlab文件,可以在计算机上进行分段线性回归。对于大约20个测量点,大约有1-4个断点在计算上是可能的。5或7个断点开始确实太多了。

我认为纯数学方法是尝试按用户mbq在问题下方的评论中链接的问题中建议的所有可能组合。

由于拟合线都是连续且相邻的(无重叠),因此组合曲线将遵循帕斯卡三角形。如果线段之间使用的数据点之间存在重叠,我相信组合函数将遵循第二种斯特林数。

在我看来,最好的解决方案是选择拟合线的组合,这些组合的拟合线的R ^ 2相关值的标准偏差最低。我将尝试用一个例子来解释。请记住,尽管询问一个数据中应找到多少个断点,与询问“英国海岸有多久?”的问题类似。如Benoit Mandelbrots(数学家)关于分形的论文之一。在断点数和回归深度之间需要权衡。

现在来看这个例子。

ÿXXÿ

Xÿ[R2一世ñË1个[R2一世ñË2süØF[R2v一种üËssŤ一种ñd一种[RddËv一世一种Ť一世ØñØF[R21个1个1个000004001个040006788221个000001181个011806987331个000000041个000407067441个000000311个003107048551个000001351个013506974661个000002381个023806902771个000002771个027706874881个000002221个022206913991个000000931个00930700410101个000-1个9781个000070711190970900271099800667312808951011391个00900552313707734025581个02920365914606134043211个04550128115504321061341个04550128216402558077331个02910365917301139089511个00900552318岁200272097080998006672191个01个0001个00007071202000941个0001个009407004213002221个0001个022206914224002781个0001个027806874235002391个0001个023906902246001361个0001个013606974257000321个0001个003207048268000041个0001个000407068279001181个0001个01180698728100041个0001个0406788

这些y值具有图形:

理想数据

显然有两个断点。为了便于讨论,我们将计算R ^ 2相关值(使用Excel单元格公式(欧洲点逗号样式)):

=INDEX(LINEST(B1:$B$1;A1:$A$1;TRUE;TRUE);3;1)
=INDEX(LINEST(B1:$B$28;A1:$A$28;TRUE;TRUE);3;1)

适用于两条拟合线的所有可能的非重叠组合。所有可能的R ^ 2值对都具有以下图形:

R ^ 2值

问题是我们应该选择哪对R ^ 2值,以及如何将其概括为标题中要求的多个断点?一种选择是选择R平方相关性之和最高的组合。绘制此图,我们得到下面的上部蓝色曲线:

R平方和R平方的标准偏差之和

1个0455

逐段线性回归-Matlab-多个断点



0

...首先,您必须通过迭代,并在一些有用的条件下,例如AIC AICc BIC Cp来做到这一点;因为如果结数K =奇数个数据点N,就可以得到一个“理想”的拟合。...首先放K = 0; 估计L = K + 1回归,例如,计算AICc;然后假设在一个单独的段上有最少数量的数据点,比如说L = 3或L = 4,好吧……放K = 1;从第L个数据作为第一个结,开始计算SS或MLE,...并逐步将下一个数据点作为一个结(SS或MLE),直到在N-L数据处的最后一个结;选择最合适的布置(SS或MLE),计算AICc ... ...将K = 2;...使用以前的所有回归(即它们的SS或MLE),但逐步将单个片段划分为所有可能的部分...选择最合适的排列(SS或MLE)计算AICc ... 如果最后一个AICc大于最后一个AICc,则停止迭代!这是在AICc标准下的最佳解决方案,好的


不能使用AIC,BIC,因为它们会因额外的参数而受到惩罚,这显然不是这种情况。
HelloWorld

0

我曾经遇到一个名为Joinpoint的程序。他们在他们的网站上说它适合一个联接点模型,其中“在“联接点”上有几条不同的线连接在一起”。进一步:“用户提供最小和最大连接点数。程序从最小连接点数开始(例如0个连接点,这是一条直线),并测试是否有更多的连接点具有统计意义,并且必须将其添加到模型中(最大数量)。”

NCI将其用于癌症发病率趋势模型,也许它也满足您的需求。


0

为了适合数据分段功能:

在此处输入图片说明

一种1个一种2p1个q1个p2q2p3q3

在此处输入图片说明

例如,使用Mats Granvik提供的确切数据,结果为:

在此处输入图片说明

没有分散的数据,此示例意义不大。参考文件中显示了其他具有分散数据的示例。


0

mcp如果您知道要推断的更改点数,则可以使用该程序包。它为您提供了极大的建模灵活性,并为您提供了有关更改点和回归参数的大量信息,但是是以速度为代价的。

mcp网站包含许多应用示例,例如,

library(mcp)

# Define the model
model = list(
  response ~ 1,  # plateau (int_1)
  ~ 0 + time,    # joined slope (time_2) at cp_1
  ~ 1 + time     # disjoined slope (int_3, time_3) at cp_2
)

# Fit it. The `ex_demo` dataset is included in mcp
fit = mcp(model, data = ex_demo)

然后您可以可视化:

plot(fit)

在此处输入图片说明

或总结一下:

summary(fit)

Family: gaussian(link = 'identity')
Iterations: 9000 from 3 chains.
Segments:
  1: response ~ 1
  2: response ~ 1 ~ 0 + time
  3: response ~ 1 ~ 1 + time

Population-level parameters:
    name match  sim  mean lower  upper Rhat n.eff
    cp_1    OK 30.0 30.27 23.19 38.760    1   384
    cp_2    OK 70.0 69.78 69.27 70.238    1  5792
   int_1    OK 10.0 10.26  8.82 11.768    1  1480
   int_3    OK  0.0  0.44 -2.49  3.428    1   810
 sigma_1    OK  4.0  4.01  3.43  4.591    1  3852
  time_2    OK  0.5  0.53  0.40  0.662    1   437
  time_3    OK -0.2 -0.22 -0.38 -0.035    1   834

免责声明:我是mcp的开发人员。


问题中使用“检测”表示更改点的数量,甚至不知道。
ub
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.