是否有任何软件包可以进行分段线性回归,从而可以自动检测多个结?谢谢。当我使用strucchange包时。我无法检测到更改点。我不知道它如何检测更改点。从地块中,我可以看到有一些要点可以帮助我挑选出来。有人可以在这里举个例子吗?
segmented
包裹是您要找的东西。
是否有任何软件包可以进行分段线性回归,从而可以自动检测多个结?谢谢。当我使用strucchange包时。我无法检测到更改点。我不知道它如何检测更改点。从地块中,我可以看到有一些要点可以帮助我挑选出来。有人可以在这里举个例子吗?
segmented
包裹是您要找的东西。
Answers:
通常,要拟合为分段线性的东西有点奇怪。但是,如果您确实希望这样做,那么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);
然而,选择的实际结不一定与任何真实的拐点相关。
几年前,我从头开始对此进行编程,并且我有一个Matlab文件,可以在计算机上进行分段线性回归。对于大约20个测量点,大约有1-4个断点在计算上是可能的。5或7个断点开始确实太多了。
我认为纯数学方法是尝试按用户mbq在问题下方的评论中链接的问题中建议的所有可能组合。
由于拟合线都是连续且相邻的(无重叠),因此组合曲线将遵循帕斯卡三角形。如果线段之间使用的数据点之间存在重叠,我相信组合函数将遵循第二种斯特林数。
在我看来,最好的解决方案是选择拟合线的组合,这些组合的拟合线的R ^ 2相关值的标准偏差最低。我将尝试用一个例子来解释。请记住,尽管询问一个数据中应找到多少个断点,与询问“英国海岸有多久?”的问题类似。如Benoit Mandelbrots(数学家)关于分形的论文之一。在断点数和回归深度之间需要权衡。
现在来看这个例子。
这些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平方相关性之和最高的组合。绘制此图,我们得到下面的上部蓝色曲线:
Tomé和Miranda(1984)中描述了一个相当不错的算法。
所提出的方法使用最小二乘法来计算适合给定时间序列的最佳连续直线集,但要遵守多个断点之间的最小距离和每个断点处最小趋势变化的约束。
可以在Fortran和IDL的网站上获得该代码和GUI:http: //www.dfisica.ubi.pt/~artome/linearstep.html
...首先,您必须通过迭代,并在一些有用的条件下,例如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标准下的最佳解决方案,好的
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的开发人员。