2

这是我的数据:

data1 <- c(726, 718, 699, 737, 743, 734, 726, 722, 715, 714, 752, 750, 
749, 746, 743, 734, 725, 717, 717, 708, 756, 753, 752, 746, 744, 
740, 737, 732, 728, 728, 720, 720, 714, 703, 702, 697, 758, 753, 
753, 746, 743, 734, 720, 706, 697, 761, 744, 749, 741, 738, 738, 
732, 725, 720, 712, 782, 778, 776, 773, 772, 770, 770, 769, 769, 
766, 763, 763, 756, 755, 753, 750, 749, 746, 737, 723, 711, 702, 
685, 782, 779, 778, 778, 776, 776, 775, 772, 770, 770, 766, 763, 
761, 756, 752, 738, 735, 729, 715)

这给出了使用plot(data1)as 的图:

在此处输入图像描述

如何使用 R 分离八个不同的趋势?我可以identify(data1)手动使用和标记它们(班次)并使用索引来隔离它们,但在我的情况下这是不可能的,因为我正在处理许多此类图。我想以编程方式提取单独的行。请让我知道是否有统计技术(时间序列等)可以识别趋势和标签的变化并返回八个系列。

编辑

我应该明确指出,需要确定整个数据集中的系列数量。样本数据中的序列数恰好是 8 个。但是除非我绘制数据并手动识别中断,否则我不会在每种情况下都知道这一点。

4

4 回答 4

3

我认为 Kiril 就在这里(+1)。这是一个重要的研究/知识领域,有时称为变更点或断点分析。相关的 R 包包括strucchange changepointKiril 提到的bcp.

strucchange当被告知有多少变化时,breakpoints()它使用最小二乘回归来估计变化的位置(这在这里没有帮助。)

changepoint正如 Kiril 所说,有几种算法,包括 Scott 和 Knott 的 Binary Segmentation、Auger 和 Lawrence 的 Segment Neighbourhoods 以及 Killick 等人的 Pruned Exact Linear Time (PELT) 算法。它是一个很棒的软件包,但我非常有限的经验是这些功能将需要大量调整(这是值得的)。

对于重要的任务,我们希望利用我们对数据的了解来制作更详细的模型,并最终将几种方法组合成一个集成分类器。

但是对于简单的点击并开始,您可以使用bcp它使用基于 MCMC 的 Barry 和 Hartigan 贝叶斯过程近似:

library(bcp)
changefit <- bcp(data1)
plot(changefit)

在此处输入图像描述

隔离组的一种方法是选择后验概率阈值和split()基于它的数据:

data2 <- data.frame(data=data1, prob = changefit$posterior.prob)
threshold <- 0.90
split(data2,c(0, cumsum( ifelse (data2$prob > threshold, 1, 0))))
#split will warn about unequal lengths
于 2012-12-06T00:32:30.667 回答
2

您确实有一对不是单调的,需要确保“上行”大于阈值。

labs=factor( c(0, cumsum( data1[-1] - data1[-length(data1)] > 7 )), 
             labels=letters[1:8])
plot(data1, pch=as.character(labs) )

在此处输入图像描述

需要自动计算周期数?您可以使用以下长度:

unique (factor( c(0, cumsum( data1[-1] - data1[-length(data1)] > 7 )) )) 

... 在这种情况下。但它确实需要愿意接受任何大于 6 的上冲定义的中断。(或者你可以选择 15,或者任何从基础科学中有意义的东西。)

于 2012-12-05T22:12:53.917 回答
2

好的,有一种统计技术可以解决您的问题。如果我理解正确,您实际上要做的是检测数据的统计属性发生变化的地方,即检测不同的行为。这是通过一种称为“变化点检测”的技术完成的,R 对此有很好的包,称为“变化点”'。它使用线性算法来进行相当新的计算。如果我没记错的话,我相信这里使用的 PELT 算法非常好,它是大约两年前发明的,所以它是非常现代的方法。查看函数“cpt.meanvar”,它将检测数据均值和方差的变化。它非常简洁,如果您有足够的耐心 - 您可以找到一种自动且足够好的方法来检测您拥有的所有数据的变化。

于 2012-12-05T23:20:01.477 回答
0

您可以尝试使用包dbscan中的基于密度的集群算法fpc

于 2013-05-04T18:11:12.213 回答