我有一个数据集(数组),需要找出其中的周期性。我该如何操作?有人说可以使用FFT,但我不确定它如何给我提供周期性信息。谢谢您的帮助!
对于这个任务,最好使用自相关。
FFT是寻找周期性的错误工具。
例如,考虑一个情况,您的波形由两个简单正弦波相加而成,一个周期为2秒(0.5 Hz),另一个周期为3秒(0.333 Hz)。这个波形将具有6秒的周期性(即2*3),但傅里叶谱仅显示0.5 Hz和0.333 Hz的两个峰值。
周期性是一个没有明确定义的术语。例如,以下数据:
1, 10, 1, 10, 1, 11, 1, 10, 1, 10, 1, 11, 1, 10, 1, 10, 1, 11
您可以将其视为具有不精确但强烈的2个周期性,并具有6个精确周期性。
对于精确周期性,您可以尝试将给定数据作为重复两次的数据的子字符串查找。
对于现实、嘈杂信号的非精确周期性,可以使用时间域和频率域方法。
时间域方法是自相关。它类似于上面的子字符串搜索:在数据具有最大自相似性的移位值上搜索。
对于简单的信号,计数阈值转换可能足够。
频率域方法包括使用FFT/FHT的方法:在频谱中搜索最大值,该最大值给出周期的1/T。
另一种方法是使用Cepstrum。
引用:Amariei, C., Tomita, M., & Murray, D. B. (2014). Quantifying periodicity in omics data. Frontiers in cell and developmental biology.
该算法已经实现在一个R包中,可以在oscillat.iab.keio.ac.jp上获得。我与作者无关,但已将代码放在GitHubhere以便更方便地获取(主要脚本here)。
使用DFT并将行分组为主要频谱功率,根据我的经验很好用。显然,对于基因组学而言,它被设计为强大的(在代码中注明它计算量较大),因此可能取决于应用程序。你可以使用FFT,因为它将把你的数据集从值空间转换到频率空间。
这意味着你最终会得到一组频率,这些频率组合起来会产生你想要分析的初始输入。然后,你可以轻松地识别由特定频率生成的主要贡献,因此你将了解有多少周期性以及哪些是最具影响力的。
在这里看看:http://local.wasp.uwa.edu.au/~pbourke/miscellaneous/dft/