R中的时间序列“聚类”

机器算法验证 r 时间序列 聚类 协整
2022-02-13 13:23:06

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

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

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} 分成“家庭”,其中一个家庭被定义为一组“倾向于相互同情”的系列。

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

我相信这里有比我更有经验/更聪明的人,所以我将不胜感激任何建议,关于使用什么算法/启发式来测量距离以及如何使用它来对时间序列进行聚类的想法。

我的猜测是,没有一种既定的稳健统计方法可以做到这一点,所以我很想看看人们如何处理/解决这个问题——像统计学家一样思考。

4个回答

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

上面的页面还包含对距离度量和聚类的引用。Keogh 和工作人员正在从事可重复的研究,并且非常乐于发布他们的代码。所以你可以给他们发邮件问问。我相信他们倾向于在 MATLAB/C++ 中工作。

最近有一个尝试生成 Java 和 R 实现:

我不知道它走了多远——它是为寻找主题而设计的,但是,根据他们已经走了多远,它应该有必要的部分,你需要把一些东西放在一起以满足你的需要(iSAX 和距离指标:因为这部分对于聚类和主题发现是常见的)。

“倾向于同情”的另一种说法是“协整的”。

有两种计算协整的标准方法:Engle-Granger 方法和 Johansen 过程。这些在“Analysis of Integrated and Cointegrated Time Series with R”(Pfaff 2008)和相关的 R urca 包中都有介绍。如果你想在 R 中使用这些方法,我强烈推荐这本书。

我还建议您查看有关多元时间序列的这个问题,特别是在Ruey Tsay 在 U. Chicago 的课程中​​,其中包括所有必要的 R 代码。

聚类时间序列由人口动力学家相当普遍地完成,特别是那些研究昆虫以了解爆发和崩溃趋势的人。寻找有关吉普赛蛾、云杉芽虫、山松甲虫和落叶松芽蛾的工作。

对于实际的聚类,您可以选择您喜欢的任何距离度量,相对于被聚类的数据类型,每个度量都有自己的优势和周转时间,Kaufmann 和 Rousseeuw 1990。在数据中查找组。聚类分析简介是一个很好的起点。请记住,聚类方法并不“关心”您使用的是时间序列,它只查看在同一时间点测量的值。如果您的两个时间序列在其生命周期内不够同步,则它们不会(也可能不应该)集群。

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

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