R中的时间序列“聚类”


38

我有一组时间序列数据。尽管每个时间序列中的实际日期可能并不都完全“排队”,但每个序列都涵盖相同的时期。

这就是说,如果将时间序列读入2D矩阵,它将看起来像这样:

date     T1   T2   T3 .... TN
1/1/01   100  59   42      N/A
2/1/01   120  29   N/A     42.5
3/1/01   110  N/A  12      36.82
4/1/01   N/A  59   40      61.82
5/1/01    05  99   42      23.68
...
31/12/01  100  59   42     N/A

etc 

我想编写一个R脚本,将时间序列{T1,T2,... TN}分离为“家庭”,其中一个家庭被定义为一系列“趋于彼此同情”的系列。

对于“聚类”部分,我将需要选择/定义一种距离度量。我不确定如何处理此问题,因为我正在处理时间序列,并且一对可能在一个间隔内同情移动的序列可能不会在随后的间隔内这样做。

我敢肯定,这里有比我更多的有经验/聪明的人,因此,对于任何建议,关于用于距离度量的算法/启发式方法以及如何在时间序列聚类中使用该算法/方法的想法,我将不胜感激。

我的猜测是,尚无成熟的统计方法来执行此操作,因此,我将非常有兴趣了解人们如何处理/解决此问题-像统计学家一样思考。


1
您可能也对对此问题的回答感兴趣stats.stackexchange.com/q/2777/1036
Andy W 2010年


1
一种基于Dirichlet流程的统计方法,适用于所有样本的时间点都不相同的数据集。
Dario

Answers:


24

在数据流和时间序列数据库的挖掘中,一种常见的方法是将序列转换为符号表示,然后使用相似性度量(例如欧几里得距离)对序列进行聚类。最受欢迎的代表是SAX(Keogh&Lin)或更新的iSAX(Shieh&Keogh):

上面的页面还包含对距离度量和聚类的引用。Keogh和他们的工作人员正在进行可重复的研究,并且非常乐于发布其代码。这样您就可以给他们发送电子邮件并询问。我相信他们倾向于在MATLAB / C ++中工作。

最近做出了努力来产生Java和R实现:

我不知道它有多远-它面向主题查找,但是,取决于它们走了多远,它应该具有必要的位,您需要将它们组合在一起以满足您的需求(iSAX和距离度量:因为这是聚类和主题查找的共同部分)。


1
这看起来是一个很好的,易于处理的起点。感谢您的链接。
2010年

4
糟糕,我认为SAX页面是我见过的最丑的网页!
naught101

18

说“倾向于同情”的另一种方式是“共同融入”。

有两种计算协整的标准方法:Engle-Granger方法和Johansen过程。这些内容在“使用R进行的集成和协整时间序列分析”(Pfaff 2008)和相关的R urca软件包中进行了介绍。如果您想在R中追求这些方法,我强烈推荐这本书。

我还建议您在多元时间序列上,特别是在Ruey Tsay在美国芝加哥的课程中研究此问题,其中包括所有必要的R代码。


几年前,我遇到了整合的问题-但对我来说,这确实非常复杂(我不明白!)。我希望会有一个理论上更少(即更实际)的解决方案……
非晶

3
Engle-Granger方法并不特别复杂:您只需要取两个序列之间的回归残差并确定它是否具有单位根。这当然是可行的:它经常用于各种各样的问题。也就是说,我想您的问题的任何答案都需要一些统计知识(例如,您应该了解平稳性,独立性等)……
Shane 2010年

有没有比测试所有成对序列进行协整的更好的方法(将相同的理想聚类在一起)?这是否也取决于序列本身已被集成的事实?在发病?
Andy W

@安迪:我相信有更好的方法,我期待听到它。这是一个非常基本的方法。
Shane 2010年

1
>我别无其他建议,但协整在实践中既非常脆弱(“参数假设”变得疯狂),又不适合手头的任务:每一步都相当于进行层次聚类,最多只能合并两个级数合为一(协整均值)。
user603 2010年

4

聚集时间序列通常由种群动态专家完成,特别是那些研究昆虫以了解爆发和崩溃趋势的科学家。寻找关于吉普赛蛾,云杉芽孢杆菌,山松甲虫和落叶松芽孢的工作。

对于实际的聚类,您可以选择自己喜欢的任何距离度量标准,相对于要聚类的数据类型,每个度量都有其自身的优势和优势,Kaufmann和Rousseeuw1990。在数据中查找组。聚类分析简介是一个很好的起点。请记住,聚类方法不会“关心”您使用的是时间序列,它只会查看在同一时间点测得的值。如果您的两个时间序列在整个生命周期中都没有足够的同步性,那么它们将不会(也许不应该)聚类。

在对时间序列进行聚类后,您将遇到的问题是确定要使用的聚类(家庭)的数量。有多种选择信息集群截止值的方法,但是这里的文献并不那么好。


1
克里斯(Chris),定期聚类不会减少它。您要么通过将每个设置为其自身的维度(即得出N * T维度)来承认某个序列与其自身的过去高度相关,要么将所有维度拖在一起,但是然后(鉴于系列中的相关性很高),您最终总是会得到一个集群。同样,大多数聚类方法也不适合/建议用于高度相关的变量(球形聚类或多或少存在弯曲假设)。y1,t
user603 2010年

1
@ user603您能解释一下“请通过将每个y1,t作为其自身的维度(即得出N * T维度),来承认一个系列与它自己的过去高度相关”?
B_Miner

2

在这里查看我对类似问题的回答。长话短说,对数据进行快速傅立叶变换,如果输入数据是实值,则丢弃冗余频率,为快速傅立叶变换的每个元素分离实部和虚部,并使用R中的Mclust软件包进行建模-基于每个时间序列每个元素的实部和虚部的聚类。该软件包可自动优化群集数量及其密度。


0

您还可以使用clustDDist软件包,该软件包以不同的错误度量执行Leaders方法和分层聚类方法:

http://r-forge.r-project.org/projects/clustddist/

平方的欧几里德距离有利于具有一个陡峭的高峰值的分布模式,因此 有时优选。

d4(x,y)=(xy)2y
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.